跳转至

Arduino

内置常量

  • 引脚常量:

    • INPUT 将引脚设置为输入引脚
    • OUTPUT 将引脚设置为输出引脚
    • INPUT_PULLUP 将该引脚设置为内部上拉电阻
  • 电压常量:

    • HIGH 高水平的电压,取决于硬件,在3.3V的板子上大于2V,在5V的板子上大于3V
    • LOW 低水平的电压,同样取决于所使用的板子
  • 数字常量:

    • M_PI 常数pi
    • M_E 常数e
    • M_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 : 14
  • A1 PIN_A1 : 15
  • A2 PIN_A2 : 16
  • A3 PIN_A3 : 17
  • A4 PIN_A4 : 18
  • A5 PIN_A5 : 19
  • A6 PIN_A6 : 20
  • A7 PIN_A7 : 21

常用函数

数字I/O

  • pinMode(pin, mode) 设置一个引脚为输入或输出
  • digitalWrite(pin, val) 给一个数字引脚写入 HIGHLOW
  • digitalRead(pin) 从一个数字引脚读取数值,返回 HIGHLOW

模拟I/O

  • analogRead(pin) 从一个模拟引脚读取数值。返回一个0-1023之间的整数,对应着0-5V
  • analogWrite(pin, val) 从一个引脚输出PWM模拟值。输入一个0-255之间的整数,对应着0-5V

串口操作

  • Serial.begin(baud) 开启串口并设置波特率

  • Serial.read() 读取串口缓存中的一个字符并删除

  • Serial.print(val) or Serial.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) or Serial.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() 清空LCD
  • lcd.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) 判断是否接收到正确的红外信号,如果接收到,将红外信号进行解码,结果返回给results
  • irrecv.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直流电,使继电器动作,若原来不通的两个引脚导通了,则是常开关系
    • 既与常开点有关系,又与常闭点有关系的引脚就是公共端
  • 需要并联保护二极管,防止线圈断电时的反向电动势击穿前级控制电路