Arduino
内置常量¶
-
引脚常量:
INPUT
将引脚设置为输入引脚OUTPUT
将引脚设置为输出引脚INPUT_PULLUP
将该引脚设置为内部上拉电阻
-
电压常量:
HIGH
高水平的电压,取决于硬件,在3.3V的板子上大于2V,在5V的板子上大于3VLOW
低水平的电压,同样取决于所使用的板子
-
数字常量:
M_PI
常数piM_E
常数eM_LN10
数字10的自然对数M_LN2
数字2的自然对数M_LOG10E
e的对数,以10为底M_LOG2E
e的对数,以2为底M_SQRT2
2的平方根NAN
NAN(不是一个数字)常数
-
逻辑常量:
true
false
-
LED_BUILTIN
: 13 A0
PIN_A0
: 14A1
PIN_A1
: 15A2
PIN_A2
: 16A3
PIN_A3
: 17A4
PIN_A4
: 18A5
PIN_A5
: 19A6
PIN_A6
: 20A7
PIN_A7
: 21
常用函数¶
数字I/O¶
pinMode(pin, mode)
设置一个引脚为输入或输出digitalWrite(pin, val)
给一个数字引脚写入HIGH
或LOW
digitalRead(pin)
从一个数字引脚读取数值,返回HIGH
或LOW
模拟I/O¶
analogRead(pin)
从一个模拟引脚读取数值。返回一个0-1023之间的整数,对应着0-5VanalogWrite(pin, val)
从一个引脚输出PWM模拟值。输入一个0-255之间的整数,对应着0-5V
串口操作¶
-
Serial.begin(baud)
开启串口并设置波特率 -
Serial.read()
读取串口缓存中的一个字符并删除 Serial.print(val)
orSerial.print(val, format)
- 写入字符串数据到串口
- 转换进制
Serial.print(78, BIN)
Serial.print(78, OCT)
Serial.print(78, DEC)
Serial.print(78, HEX)
- 四舍五入
Serial.print(1.23456, 4) ==> 1.2346
Serial.println(val)
orSerial.println(val, format)
- 写入字符串数据到串口并换行
- 写入字符串数据到串口并换行
时间函数¶
delay(ms)
暂定一段以毫秒为单位的时间delayMicroseconds(ms)
暂定一段以微秒为单位的时间millis()
返回程序开始运行时到现在的毫秒数micros()
返回程序开始运行时到现在的微秒数
硬件开发¶
Arduino Uno¶
数字端口
- 数字信号有高电平和低电平两种形态
- 输出高电平时,可提供40mA的5V电压
- 数字端口既可用作输入,又可用作输出
-
使用前需用
pinMode()
指定是输入还是输出 -
引脚13连接板载的LED指示灯
- 引脚3、5、6、9、10、11具有PWM功能
- 引脚0、1可用作RX和TX串口,进行串口通讯
模拟端口
- 模拟端口 A0~A5
默认为模拟输入
- 也可用作数字输入、输出端口 14~19
按键开关¶
- 下拉电阻接法:按键接电源,电阻接地,输入端从中引出
- 按键断开时,输入端读得低电平
- 按键接通时,输入端读得高电平
- 松开为低,按下为高
- 上拉电阻接法:按键接地,电阻接电源,输入端从中引出
- 按键断开时,输入端读得高电平
- 按键接通时,输入端读得低电平
- 松开为高,按下为低
PWM(脉冲宽度调制)¶
- Arduino通过在数字端口输出频繁切换的高低电平来产生模拟电平,其中产生的矩形波的高电平的持续时间称为脉冲宽度,其占一个周期的百分比称为占空比
- 输出模拟电压 = 占空比 × 电压幅度(5V)
蜂鸣器¶
- 有源蜂鸣器内部带震荡源,加上合适的直流电源就会鸣叫。向相应数字接口输出高低电平即可控制其鸣停
-
无源蜂鸣器内部不带震荡源,只加直流电源无法令其鸣叫,须用音频信号驱动才能鸣叫
-
tone(pin, frequency, duration=0)
在一个引脚上产生一个方波(50%占空比)duration
:表示持续时间,以毫秒为单位
noTone(pin)
在一个引脚上停止由tone()
产生的波
74595 接口扩展¶
- 74595 是一个 8 位串行输入、串行或并行输出,并且带有存储寄存器和三态输出(高电平、低电平和高阻)的移位寄存器
- 数据在移位寄存器时钟(SHCP)的正跳变下移动,在存储寄存器时钟(STCP)的正跳变下由移位寄存器转存到存储寄存器。
- 移位寄存器有一个串行输入端(DS),还有一个用于级联的串行输出端(Q7S),并且可以异步复位(MR,低有效)
- 存储寄存器有8个三态并行输出端(Q0 ~ Q7)。当输出使能端(OE)被使能(低有效)时,数据将从存储寄存器输出至器件引脚
- 使用 74595, Arduino只需3个端口(DS、SHCP、STCP),就可以控制8位输出
- 74595左上角为1号脚,逆时针引脚号递增
编号 | 符号 | 引脚说明 |
---|---|---|
1-7 | Q1-Q7 | 数据并行输出1-7 |
8 | GND | 接地 |
9 | Q7S | 数据串行输出 |
10 | MR | 复位(低有效) |
11 | SHCP | 移位寄存器时钟(输入) |
12 | STCP | 存储寄存器时钟(输入) |
13 | OE | 输出使能(低有效) |
14 | DS | 数据串行输入 |
15 | Q0 | 数据并行输出0 |
16 | Vcc | 电源 |
shiftOut(dataPin, clockPin, bitOrder, val)
将一个字节的数据通过移位方式逐位输出- 在输出数据时,当一位数据写入数据输出引脚时,时钟引脚将输出脉冲信号,指示该位数据已被写入数据输出引脚等待读取
dataPin
数据引脚,一般接到DS,引脚模式需要设置为输出clockPin
时钟引脚,一般接到SHCP,引脚模式需要设置为输出bitOrder
移位顺序,MSBFIRST
为高位先出,LSBFIRST
为低位先出
val = shiftIn(dataPin, clockPin, bitOrder)
将一个字节的数据通过移位方式逐位输入
digitalWrite(latchPin, LOW) //在ST_CP口上加低电平,让芯片准备好接收数据
shiftOut(dataPin, clockPin, MSBFIRST, val)
digitalWrite(latchPin, HIGH) //将ST_CP口恢复高电平,触发并行输出
8x8 点阵¶
编号 | 符号 | 编号 | 符号 |
---|---|---|---|
1 | R5 | 9 | R1 |
2 | R7 | 10 | C4 |
3 | C2 | 11 | C6 |
4 | C3 | 12 | R4 |
5 | R8 | 13 | C1 |
6 | C5 | 14 | R2 |
7 | R6 | 15 | C7 |
8 | R3 | 16 | C8 |
符号 | 编号 | 符号 | 编号 |
---|---|---|---|
R1 | 9 | C1 | 13 |
R2 | 14 | C2 | 3 |
R3 | 8 | C3 | 4 |
R4 | 12 | C4 | 10 |
R5 | 1 | C5 | 6 |
R6 | 7 | C6 | 11 |
R7 | 2 | C7 | 15 |
R8 | 5 | C8 | 16 |
- 共阳:88B,行控制阳极。行接高、列接低,可点亮相应LED
- 共阴:88A,行控制阴极。行接低、列接高,可点亮相应LED
- 左起为1号脚,逆时针引脚号递增
- 使用时需串联限流电阻
数码管¶
- 共阳:特征丝印为B
- 8个LED的阳极接一起形成公共阳极(COM),使用时COM端接+5V
- 当某一字段 LED 的阴极为低时就亮,为高或悬空时不亮。
- 共阴:特征丝印为A
- 8个LED的阴极接一起形成公共阴极(COM),使用时COM端接地
- 当某一字段 LED 的阳极为高时就亮,为低或悬空时不亮。
- 最上方开始,逆时针接引脚a、b、c、d、e、f,中间接引脚g,右下角接引脚h
- 驱动数码管的限流电阻有两种接法:
- 在 COM 端接。这种接法电阻较少,但每一位显示不同数字时的亮度不一样
- 在 8 个笔段引脚上接。这种接法亮度显示均匀,但是电阻较多
四位数码管¶
- 内含32个LED,共12引脚。
- 左下角为1号脚,后续逆时针增加,依次为e、d、h、c、g、4、b、3、2、f、a、1
- 驱动数码管的限流电阻有两种接法:
- 在 COM 端接。这种接法电阻较少,但每一位显示不同数字时的亮度不一样
- 在 8 个笔段引脚上接。这种接法亮度显示均匀,但是电阻较多
LCD 1602¶
- LCD 1602 总共可以显示2行,每行16个字符。
- 1602 工作电压为4.5~5.5V,工作电流为2.0mA(5.0V)
- 1602 数据传送的两种模式:8bit、4bit
- 8bit 模式传送速度快(字符 ASCII 码由 8 位二进制组成)
- 4bit 模式需要的数据引脚少一半,只需后四个引脚 D4~D7
-
不管哪种模式控制引脚都有3个:RS、RW、Enable
-
读状态:输入RS=L,RW=H,E=H,输出D0~D7=状态字
- 写指令:输入RS=L,RW=L,D0~D7=指令码,E=高脉冲,输出无
- 读数据:输入RS=H,RW=H,E=H,输出D0~D7=数据
- 写数据:输入RS=H,RW=L,D0~D7=数据,E=高脉冲,输出无
编号 | 符号 | 引脚说明 |
---|---|---|
1 | VSS | 电源地,一般均用5V供电 |
2 | VDD | 电源正极,一般均用5V供电 |
3 | VL | 液晶显示偏压信号,可串联5KΩ接地的电位器调节对比度 |
4 | RS | 数据/命令选择端(V/L),高时数据操作,低时命令操作 |
5 | R/W | 读写选择端(H/L),高时读操作,低时写操作 |
6 | E | 使能端,负跳变时,液晶模块执行命令 |
7-14 | D0-7 | Data I/O,8 位双向并行总线,传送命令和数据 |
15 | BLA | 背光源正极 |
16 | BLK | 背光源负极 |
#include <LiquidCrystal.h>
LiquidCrystal()
定义LCD接口,即各引脚连接的I/O口编号。LiquidCrystal lcd(rs, enable, d4, d5, d6, d7)
LiquidCrystal lcd(rs, rw, enable, d4, d5, d6, d7)
LiquidCrystal lcd(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7)
LiquidCrystal lcd(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
lcd.begin(cols, rows)
定义长宽lcd.clear()
清空LCDlcd.home()
光标回左上角lcd.setCursor(col, row)
移动光标到指定位置,从1开始编号lcd.write(data)
屏显内容(变量)lcd.print(data[, BASE])
屏显内容(字母、字符串等)lcd.cursor()
显示光标(下划线)lcd.noCursor()
隐藏光标lcd.blink()
闪烁光标lcd.noBlink()
光标停止闪烁lcd.display()
关闭显示后打开显示,恢复原内容lcd.noDisplay()
关闭显示,不丢失内容lcd.scrollDisplayLeft()
显示内容左滚一格lcd.scrollDisplayRight()
显示内容右滚一格lcd.autoscroll()
打开自动滚动lcd.noAutoscroll()
关闭自动滚动lcd.leftToRight()
从左往右显示(默认)lcd.rightToLeft()
从右往左显示
舵机(伺服电机)¶
- 舵机转动角度是通过调节 PWM 信号占空比实现的
- 舵机内部电路产生的 PWM 信号周期固定为20ms,基准信号脉冲宽度为1.5ms,控制信号脉宽在 1ms 到 2ms 之间。不同品牌舵机对同一信号转动角度可能不同
- 舵机三根接线,分为接地、接电源和接信号,通常有以下两种:
- 棕色接地、红色接电源、橙色接信号
- 黑色接地、红色接电源、黄色接信号
-
控制舵机有两种方法:
- 通过普通数字口产生不同占空比的方波,模拟 PWM 信号进行舵机定位
- 利用 Arduino 自带的 Servo 函数控制。UNO 只能利用9口和10口控制2路舵机
-
#include <Servo.h>
Servo myservo
定义舵机变量名myservo.attach(pin)
设定舵机接口,仅数字9或10口可用myservo.write(angle)
设定舵机旋转角度,0°到180°myservo.read()
读取舵机角度myservo.attached()
判断舵机参数是否已发送到舵机所在接口myservo.detach()
使舵机与其接口分离,使该接口可继续被用作 PWM 接口
步进电机¶
- 四相步进电机,单电源直流供电
- 定子四相绕组:A、B、C、D
- 转子三对齿:03、14、25
- 对各相绕组按合适时序通电,就能使电机步进转动
- 开始时,开关 SB 闭合,SA、SC、SD 断开,则转子 03 号齿与 B 相磁极对齐,而 14号齿与 C、D 相磁极错齿,25号齿与 D、A 相磁极错齿。
- 接着 SC 闭合,SB、SA、SD 断开,磁场使 14 号齿与 C 相磁极对齐,而 03 号齿与 A、B 相磁极错齿,25 号齿与A、D 相磁极错齿。转子转过 15°
-
以此类推,A、B、C、D 四相绕组轮流供电,则转子会沿着一定方向转动
-
#include <Stepper.h>
Stepper stepper(steps, pin1, pin2, pin3, pin4)
设置步进电机的步数和引脚stepper.setSpeed(rpms)
设置电机的转速,参数为每分钟电机转动的步数stepper.step(steps)
使电机转过固定的步数,当电机转过指定步数之后才会执行下一条语句
红外遥控¶
- 红外遥控系统由调制、发射、接收和解调等部分组成
- 红外遥控器先将一串二进制脉冲码调制在特定的载波频率上,然后再经红外发射二极管发射出去
-
红外线接收装置接收该特定载波频率的信号,并将其解调为二进制脉冲码
-
本实验遥控器的编码方式为 NEC 协议,其特点为:
- 8位地址位,8位命令位
- 为了可靠性,地址位和命令位被传输两次
- 载波频率为38kHz
- 每一位的时间为 1.125ms 或 2.25ms
- 逻辑1由560us的高电平和1.69ms的低电平组成
- 逻辑0由560us的高电平和565us的低电平组成
- 按键按下立刻松开的发射脉冲:
- 9ms的AGC高电平开头,然后是地址、命令
- 地址和命令都传送 2 次,第二次的地址和命令是反码,用来校验信息
-
按键按下一段时间才松开的发射脉冲:
- 发送一次命令
- 之后每110ms传输一次重复码,重复码由9ms高电平、2.25ms低电平、560us高电平组成,直到按键释放
-
#include <IRremote.h>
IRrecv irrecv(pin)
初始化引脚为红外接收状态decode_results results
定义用于存储编码结果的对象irrecv.decode(&results)
判断是否接收到正确的红外信号,如果接收到,将红外信号进行解码,结果返回给resultsirrecv.resume()
清除红外传感器解码状态,准备接收下一个编码
超声波测距¶
- HC-SR04 超声波测距模块可提供2cm-400cm的非接触式距离感测,测距精度达3mm,包括超声波发射器、接收器与控制电路
- 先给超声波模块脉冲触发脚(trig)一个10us以上的高电平
- 触发后,模块自动发射8个40kHz的脉冲,与此同时回波检测脚(echo)电平由0变为1,启动定时器;
-
如果有信号返回被模块接收到,echo电平由1变为0,同时停止定时,定时器记下的时间即为超声波由发射到返回的总时长
-
pulseIn(pin, state, timeout=1000000L)
测量一个脉冲信号的宽度,该脉冲信号可以是HIGH或LOW- 返回持续的微秒数,如果在超时时间内没有读到脉冲信号的话, 将返回0
- 可检测的脉冲间隔时间范围是10微秒到3分钟
继电器¶
- 继电器是一种当输入量达到一定值时,输出量会发生跳变的自动控制器件。在需要用弱电控制强电,或小电流控制大电流的情况下,就要用到继电器
- 找出线圈引脚:用万用表测各引脚间电阻,线圈阻值在数百至 1k 欧左右
- 找出常开、常闭点:
- 万用表测线圈外四个引脚,导通的两个引脚是常闭或短接关系;
- 给线圈加5V直流电,使继电器动作,若断开则是常闭关系,若没有断开则是短接关系
- 给线圈加5V直流电,使继电器动作,若原来不通的两个引脚导通了,则是常开关系
- 既与常开点有关系,又与常闭点有关系的引脚就是公共端
- 需要并联保护二极管,防止线圈断电时的反向电动势击穿前级控制电路