最近开始准备考取Arduino的官方认证,但之前没有系统地学习,因此打算好好整理一下,一方面当作考试复习,另一方面给想学习Arduino的朋友们一些帮助
在学习之前,建议大家先在Arduino中文社区看一下使用教程,里面有很多答疑帖,还有很多干货,值得一看:
https://www.arduino.cn/thread-1066-1-1.html
本篇文章将分为5大部分,如下所示:
- 编程语法
- Arduino IDE
- Arduino开发板
- 电子元器件
- ARDUINO基础认证演示题
编程语法
1. Arduino使用的编程语言
Arduino使用C/C++编写程序,虽然C++兼容C语言,但这是两种语言:
- C语言 是一种面向过程的编程语言
- C++ 是一种面向对象的编程语言
早期的Arduino核心库使用C语言编写,后来引进了面向对象的思想,目前最新的Arduino核心库采用C与C++混合编写而成
通常我们说的Arduino语言,是指Arduino核心库文件提供的各种应用程序编程接口(Application Programming Interface,简称API)的集合。这些API是对更底层的单片机支持库进行二次封装所形成的。例如,使用AVR单片机的Arduino的核心库是对AVR-Libc(基于GCC的AVR支持库)的二次封装。
2. Arduino程序基本结构
按照图示方法即可新建一个Arduino程序的文件:
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
如果你使用过C/C++语言,你会发现Arduino的程序结构与传统的C/C++结构的不同之处就在于Arduino程序中没有main函数
准确说,其实并不是Arduino没有main函数,而是main函数的定义隐藏在了Arduino的核心库文件中。Arduino开发一般不直接操作main函数,而是使用Setup和loop这个两个函数
换句话说,Arduino程序基本结构由setup() 和loop() 两个函数组成
setup()
Arduino控制器通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次,相当于JAVA中的构造方法。
通常我们会在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作。
loop()
在setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行。
通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。
3. Arduino中的Hello World
按照图示方法打开Blink程序:
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
在Arduino中,平时的Hello World叫做Blink,能用来判断开发环境是否可用,程序的效果是使开发板上13号引脚的LED灯反复点亮又熄灭
需要注意的是,新版IDE自带例程使用的是宏LED_BUILTIN,在大部分arduino开发板上,这个宏定义对应的是13号引脚:
#define LED_BUILTIN 13
以上是基本的语法,但要真正地上手Arduino,还需要学会使用Arduino的编辑器
Arduino IDE
下面是Arduino中文社区给的IDE下载方法
https://www.arduino.cn/thread-5838-1-1.html
1. 配置Arduino IDE
下面我用Arduino UNO开发板举例(某宝买的,十几块就能买到):
在Tools的Board里选择相对应的开发板:
接着插上开发板,并选择串口,选择串口前,我们先查看开发板对应的串口:
在命令行输出mode
,可以看到COM6,因此Port选择COM6:
2. 板型管理器与库管理器
板型管理器
如果你要添加特殊型号的Arduino控制板,可以进入Boards Manager:
可以在搜索区搜索,或者在下面寻找:
选中并点击 Install 按键,即可安装并使用相应的开发板 库管理器库管理器也在Tools里:
库管理器的使用方法同板型管理器:
另一种方法是通过github找到相应的库,然后下载解压到本地librarie文件夹里:
3. 将程序上传至开发板
以Blink程序为例,程序写好后,点击第二行第一个图标:
编译成功后:
如果有语法错误:
IDE的底部会给出报错信息,根据提示调试程序即可,编译无误后,即可上传程序:
此时Arduino Uno上标有TX、RX的两个LED会快速闪烁,这说明你的程序正在被写入Arduino Uno中等待一会后,出现这样就算成功上传了:
- “924字节”为当前程序编译后的大小
- 括号中“最大32,256字节”指当前控制器可使用的Flash程序存储空间大小。
Arduino开发板
1. 数字I/O的使用
Arduino上每一个带有数字编号的引脚,都是数字引脚,包括写有“A”编号的模拟输入引脚。使用这些引脚,可以完成输入输出数字信号的功能。
数字信号是以0、1表示的电平不连续变化的信号,也就是以二进制的形式表示的信号。 在Arduino中数字信号通过高低电平来表示,高电平则为数字信号1,低电平则为数字信号0
在使用输入或输出功能前,需要先通过pinMode() 函数配置引脚的模式为输入模式或输出模式:
pinMode(pin, mode);
- pin为指定配置的引脚编号
- mode为指定的配置模式
可使用的三种模式:
- INPUT 输入模式
- OUTPUT 输出模式
- INPUT_PULLUP 输入上拉模式
Blink程序中使用到的pinMode(LED_BUILTIN, OUTPUT):
即是把LED_BUILTIN(13号)引脚配置为输出模式
配置成输出模式后,还需要使用digitalWrite() 让其输出高电平或者是低电平。其调用形式为:
digitalWrite(pin, value);
- 参数pin为指定输出的引脚编号
- 参数value为要指定输出的电平,使用HIGH指定输出高电平,或是使用LOW指定输出低电平。
2. 模拟I/O的使用
在Arduino控制器中,编号前带有“A”的引脚是模拟输入引脚。Arduino可以读取这些引脚上输入的模拟值,即读取引脚上输入的电压大小
生活中接触到的大多数信号都是模拟信号,如声音、温度的变化等。模拟信号是用连续变化的物理量表示的信息,信号随时间作连续变化。在Arduino UNO上,可以接受0~5V的模拟信号
模拟输入引脚是带有ADC(Analog-to-Digital Converter,模数转换器)功能的引脚。它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读入模拟值的功能
Arduino 模拟输入功能有10位精度,即可以将0~5V的电压信号转换为0~1023的整数形式表示,模拟输入功能需要使用analogRead() 函数:
int value = analogRead(pin)
- 参数pin是指定要读取模拟值的引脚,被指定的引脚必须是模拟输入引脚。如analogRead(A0)即是读取A0引脚上的模拟值。
与模拟输入功能对应的是模拟输出功能,我们使用analogWrite() 函数实现这个功能。但该函数并不是输出真正意义上的模拟值,而是以一种特殊的方式来达到输出近似模拟值的效果,这种方式叫做脉冲宽度调制(PWM,Pulse Width Modulation):
analogWrite(pin,value)
- 参数pin是指定要输出PWM波的引脚
- 参数value指定是PWM的脉冲宽度,范围为0~255。
在Arduino UNO中,提供PWM功能的引脚为3、5、6、9、10、11。
当使用analogWrite() 函数时,指定引脚会通过高低电平的不断转换输出一个周期固定的方波,通过改变高低电平在每个周期中所占的比例(占空比),而得到近似输出不同的电压的效果。
需要注意的是,这里仅仅是得到了近似模拟值输出的效果,如果要输出真正的模拟值,还需要加上外围滤波电路。
在analogWrite() 和analogRead() 函数内部,已经完成了引脚的初始化,因此不用在Setup() 函数中进行初始化操作
3. 串口的使用
Arduino与计算机通信最常用的方式就是串口通信
我们使用USB线连接Arduino Uno与计算机时,Arduino Uno会在计算机上虚拟出一个串口设备,此时两者之间便建立了串口连接。通过此连接,Arduino Uno便可与计算机互传数据。
使用串口与计算机通信,需要先使用Serial.begin() 初始化Arduino的串口通信功能:
Serial.begin(speed);
- 参数speed是指串口通信波特率,这是设定串口通信速率的参数。串口通信的双方必须使用同样的波特率,方能正常进行通信。
波特率是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如9600波特表示每秒发送9600bit的数据。通信双方需要使用一致的的波特率才能正常通信。Arduino串口通信通常会使用以下波特率:
300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200。
波特率越大,说明串口通信的速率越快。
3.1串口输出
串口初始化完成后,我们便可以使用Serial.print() 或Serial.println() 向计算机发送信息了:
Serial.println(val);
在Blink程序的loop里加入:
Serial.println("Hellow World");
上传程序后打开串口监视器:
如下图所示:
串口监视器是Arduino IDE自带的一个小工具,可以查看到串口传来的信息,也可以向连接的设备发送信息。需要注意的是,在串口监视器右下角,有一个波特率设置下拉框,波特率设置必须和烧入程序中设置的一致,才能正常收发数据
3.2串口输入
除了输出,串口同样可以接收由计算机输出的数据。接收串口数据需要使用Serial.read()函数:
Serial.read();
调用该语句,每次都会返回一个字节的数据,这个返回值便是当前串口读取到的数据
在Blink程序的loop里添加如下语句:
char ch=Serial.read();
Serial.println(ch);
上传程序并打开串口监视器:
可以看到串口输出了一个 “⸮” ,这是因为串口缓冲区中没有可读数据造成的。当缓冲区中没有可读数据时,read()函数会返回int型值-1,而int型-1对应的char型数据便是该乱码 “⸮”
在使用串口时,Arduino Uno会在SRAM中开辟一段大小为256 bytes的空间,串口接收到的数据都会被暂时存放进这个空间中,这个存储空间,我们称之为缓冲区。当你调用Serial.read()语句时,Arduino便会从缓冲区取出一个字节的数据
因此使用串口读取数据时,需要搭配Serial.available() 语句使用:
Serial.available();
- Serial.available() 的返回值便是当前缓冲区中接收到的数据字节数
Serial.available() 可以搭配if 或者while使用,先检测缓冲区中是否有可读数据,如果有数据,再读取,没有数据便跳过读取或等待读取:
void loop() {
if(Serial.available()>0){
char ch=Serial.read();
Serial.print(ch);
}
}
程序上传后,便没有乱码了:
下面我们输入"Hello World",点击右边的send:
效果如下:
在串口监视器右下角有两个选项,一个是设置结束符,一个是设置波特率。如果你设置了结束符,则在你最后发送完数据后,串口监视器会自动发送一组你设定的结束符,如回车符和换行符:
另外,当串口通信时,Arduino控制器上的标有RX、TX的两LED灯会闪烁提示:
- 接收数据时,RX灯会点亮
- 发送数据时,TX灯会点亮
在涉及串口通信的Arduino Uno例程程序中,还会经常看到如下特殊用法:
while (!Serial) {}
这是在等待串口监视器开启,开启串口监视器后,!Serial将为假,即会运行该while循环后的语句
利用串口通信功能,我们可以使用计算机来控制Arduino执行特定的操作
电子元器件
在学习Arduino的过程中,会使用到许多电子元件及模块。通过搭配不同的元件和模块,我们便可以制作出许多的作品
另外,同样的元件、模块,可能会有不同的型号、不同的封装形式(即不同的外观),但一般情况下原理和使用方法都是相同的
1. 面包板
面包板是专为我们进行各种电子实验所设计的工具。我们可以根据自己的想法在上面搭建各种电路。众多电子元器件都可根据需要,随意插入或拔出,免去了焊接,节省了电路的组装时间。同时,免焊接使得元件都可以重复使用,避免了浪费和多次购买元件:
使用之前,需要清楚的是:
- 上下两边的插孔,数个横向插孔连通,纵向插孔不连通
- 中间的插孔,纵向的5个插口相互连通,横向的都不连通
2. 电阻
电阻即对电流起阻碍作用的元件
2.1限流电阻
一般LED的最大能承受的电流为25mA,如若直接将LED连接到电路中,当其点亮时,如果电流过大,很容易烧毁。
我们在LED一端串联了一个电阻,这样做可以控制流过LED的电流,防止损坏LED。这个电阻我们称之为限流电阻:
2.2下拉电阻
在开发板的2号引脚到GND之前,连接了一个电阻:
如果没有该电阻,当未按下按键时,2号引脚会一直处于 悬空 状态,此时使用digitalRead() 读取2号引脚状态,会得到一个不稳定的值(可能是高,也可能是低)
添加这个电阻到地就是为了稳定引脚的电平,当引脚悬空时,就会识别为低电平。这种将某节点通过电阻接地的做法,叫做下拉,这个电阻叫做下拉电阻。
2.3上拉电阻
同下拉电阻一样,可以稳定I/O口电平,不同的是电阻连接到VCC,将引脚稳定在高电位。这种电阻叫做上拉电阻
3. 电容
电容可以理解为存储电能的容器,下图都是电容:
电容也有很多作用,如去耦、滤波、储能等
4. 二极管
二极管在电路中使用广泛,作用众多,如整流、稳压、电路保护等:
4.1LED
LED即发光二极管,可以发光的二极管:
LED有正负两极,不能接反:
- 短脚为负极
- 长脚为正极
广泛应用于信号指示、照明等领域
5. 三极管
三极管是能起放大、开关等作用的元件:
有pnp和npn 两种类型的三极管
内部构造有三级:
- 发射极(emitter,E)
- 基极(base,B)
- 集电极(collector,C)
6. 传感器
传感器是一种检测装置,能感受到被测量的信息,并能将感受到的信息,按一定规律变换成为电信号或其他所需形式的信息输出,以满足信息的传输、处理、存储、显示、记录和控制等要求。
通常根据其基本感知功能分为热敏元件、光敏元件、气敏元件、力敏元件、磁敏元件、湿敏元件、声敏元件、放射线敏感元件、色敏元件和味敏元件等十大类
下图分别是seeed的光敏元件和热敏元件:
7. 执行器
执行器是自动控制系统中必不可少的一个重要组成部分。它的作用是接受控制器送来的控制信号,改变被控介质的大小,从而将被控变量维持在所要求的数值上或一定的范围内
下图分别是seeed的蜂鸣器和红外发射器:
5. ARDUINO基础认证演示题
第一题比较简单,使用过的朋友应该都能看出来选millis(),下面是millis()的文档:
https://www.arduino.cc/en/pmwiki.php?n=Reference/millis
这题只有蜂鸣器有"自动执行"的功能,按钮是人为控制的,因此选压电蜂鸣器
这题也比较简单,让三个支路的电阻相同即可,算一下便可知道R1=7,R2=8.5
先看看开关的结构:
因此左边两个答案可以排除再看看右边两个LED引脚,一定要记住LED灯的短脚为负极,长脚为正极因此这题选右下角的:
这一题需要仔细查看,题目说的是打开LED灯,看一下代码不难看出if条件成立时开灯
1跟high是等价的 ,因此按下开关1时,条件成立,灯亮
演示题的题型和考题差不多,演示题都能搞明白后,差不多就可以参加考试,最后祝大家考试顺利!