第3章 Arduino 3.1 Arduino简介 Arduino是一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的 Arduino开发板)和软件(Arduino IDE)两部分。 硬件部分指可以用于电路连接的 Arduino开发板,通过连接各种各样的传感器来感知环境,控制灯光、马达等输出设备来反馈、影响环境,进而实现人机交互。Arduino开发板型号很多,常用的有 Arduino Uno、ArduinoNano、ArduinoLeonardo(如图3-1)、Arduino Mega2560等。以 Arduino Leonardo为例,常用的引脚有数字引脚(取值范围是0~13)、模拟引脚(A0~A5)、GND、5V。 在实际使用中通常需要用到扩展板,它是最常用的 Arduino外围硬件之一,主要用于连接其他传感器,可以节约连接线和其他模块,如图 3-2所示。在面包板上接插元件固然方便,但还需要一定的电子知识来搭建各种电路及转接,而使用扩展板只需要通过连接线,把各种模块接插到扩展板上即可,从而快速地搭建出新的项目。 软件部分则是计算机中的程序开发环境——Arduino IDE,如图 3-3所示。用户在 IDE中编写程序代码,编译成二进制文件,上传到 Arduino开发板执行程序。 3.1.1程序示例 本节以 Arduino Leonardo开发板的具体使用过程为例,介绍 Arduino软硬件的操作过程。首先,在官方网站(https://www.arduino.cc/)下载并安装 Arduino的集成开发环境(Integrated Development Environment,IDE)。 为了测试 ArduinoLeonardo电路板是否正常工作,加载一个最简单的代码(例如 Blink),同时,通过简单的操作熟悉如何将程序上传到开发板中运行。在 Arduino IDE中选择“文件”→“示 例”→ 01.Basics → Blink命令,如图 3-4所示,打开 Blink代码(案例3-1)。 ArduinoLeonardo电路板上有标有 L的 LED灯,这段测试代码就是让这个 LED灯 闪烁。 void setup() { pinMode(LED_BUILTIN,OUTPUT); } void loop() { digitalWrite(LED_BUILTIN,HIGH); // LED灯亮(HIGH表示高电平) delay(1000); // 等待 1000ms digitalWrite(LED_BUILTIN,LOW); // LED灯灭(LOW表示低电平) delay(1000); // 等待 1000ms } Arduino代码包括两个核心函数 void setup( )和void loop( )。void setup( )是程序的初始化函数,只执行一次。voidloop( )是程序主体,反复执行。pinMode(pin,mode)函数用于配置引脚为输入或者输出模式,是一个无返回值的函数。pinMode( )函数有两个参数 pin和mode,pin表示要配置的引脚代号,mode表示设置的模式(INPUT输入模式和 OUTPUT输出模式),其中 INPUT用于读取信号,OUTPUT用于输出控制信号。digitalWrite(pin,value) 函数用于设置引脚的输出电压为高电平或低电平,也是一个无返回值的函数。digitalWrite()函数有两个参数 pin和value,pin表示引脚,value表示输出的电平:HIGH(高电平)或LOW(低电平)。delay(ms)是延迟时间函数,参数 ms是整数,表示时间(以毫秒为单位)。因此,该程序实现“点亮→等待一秒→熄灭→等待一秒”,如此反复,实现闪烁的效果。 写完一段代码后需要验证一下代码有无错误。单击“验证” ,如图 3-5所示, 界面下方显示“编译完成”,标识代码无误。以后写代码的过程中,输入完代码,都需要校验一下,然后再上传到 Arduino开发板中。 在将程序上传到 Arduino开发板之前,还要查验 Arduino开发板型号以及相应的串口。选择“工具”→“开发板”→ ArduinoLeonardo命令,如图 3-6所示,设置开发板型号。 然后设置串口,选择“工具”→“端口”→COM3(Arduino Leonardo)命令,如图 3-7所示。注意:每台计算机设备管理器显示的串口不同。 最后,单击“上传”按钮,如图 3-8所示,界面下方显示“上传成功”,表示程序已经上传到 Arduino开发板中。 程序上传完毕后就可以看到程序运行的效果:ArduinoLeonardo板上标有 L的LED灯在闪烁,如图 3-9所示。 3.1.2串口监视器 串口监视器是开发环境 IDE中的重要功能,可以监控串行接口(简称串口)的通信状况,是能看到程序具体执行情况的输出窗口。Arduino开发板与计算机的通信方式就是串行通信,在 Windows中,串口称为 COM,并以COM1、COM2等编号标识不同的串口。如果想让 Arduino开发板回传数据,则需要在编写程序的时候添加相关的代码指令,这就是串口监视器的指令。 在 Arduino IDE中,选择“工具”→“串口监视器”命令 ,打开串口监视器,如图 3-10所示。 在案例 3-1代码的基础上,修改代码让串口控制灯亮(案例 3-2),在串口监视器中输入字符 1点亮 LED灯,输入字符 0熄灭 LED灯。setup( )函数中增加串口初始化代码 Serial.begin(9600),同时在串口监视器的右下角要选择波特率 9600b/s(串口监视器中默认选项为波特率 9600b/s)。在串口监视器的输入框中输入字符1,单击“发送”按钮,可以将输入框内输入的数据送到 Arduino的串口。Arduino的串口通过 Serial.read( )函数读取数据,读到字符 1点亮 LED灯,读到字符 0熄灭LED灯。 void setup() { pinMode(LED_BUILTIN,OUTPUT); Serial.begin(9600); } void loop() { if (Serial.available()>0) { char ch=Serial.read(); if (ch=='1') digitalWrite(LED_BUILTIN,HIGH); else if (ch=='0') digitalWrite(LED_BUILTIN,LOW); } } 在案例 3-2代码的基础上,修改代 码让串口具备程序调试功能(案例3-3)。通过 Serial.println( )函数从串行端口输出数据,跟随一个回车。在串口监视器中输入字符 1点亮 LED灯,同时串口监视器的中心显示区域输出 LED灯的状态;输入字符 0熄灭 LED灯,同时串口监视器的显示区域输出“Helloworld!”,如图 3-11所示。 void setup() { pinMode(LED_BUILTIN,OUTPUT); Serial.begin(9600); } void loop() { if (Serial.available()>0) { char ch=Serial.read(); if (ch=='1') { digitalWrite(13,HIGH); Serial.println(digitalRead(LED_BUILTIN)); } else if (ch=='0') { digitalWrite(LED_BUILTIN,LOW); Serial.println("Hello world!"); } } } 3.1.3 面包板 面包板是一种搭建电路的电子元件。因为早期制作电路时,人们会用到家中做面包的板子,并在板子上连接导线等,面包板因此得名。面包板是制作临时电路和测试原型的常见元件,其上有很多小插孔,各种电子元器件可根据需要随意插拔,节省电路的组装时间,而且元件可以重复使用,非常适合电子电路的组装、调试和训练,能同时容纳最简单和最复杂的电路,因而被广泛使用。面包板使用热固性酚醛树脂制造,板底有金属条,使用前应确定哪些元件的引脚需要连在一起,再将要连接在一起的引脚插入同一组的 5个小孔中。 面包板有各种规格,如 170孔(35mm×47mm),400孔(85mm×55mm),800孔(165mm×55mm)等。每块面包板的四边都有凸起和凹槽,同一大小规格的面包板可以进行拼接使可用空间变大。如图 3-12所示,面包板的上下两侧分别有两列插孔,一般是作为电源引入的通路。上方第一行标有“+”的一列有 5组插孔,每组 5个(内部 5个孔连通),均为正极。上方第二行标有“-”的一列有 5组插孔,每组 5个(内部 5个孔连通),均为接地。面包板下方第一行与第二行结构同上。如需用到整个面包板,通常将“+”与“+”用导线连接起来,“-”与“-”用导线连接起来。 连接孔分为上下两部分,用来插接原件和跳线,是主工作区。同一列中的 5个插孔(即 a-b-c-d-e,f-g-h-i-j)是互相连通的;列和列(即 1~30)之间以及凹槽上下部分(即 e和 f)是不连通的。在面包板的中间有一个长长的凹槽,说明上下两部分是断开的,中间的距离可以插入标准窄体的芯片,同时方便用镊子伸到集成电路下面取出集成电路。 使用面包板时有以下注意事项: (1)必须修理整齐多次使用过的集成电路的引脚;采用边安装边调试的方法。 (2)连线要求紧贴在面包板上,以免因碰撞弹出面包板,造成接触不良。 (3)在布线过程中,要求把各元器件放置在面包板上的相应位置以及将所用的引脚号标在电路图上,保证调试和查找故障的顺利进行。 (4)避免集成电路的粗暴插拔,以免引脚折在插孔内;不要将金属线折断在插孔内。 使用 LED灯、电阻、电源和导线,在面包板上制作一个简易小型串联电路,将 3个 LED灯和 3个电阻与电源串联起来,如图 3-13所示。 使用 LED灯、电阻、电源和导线,在面包板上制作一个简易小型并联电路,将 1个电阻与电源串联,然后与 3个 LED灯串联起来,如图 3-14所示。 将 Arduino与面包板结合可以拓展 Arduino的连接能力,快速搭建更复杂的电路结构,以便复杂程序的实现,案例 3-4通过在面包板上搭建并联电路并与Arduino的 PIN口连接,进行了多个 LED灯闪烁控制的实验,连线如图 3-15所示。 void setup() { for(int i=8;i<11;i++) //设置 8~10号引脚为输出状态 pinMode(i,OUTPUT); } void loop() { for(int i=8;i<11;i++){ //依次让每个引脚的 LED灯点亮并持续 1s digitalWrite(i,HIGH); delay(1000); } for(int i=10;i>7;i--){ //倒序熄灭每个引脚的 LED灯 digitalWrite(i,LOW); delay(1000); } } 3.2 传感器 3.2.1 概述 Arduino可以连接丰富的传感器,用来感知环境和接收用户的交互行为,实现“人 -机 -环境”的交互。将常用的感知环境的传感器汇总,如图 3-16所示,有感知环境光的传感器,如光敏传感器、光线传感器、灰度传感器、颜色传感器、IIC颜色传感器;感知环境声音的传感器,如声音传感器;感知环境温湿度的传感器,如温湿度传感器、线性温度传感器、土壤湿度传感器;感知水情况的传感器,如水位传感器、水流量传感器、水温传感器、雨水传感器、水蒸气传感器;感知特殊环境的传感器,如火焰传感器、酒精传感器、气体烟雾传感器、PM2.5传感器。传感器的输出类型和感应范围如表 3-1所示。 (1)光敏传感器 (2)光线传感器 (3)灰度传感器 (4)颜色传感器 (5)IIC颜色传感器 (6)声音传感器 (7)温湿度传感器 (8)线性温度传感器 (9)土壤湿度传感器 图 3-16 环境传感器示例 (10)水位传感器 (11)水流量传感器 (12)水温传感器 (13)雨水传感器 (14)水蒸气传感器 (15)火焰传感器 (16)酒精传感器 (17)气体烟雾传感器 (18)PM2.5传感器 图 3-16 (续) 表 3-1 环境传感器详情 序号 名 称 说 明 输出类型 测量范围 1 光敏传感器 可见光感应 模拟量 1~ 5000 2 光线传感器 环境光感应 模拟量 0~ 1023 3 灰度传感器 色彩感应 模拟量 0~ 511 4 颜色传感器 色彩感应 模拟量 红、绿、蓝数值 5 IIC颜色传感器 色彩感应 模拟量 色温、亮度、红、绿、蓝及白光数值 6 声音传感器 声音感应 模拟量 0~ 1023 7 温湿度传感器 温湿度感应 模拟量 0~50℃,误差2℃,湿度范围随温度变化 8 线性温度传感器 温度感应 模拟量 -40℃~+110℃,误差 0.5℃