物联网实战 篇一:用 Arduino 点亮一颗 LED
我曾经购买和 DIY 过很多的智能硬件,它们都是基于米家或者易微联平台的,这些原厂的产品应用场景有限,并不能满足所有的控制需求,使用上也有诸多限制,于是利用暑假打算学习下物联网相关的知识,从 Arduino 到 ESP8266-NodeMCU 再到树莓派,最终将所有的设备和传感器互联互通。
我之前只是学过简单的 51 单片机,Arduino 也是从头学起,参考的是「太极创客」团队编写的教程,这套教程免费开源,讲解的非常详细,会中文就能入门,老师的声音也十分好听。本文是第一大章长达 7 小时视频教程的学习笔记,如果有看不懂的地方可以翻看原视频。
一、初识 Arduino 开发板
Arduino 是一款简单易学且功能丰富的开源平台,包含硬件部分(各种型号的 Arduino 开发板)和软件部分(Arduino IDE)。Arduino 开发板能够读取来自不同传感器的模拟或数字输入信号,并将其转换为输出,例如激活电机,打开/关闭 LED,连接到云端等多种操作,帮助我们完成一个又一个酷炫的创客项目。
Arduino 开发板是一个大的家族,Arduino 官网上一共列出有几十种不同的开发板,初学者常用到的主要有下面三种:
Arduino Uno:基于微控制器 ATmega328P,有 14 个数字输入/输出引脚(这些引脚中有 6 个引脚可以作为 PWM 输出引脚),6 个模拟输入引脚,性价比最高,简单易学、稳定可靠,Uno 开发板也是应用最为广泛且参考资料最多的开发板。
Arduino Mega:基于 ATmega2560,它是为较为复杂的 Arduino 开发项目而设计的,尺寸要比 Uno 开发板大一倍。有 54 个数字输入/输出引脚(其中有 15 个引脚可用于 PWM 输出),16 个模拟输出引脚,可应用于 3D 打印以及机器人等大型项目。
Arduino Nano:与 Uno 核心微控制器(ATmega 328)相同,身材小巧,尺寸和重量都只有 Uno 的三分之一左右。它与 Uno 的区别是 Nano 没有直流电压供电接口,同时 Nano 通过 Mini-B USB 接口与电脑连接。但 Nano 的引脚数量还要略多于 Uno。如果项目对尺寸和重量有要求可以选用 Nano。
二、关于 Arduino UNO
Uno 开发板是最适合初学者的 Arduino 开发板,市售的有 Arduino 官方出品的官方板和其它厂商制作的克隆板,外观略有不同,功能都是一样的,售价只有十几块钱。
UNO 有 14 个数字输入/输出引脚(数字端口 0-13),其中标有~符号的 6 个引脚可以作为 PWM 输出引脚(3、5、9、10、11),13 脚连接到板载的 LED 指示灯。每个引脚可提供/接收最高 40 mA 的电流(推荐电流 20 毫安)。
6 个模拟输入引脚(A0-A5),作为 ADC(模数转换器)使用。引脚 A0-A5 能够读取模拟电压,ADC 具有 10 位分辨率,这意味着它可以通过 1024 个数字电平表示模拟电压。 ADC 将电压转换成微处理器可以理解的位。
ICSP 插头是烧写器利用串行接口给单片机烧写程序用的,我们一般是通过 USB 利用串口通信写程序,ICSP 用不到。
数字引脚 0 和 1 分别是 RX、TX 串行接口(TTL),用于在 Arduino 板和其他串行设备(如计算机,显示器,传感器等)之间交换数据。
每个引脚除了上述的基础功能外,还有更多的复用功能,比如数字引脚 10-13 可以用作 SPI 通信,模拟引脚 A4 和 A5 用作 I2C 通信,数字引脚 2 和 3 为外部中断引脚,详细的引脚功能见下图。
三、Arduino IDE 下载和安装
Arduino IDE 软件是 Arduino 开发板的程序开发环境,可以从官网上下载。Arduino 开发语言是基于 C/C++的,如果没接触过编程也没关系,C/C++语言可以说是当今最通用的编程语言之一,学习它的难度也没有您所想象的那么大,去 W3Cschool 上学习一个下午,就能入门了。
打开 Arduino IDE,在工具里面选择 Arduino UNO 开发板,选择合适的端口(可以在计算机设备管理器里面查看),主界面自动生成了两个函数 setup()和 loop(),其中当你给开发板通电后或者按下复位按钮后,setup 函数运行一次,而 loop 函数永远会反复的运行。
打开文件-示例-01.Basics-Blink 程序,这是一个让板载 LED 闪烁的示例程序,点击上传,把程序烧录进 Arduino 里面,如果能观察到开发板上的板载 LED 闪烁,说明配置成功。
四、输入与输出
1. pinMode(pin, mode)
Arduino 的引脚可以通过 pinMode() 函数配置为以下三种模式:
输出(OUTPUT)模式:引脚为低阻抗状态,可以向其它电路元器件提供电流(<40mA),比如点亮 LED 或者驱动电机。
输入(INPUT)模式:引脚为高阻抗状态(100 兆欧),此时该引脚可用于读取传感器信号或开关信号。但是引脚悬空时处于不确定状态,需要外接上拉电阻或下拉电阻(一般可以选用 10K 欧姆)。
输入上拉(INPUT_PULLUP)模式:使用 Arduino 微控制器自带内部上拉电阻。
2. digitalWrite(pin, value)
如果该引脚通过 pinMode() 设置为输出模式(OUTPUT),您可以通过 digitalWrite() 语句将该引脚设置为 HIGH(5V)或 LOW(GND)。
// 点亮13引脚的板载LED
pinMode(13, OUTPUT);
digitalWrite(ledPin, HIGH);
3. digitalRead(pin)
读取数字引脚的 HIGH(高电平)或 LOW(低电平)使用 digitalRead() 函数,记得先把引脚配置为输入上拉模式。
// 引脚3接按键开关,按下按键后点亮13引脚的LED,完整程序如下:
int inputPin = 3;
int ledPin = 13;
void setup(){
pinMode(ledPin, OUTPUT); //将引脚13设置为输出模式
pinMode(inputPin, INPUT_PULLUP); //将引脚2设置为输入上拉模式,引脚2与外部按钮连接
}
void loop(){
int val = digitalRead(inputPin); // 读取引脚2的输入情况,开关闭合后,引脚2将获得低电平信号
if (val == LOW){ // 检查引脚2是否为低电平
digitalWrite(ledPin, HIGH); // 当按钮按下时,引脚2为低电平,点亮引脚13 LED
} else{
digitalWrite(ledPin, LOW); // 当按钮未按下,引脚2为高电平,熄灭引脚13 LED
}
}
4. analogWrite(pin, value)
数字输出只能控制 LED 的亮灭,如果要控制 LED 的亮度或者控制电机的转速,就要用到模拟输出 analogWrite() 函数。analogWrite() 指令给该引脚(UNO 只支持引脚 3,5,6,9,10,11)一个固定频率的 PWM 信号(频率大约为 490Hz),0 到 255 为 PWM 的占空比, 0 对应 off, 255 对应 on。在调用 analogWrite() 函数前,无需使用 pinMode() 函数来设置该引脚。
// LED 呼吸灯
for (int a=0; a<=255;a++){ analogWrite(11,a);}
for (int a=255; a>=255;a--){ analogWrite(11,a);}
5. analogRead(pin)
Arduino 控制器有 5 个(A0-A5)10 位数模转换通道,可以将 0-5 伏特的电压输入信号映射到数值 0-1023,比如当模拟输入引脚的输入电压为 2.5 伏特的时候,该引脚的数值为 512。注意在模拟输入引脚没有任何连接的情况下,用 analogRead() 指令读取该引脚,这时获得的返回值为不固定的数值。
// 通过调节电位器, A0引脚的输入电压将在0V-5V之间。
int val = analogRead(A0);
五、实战:用电位器调节 LED 亮度
最后通过一个实战将以上所有内容融会贯通,也就是用电位器调节 LED 的亮度,如果能看懂并复现,Arduino 也就入门了。
电路连接:电位器中间引脚连接到模拟输入 A0 引脚,电位器两端引脚分别连接在 Arduino +5V 和 GND,LED 连接在 Arduino 的 9 号引脚上。
原理解释:通过调节电位器,A0 引脚上的电压从 0 变化到 5V,使用analogRead()读取为 0-1023,使用map (x, in_min, in_max, out_min, out_max)函数将模拟输入数值(0 - 1023)等比映射到模拟输出数值区间(0-255)内,然后用analogWrite()函数将该数值写入 9 号引脚,输出对应占空比的 PWM 信号,驱动 LED 发光。
程序实现:
void setup() {
pinMode(9, OUTPUT); // 设置9号引脚为输出模式
}
void loop() {
int analogInputVal = analogRead(A0); // 读取模拟输入值
int brightness = map(analogInputVal, 0, 1023, 0, 255); //将模拟输入数值(0 - 1023)等比映射到模拟输出数值区间(0-255)内
analogWrite(9, brightness); //根据模拟输入值调节LED亮度
}
小结
以上就是我从太极创客团队出品的 Arduino 基础教程中学到并整理的相关内容,如果你想入门 Arduino 的话,强烈建议去 B 站观看他们的「零基础入门学用 Arduino」视频教程,除了本文中提到输入输出控制外,还有数码管驱动、Arduino 程序结构、串口通讯相关的内容,简单易懂,一学就会~
做个预告,Arduino 教程的第二章是舵机控制与操作 MeArm 机械臂,欢迎关注,交流学习~
hatw
校验提示文案
hatw
校验提示文案