本节书摘来自华章计算机《Arduino开发实战指南:LabVIEW卷》一书中的第1章,第1.2节,作者:余崇梓著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1.2 Arduino的硬件组成
Arduino硬件有很多种版本,详细介绍可参考附录A,本书以Arduino Uno R3为例进行介绍。
1.2.1 Arduino Uno概览
Arduino Uno是一个基于ATmega328单片机的开发板。它有14个数字输入/输出端口(6个端口可以作为PWM输出)、6个模拟输入端口、一个16MHz陶瓷晶振、一个USB连接端口、一个电源插座、一个ICSP编程接口(可用于SPI通信)、一个复位按钮。它包含支持单片机工作所需要的所有外围电路,是单片机的最小系统板。简单地把它用USB数据线连接到计算机,或使用交流适配器或者直流电源给它供电,它就可以工作。Arduino Uno R3实物图如图1-1所示。Arduino Uno R3的参数如表1-1所示。
Arduino Uno是2011年9月25日在纽约创客大会(New York Maker Faire)上发布的。型号名字 Uno 是意大利语中“一”的意思,用来表达Arduino软件的1.0版,即 Uno Punto Zero(意大利语的“1.0”)版。
Uno不同于以前的所有版本,因为它不使用FTDI USB至串行驱动芯片,而使用ATmega16U2(ATmega8U2到版本R2)作为一个USB至串行转换器。
Uno R2版本有一个下拉电阻将ATmega8U2的HWB线拉到地,使其更容易进入DFU模式。
Uno R3版本有以下一些新特性。
引脚变化:在靠近AREF引脚的地方添加了SDA和SCL引脚,同时在Reset引脚附近添加了一个IOREF引脚和一个未连接的Reserved引脚。IOREF引脚用来给扩展板提供参考电压,使扩展板可以和5V以及3.3V的Arduino板都能够兼容。未连接的Reserved引脚用作将来的扩展。
更稳定的复位电路。
使用ATmega16U2代替ATmega8U2。
1.2.2 Arduino Uno供电
Arduino Uno可采用通过USB端口供电或使用外部电源供电,供电电源是自动选择的。
可以使用AC/DC适配器或者电池进行外部供电。Arduino板上有AC/DC电源适配器接口,也有供电池使用的Power端口。外部供电电压为6~20V。如果供电电压小于7V,5V引脚上的电压可能低于5V,系统可能会不稳定;如果供电电压超过12V,稳压器可能会过热并可能损坏板卡。推荐的供电电压范围是7~12V。
电源引脚如下:
Vin,当使用外部供电的时候,该引脚为Arduino电路板的输入电压引脚。
5V,该引脚输出Arduino板上稳压器产生的5V电压。如果给该引脚加电压,将会损坏Arduino板。
3.3V,该引脚输出Arduino板上稳压器产生的3.3V电压,最大电流为50mA。
GND,接地引脚。
IOREF,这个引脚将单片机工作电压作为参考电压提供给shield板,以便shield板能够根据这个参考电压选择合适的电压源或者使能电压转换器来工作在5V或者3.3V。
1.2.3 Arduino Uno存储
ATmega328有32 KB(其中0.5 KB用于bootloader)存储空间。它也有2 KB的SRAM和1 KB的EEPROM(可以使用EEPROM Library进行读写)。
1.2.4 Arduino Uno输入及输出
Arduino Uno上14个数字I/O端口中的每一个都可以被用作输入或者输出,使用pinMode、DigitalWrite,以及digitalRead函数。它们工作在5V。每个I/O端口可以提供或者接收最大40 mA的电流并有一个20~50kΩ内部上拉电阻(默认断开)。
此外,一些端口还有其他专门的功能。
串口(Serial):0(RX)和1(TX)用于接收(RX)和发送(TX)TTL串行数据。这些引脚接到ATmega8U2(USB至串口芯片)的相应引脚上。
外部中断:2和3,这些引脚可以配置为中断触发,在低电平、上升沿、下降沿或者数值改变的时候产生一个中断,详细功能见attachInterrupt() 函数。
PWM:3、5、6、9,提供8位PWM输出。使用analogWrite()函数产生PWM输出。
SPI通信:10(SS)、11(MOSI)、12(MISO)、13(SCK)。这些引脚支持SPI通信,可以使用SPI library进行SPI通信。
LED:13,有一个内置的LED与数字引脚13相连。当该引脚为高电平时,LED亮;当该引脚为低电平时,LED灭。
Analog Input:Arduino Uno有6个模拟输入,A0~A5,每个模拟输入端口提供10位的分辨率(即1024个不同的值)。默认情况下它们测量的电压范围为0~5V,当然,测量电压范围的上限也可以通过AREF引脚来设定,并可以通过 analogReference()函数使用。此外,一些模拟输入引脚有专门的功能。
TWI:A4或者SDA、A5或者SCL。要支持TWI通信可以使用Wire Library。
AREF:模拟输入端口的参考电压。支持使用 analogReference()函数。
Reset:将Reset置为低电平可以对单片机进行复位。通常用于给Shield板添加一个复位开关。
附录B是Arduino和ATmega328的端口映射,ATmega168和ATmega328的映射是相同的。
1.2.5 Arduino Uno通信
Arduino Uno有很多种通信方式,它可以和另一台计算机、另一个Arduino或者其他微控制器进行通信。Arduino Uno上的ATmega328可以通过数字引脚0(RX)和1(TX)进行UART TTL(5V)串行通信。Arduino板上的ATmega16U2实现通过USB端口进行串口通信,在计算机上这个端口为一个虚拟串口。ATmega16U2固件使用便携的USB COM驱动,所以不需要外部驱动。虽然不需要外部驱动,但是在Windows上需要一个*.inf文件。 Arduino软件包括一个串口监听器,允许简单的文本数据被发送到Arduino电路板或者接收来自Arduino电路板的文本数据。当通过USB进行串口数据通信的时候RX和TX 的LED会闪烁(通过数字引脚0和数字引脚1进行串口通信的时候LED不会闪烁)。
使用软件串口通信库(Software Serial library)可以通过Arduino Uno的任意数字端口进行串行通信。
ATmega328还支持I2C(TWI)和SPI通信。Arduino软件包含一个Wire Library库来简化I2C总线的使用。对于SPI通信,可以使用SPI Library库。
1.2.6 Arduino Uno自动复位
在程序下载前,除了使用手动方式通过复位按钮进行复位外,在Arduino Uno的设计中,允许和Arduino连接的计算机通过软件的方式进行复位。ATmega8U2/16U2的一个硬件流程控制线(DTR)通过一个100μF的电容连接至ATmega328的复位引脚。当这条线被拉低的时候,可以将ATmega328复位。该功能允许使用者在下载代码时,只需在Arduino IDE环境中按Upload按钮便可进行复位。
如果要禁用auto-reset功能,可以将标记为“Reset-EN”的焊接线断开;将“Reset-EN”焊接在一起,又可以重新使能auto-reset。也可以使用一个110Ω的电阻将reset连接到5V,从而禁用auto-reset。
1.2.7 Arduino Uno USB过流保护
Arduino Uno有可更换的熔丝来防止计算机的USB接口短路和过电流。 虽然大多数计算机内部提供了保护,但熔丝提供了更多一层的保护。如果USB端口的电流超过500 mA,熔丝会自动断开直到短路或过载问题被解决。
1.2.8 Arduino Uno的物理特性
Arduino Uno PCB的最大长度和宽度为2.7inch(英寸)和2.1inch,USB连接器和电源接口延伸到Arduino板以外。板上有四个用来固定的螺丝孔。注意,数字端口7和8的间距是160mil,而不像其他端口间距一样是100mil的整数倍。
1.2.9 Arduino Uno 原理图与参考设计
Arduino参考设计可以使用ATmega8、ATmega168或ATmega328。目前的模板使用ATmega328,但在参考设计及原理图中使用的是ATmega8。不同Arduino板上的三种单片机的引脚配置都是相同的。Arduino引脚与AVR单片机引脚对应关系可参看附录B。Arduino Uno R3的原理图可参见附录C。