嵌入式 Arduino 期末复习
1 基础知识
1.1 概述
对嵌入式的定义
- 国内定义:以应用为中心,以计算机技术为基础,软件硬件可裁剪,且适应系统对功能,可靠性,成本,体积,功耗严格要求的专用计算机系统。
- IEEE定义:用于控制,监视或者辅助操作机器和设备的装置。
分类
以下按照形态差异分类:
类名 | 板型号 |
---|---|
芯片级 | MCU,SoC |
板级 | 单片机,模块 |
设备级 | 工控机 |
其中,单片机又分为:
- 不含操作系统(我们学习的arduino不包含操作系统)
- 含操作系统
组成
嵌入式系统四大组成部分:
- 微处理器
核心部件,微处理器强弱直接影响嵌入式设备的复杂度和范围。 - 存储器
对速度和功耗要求高 - 输入/输出设备(I/O)
①人机交互②传感器设备③输入设备 - 通信和扩展接口
嵌入式系统与其他系统进行数据交换和扩展。
1.2 常用元件
名称 | 相关单位 | 作用 | 分类 |
---|---|---|---|
电阻器(Resistor) | 欧姆 Ω(R) /误差/额定功率等 欧姆定律:I=U/R | 限流,分压电路 | 可调电阻器,热敏电阻器,光敏电阻器,压敏电阻器 |
电容器(Capacitor) | 法拉 F(C) (电荷量和电压比值) | 储能元件,充放电特性和阻止直流电流,允许交流电 | 滤波电容器,积分电容器,微分电容器 |
电感器(Inductor) | 亨利 H(L)\(X_L(感抗)=2\pi f(交流电频率)L\) | 对突变电流有阻碍作用 。滤波,震荡,延迟, | 筛选信号,过滤噪声,稳定电流,抑制电磁波干扰 |
二极管(Diode) | 1V 10mA 标记为D | ①正向导通,逆向截止 ②整流,稳压,恒流,开关,发光,光电转换等电路中 | 发光二极管(LED):长脚阴极短脚阳极。一般工作电压在1V,导电电流在10mA,所以需要一个电阻分压限流\(R=(E-U_E)/I_F\) |
(半导体)晶体管 | 标记为Q | 把微弱的电信号放大成幅度值较大的电信号(用作无触点开关) | ①NPN型:基极B和发射极E之间施加正向电压,发射极和集电极导通②PNP型:基级和发射极施加反向电压,晶体管导通 |
万用表 | V,A,Ω,β(半导体参数),F | 测量直流电流,电压,交流电流,电压,电阻,还可以测量电容量,电感量,半导体参数 | 数字万用表分为四个测量插孔和红黑表笔各一个 |
杜邦线 | null | 扩展实验板引脚,增加实验项目,无焊接进行电路实验 | 杜邦线有两头,有插针插孔两类,可以两头都是,也可一个一半 |
面包板 | null | 电路的组装,调试和训练 | 一般五个一组,分配在同一金属片中 |
Arduino扩展板 | null | 简化电路搭建过程,快速搭建项目 | 多种,不列举 |
模块 | null | 无需了解模块原理,只需按照要求连接,即可快速制作硬件 | 对于一些简单的模块只有三个信号线:①V/VCC电源②G/GND地线③S信号引脚。例如UART蓝牙模块等 |
2 Arduino软硬件开发基础
2.1 开发板
2.1.1 Arduino UNO简介
如图所示为一个Arduino UNO板
拥有:
- 14个输入输出引脚(0~13),其中(3,5,6,9,10,11)可以作为PWM输出
- 6个模拟输入(A0~A5)
- 1个UART硬件串口
- 1个电源插孔,1个ICSP插座和1个复位按钮
- 1个USB接口,与计算机连接,可以供电和通信
引脚名称和功能
电源引脚
名称 | 作用 |
---|---|
VIN | ①外部电流供电时的输入电压引脚 ②电源插座供电时提供5V电压 |
5V | 输出5V电压 使用该引脚和3.3V引脚可能损坏旁路线性稳压器 |
3V | 输出3.3V电压 |
GND | 接地 |
AREF | 模拟输入的参考电压 |
RESET | 扩展一个按钮实现复位功能。引脚为低电平 |
输入输出
名称 | 引脚位 | 作用 |
---|---|---|
串口 | 0(RX),1(TX) | 接收(RX)和发送(TX)TTL串行数据。 |
外部中断 | 2,3 | 触发中断的引脚。触发条件分为:①低电平触发 ②上升沿触发 ③下降沿触发 ④发生变化触发 |
PWM | 3,5,6,9,10,11(~线) | 6路八位PWM |
SPI | 10(SS),11(MOSI),12(MISO),13(SCK) | 支持SPI通信 |
LED | 13 | 高电平LED亮,低电平LED灭 |
TWI | A4/SDA,A5/SCL | TWI通信 |
3 Arduino编程
3.1 函数
时间函数
函数 | 参数 | 用法 | 备注 |
---|---|---|---|
delay(ms) | ms为unsigned long | 延长ms毫秒 | delay更多用于较短延时,但是有以下缺点:①延时中无法读取传感器的值等,阻止了大部分操作 |
delayMicroseconds(μs) | μs为 unsigned int | 延长微秒 | 更长时间用delay |
micros() | time=micros() | 返回以微秒为单位的运行时间(unsigned long) | 计时周期为70min,对于UNO(晶体振荡器为16MHz),返回值为4μs的倍数 |
millis() | time=millis() | 返回毫秒运行时间(unsigned long) | 计时周期为50天 |
数学函数
函数 | 参数 | 用法 |
---|---|---|
abs(x) | x为int家族 | 绝对值 |
constrain(x,a,b) | x归一化数据,a下限,b上限 任意数据类型 | 对于x,小于a返回a,小于b返回b ,中间返回x |
map(x,fromLow,fromHigh,toLow,toHigh) | 只能用于整数 (映射数,现在下限,现在上限,映射后下限,映射后上限) | 将整数从一个范围映射到另外一个范围,与上着规则基本一致 |
max(x,y) | 任意类型 | 返回两个数较大者(可用作限制下限) |
min(x,y) | 同上 | 返回最小(控制上限) |
pow(base,exponent) | float | 幂的运算 |
sqrt(X) | 任意 | 求平方根 |
sq() | 任意实数 | 求平方 |
cos/sin/tan() | 弧度角 | 角余弦值/正弦值/正切 |
字符函数
十三个,较简单,看懂英语也能知其用法:
- isAlpha 是否为字母
- isAlphaNumeric 是否为字母或数字
- isAscii 是否为ASCII码
- isControl 是否为控制符
- isDigit 是否为数字
- isGraph 一个非空字符是否可输出/可打印
- isHexadecimalDigit 是否为16进制数
- isLowerCase 是否为小写字母
- isPrintable 任意字符是否可输出打印
- isPunct 是否为标点符号
- isSpace 是否为空格符
- isUpperCase 是否大写
- isWhitespace 是否为" ","\f","\n","\r","\t","\v"的任意一种
以上都是若条件成立返回真否则为假
随机函数
random(min,max)
- min 下限
- max 可选 上限
返回[min,max-1]之间的随机数(long)
每次执行程序结果相同,如需不同需要以下方法
randomSeed(seed)
- seed 种子值
这两者都是伪随机,可以逆向分析
位和字节函数
函数 | 参数 | 作用 |
---|---|---|
bit(n) | n为指定位 | 返回位的权值(bit 0是1,1是2,2是4) |
bitClear(x,n) | x 数字变量,n 要读取的位 | 返回指定位的值 |
bitSet(x,n) | x 数字变量 n 指定置1的位 | 某一位置0 |
bitRead(x,n) | x 变量 n 指定读取位 | 读取指定位的值 |
bitWrite(x,n,b) | x 变量 ,n 要赋值的位,b要赋的值 | 给变量指定位赋值 |
highByte/lowByte(x) | x | |
变量 | 提取一个字高字节/低字节 |
3.2 常量表示
进制前缀
- 十进制:无
- 二进制 前缀B
- 八进制 前缀 0
- 十六进制 前缀0x
3.3 程序结构
一个Arduino程序分为两个函数
-
setup()
程序开始运行时调用该函数,可用于变量初始化等等,只会运行一次 -
loop()
执行完setup会执行看、loop,loop语句始终按照顺序循环执行。
3.4 位运算
- &按位与
0 0 1 1
0 1 0 1
--------&
0 0 0 1
- |按位或
0 0 1 1
0 1 0 1
---------|
0 1 1 1
-
~ 按位取反
-
^按位异或
0 0 1 1
0 1 0 1
---------^
0 1 1 0
-
<< 左移
操作符左移 -
>>右移
4 第四章
4.1 数字接口
- 数字引脚
- 模拟引脚
- 通信引脚
- 外部中断引脚
- 电源引脚
- 。。。
I/O接口封装函数
基本封装函数有三个
函数 | 参数 | 作用 |
---|---|---|
digitalRead(pin) | 读取的引脚编号pin | 读取引脚状态 |
digitalWrite(pin,value) | pin同上,value:HIGH/LOW(高引脚低引脚) | HIGH为5Vor3.3V,LOW为0V 设置引脚的高低电平 |
pinMode(pin,mode) | mode有INPUT,OUTPUT,INPUT_PULLUP | 指定引脚输出模式 |
-
设置引脚 为输出(OUTPUT)模式,此时引脚为低阻抗状态,可以向其他电路原件提供电流(通常为40mA以内)
-
设置引脚为输入(INPUT)模式,,此时引脚为高阻抗状态,此时该引脚可用于读取信号。
-
设置引脚为输入上拉(INPUT_PULLUP)模式.首先Arduino内部自带上拉电阻。当我们需要使用该内部上拉电阻,可以通过pinMode()将引脚设置为输入上拉(INPUT_PULLUP)模式
4.2 模拟接口的应用
在Arduino中有A0~A5,6个模拟接口,可以通过A/D转换器(10个),将0V~5V的电压转换为0~1023的值。
在板子上有~的接口,可以实现D/A转换。
模拟接口三个封装函数
函数 | 参数 | 作用 |
---|---|---|
analogRead(pin) | 0~5的接口 | 模拟读,返回一个转换值(0~1023) |
analogReference(type) | 选项:①DEFAULT:默认5V/3.3V电压 ②INTERNAL:片内参考电压,1.1V/2.56V ③INTERNAL1V1:片内1.1V参考电压 ④INTERNAL2V56 ⑤EXTERNAL:通过AREF引脚获取电压 | 配置模拟引脚的参考电压 |
analogWrite(pin,value) | value:0~255之间int型。 | 设置引脚输出模拟量,用于改变灯亮度或者电机转速等。 |
注意:
- 针脚悬空时,analogRead()返回值受到环境的多重影响。
- AREF引脚若电压在0~5V范围外,在调用analogRead()前必须设置EXTERNAL
- 调用analogWrite()之前,不需要调用pinMode()函数设置该引脚为输出,analogWrite()和read()没有关系
4.3 串行接口的应用
在Arduino上至少有一个串口(UART/USART),通过RX(0)和TX(1)和计算机USB进行串口通信。
串口通信指:将接收的来自CPU的并行数据转换为连续的串行数据流发送出去,或将接收的串行数据转换为并行数据转发给CPU。
串口的库函数
列举几个在实验中比较常见的函数
-
if(Serial) 串口是否准备好
-
available() 读取串口收到的字节数
Serial.available()
-
begin() 设置串行通信波特率
begin(speed,config)
speed 设置波特率
config 设置数据位数.默认是,8数据位,无奇偶位,1个停止位。
Serial.begin(19200)
-
end(结束通信) RX,TX可以作为普通引脚使用
-
find()/findUntil() 从串口缓冲区读取已知长度的目标数据/读取到结束串停止
-
print() 将数据发送到串口显示,一个数字按照一个ASCII字符显示。
print(val,format)
format指定数据显示几位
相似函数还有println,加一个换行符 -
read() 读字符
还有readBytes/readBytesUntil/readString/热爱的StringUntil -
setTimeout() 设置串口超时时间,默认1000ms
-
write()写二进制数据到串口
-
serialEvent()串口数据准备好时触发的事件函数
4.4 I2C总线接口(半双工)
内部集成电路(Inter-Integrated Circuit ,I2C),是具有多主机系统所需的包括总线仲裁和高低速器件同步功能的高性能总线。
两根信号线:数据线SDA,和时钟线SCL。
I2C类库函数
-
begin(address)
初始化wire库,将I2C设备作为主设备或从设备加入I2C总线,只调用一次。默认为主设备 -
beginTransmission(address)
启动一个已知地址的I2C从设备的通信 -
write()
写数据到设备 -
endTransmission()
结束一个begintransmission()。所以一次数据的传输,需要三个函数连续使用。
热门相关:你是我的难得情深 新婚夜,大佬调戏娇妻上瘾了 完美隐婚 龙组兵王 富二代修仙日常