第 1 讲 Arduino 基础
1.Arduino 简介
Arduino是一个开放原代码、硬软件整合、方便中小型系统开发的平台,包含硬件(各种型号的Arduino板)和软件( Arduino IDE)。现在市场上最多的,也是初学者最早使用的,就是Arduino UNO系列。在这款单片机上,提供了用户使用的数字I/O口、模拟I/O口,也支持SPI、 IIC、 UART的串口通信。 Arduino能通过各种各样的传感器来感知环境,通过控制灯光、电动机和其他的装置来反馈、影响环境。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。
Arduino开发板的四大特性是:跨平台、简单清晰、开放性和发展迅速。首先, Arduino IDE可以在Windows、 Macintosh OS X、 Linux三大主流操作系统上运行,而其他的大多数控制器只能在Windows上开发。其次, Arduino语言基于wiring语言开发,是对 avr-gcc库的二次封装,不需要太多的单片机基础、编程基础,简单学习后,也可以快速地进行开发。值得一提的是, Arduino的硬件原理图、电路图、 IDE软件及核心库文件都是开源的,在开源协议范围内可以任意修改原始设计及相应代码。最后,由于Arduino的各种特性,越来越被初识单片机的开发者们所信赖。
2.Arduino 种类
Arduino常用的种类有: Arduino Mini、 Arduino Nano、 Arduino Leonardo、Arduino UNO、 Arduino Mega 2560等,由于开发的方便和个人要求的简约设计,多数都以Arduino UNO和Arduino Pro mini作为开发的平台。
1) Arduino UNO
Arduino UNO最大尺寸为2.7× 2.1 inches。作为Arduino平台的参考标准模板, UNO的处理器核心是ATmega328,同时具有14路数字输入/输出口(其中6路可作为PWM输出), 6路模拟输入,一个16MHz晶体振荡器,一个USB口,一个电源插座,一个ICSP header和一个复位按钮。 UNO已经发布到第三版,与前两版相比有以下新的特点:( 1)在AREF处增加了两个引脚SDA和SCL,支持I2C接口;增加IOREF和一个预留引脚,将来扩展板将能兼容5V和3.3V核心板。( 2)改进了复位电路设计。( 3) USB接口芯片由ATmega16U2替代了ATmega8U2。
在输入/输出方面, Arduino UNO 具有14路数字输入/输出口:工作电压为5V,每一路能输出和接入最大电流为40mA。每一路配置了20-50kΩ内部上拉电阻(默认不连接)。除此之外,有些引脚有特定的功能。串口信号RX( 0号)、 TX( 1号):与内部 ATmega8U2 USB-to-TTL 芯片相连,提供TTL电压水平的串口接收信号。外部中断( 2号和3号):触发中断引脚,可设成上升沿、下降沿或同时触发。脉冲宽度调制PWM( 3、 5、 6、 9、 10 、 11):提供6路8位PWM输出。 SPI( 10 ( SS), 11( MOSI), 12( MISO), 13( SCK)): SPI通信接口。 LED( 13号): Arduino专门用于测试LED的保留接口,输出为高时点亮LED,反之输出为低时LED熄灭。 6路模拟输入A0到A5:每一路具有10位的分辨率(即输入有1024个不同值),默认输入信号范围为0到5V,可以通过AREF调整输入上限。除此之外,有些引脚有特定功能。 TWI接口( SDA A4和SCL A5):支持通信接口(兼容I2C总线)。 AREF:模拟输入信号的参考电压。 Reset:信号为低时复位单片机芯片。
在通信接口方面,串口有: ATmega328内置的UART可以通过数字口0( RX)和1( TX)与外部实现串口通信; ATmega16U2可以通过访问数字口来实现USB上的虚拟串口;以及TWI(兼容I2C)接口和SPI 接口等。整体外观如图1.1所示。
2) Arduino ProMini
Arduino ProMini是Arduino Mini的半定制版本,所有外部引脚通孔没有焊接,与Mini版本引脚兼容。 Arduino ProMini的处理器核心是ATmega168,同时具有14路数字输入/输出口(其中6路可作为PWM输出), 6路模拟输入,一个晶体谐振,一个复位按钮。有两个版本:工作在3.3V和8MHz时钟,工作在5V和16MHz时钟。
Arduino ProMini与Arduino UNO的区别和特色是:支持ISP在线烧写,可以将新的“bootloader”固件烧入ATmega8或ATmega128芯片。有了bootloader之后,可以通过串口或者USB to Rs232线更新固件。可依据官方提供的Eagle格式PCB和SCH电路图,简化Arduino模组,完成独立运作的微处理控制,也可简单地与传感器、各式各样的电子元件连接。 Arduino ProMini主控板整体外观如图1.2所示。
3.开发环境的配置
目前笔者常用的Arduino IDE编程环境软件是1.0.6,下载链接链接为: http: //pan. baidu.com/s/1bpre0aV 密码: viyj(当然读者也可以到Arduino的中文官方网站下载最新的软件IDE,之后将库文件添加其中即可),将文件解压在本地的文件夹中,找到drivers文件夹,以图1.3所示计算机为例( win7_64位),找到对应位数的驱动进行安装,驱动安装目录如图1.3所示。
点击始终安装此驱动软件,如图1.4所示。
勾选“始终信任来自Arduino srl的软件”,并点击安装按钮,如图1.5所示。勾选“始终信任来自Arduino LLC的软件”,并点击安装按钮,如图1.6所示。
点击完成,结束安装,如图1.7所示。
编程主界面如图1.10所示。根据现有的开发板,选择没有被占用的COM口,如图1.11所示。
4.Arduino 开发准备
1) Arduino 程序框架
Arduino程序主要可分为两个框架:
Setup() —函数在程序开始时,可以初始化变量,接口模式以及库函数的启用灯。
Loop() —在setup()之后,主要目的是让Loop中的函数被循环执行。
2) 常用的基本函数
( 1) pinMode(接口名, OUTPUT或INPUT),将接口定义为输入或输出接口,用在setup()函数里。
( 2) digitalWrite(接口名, HIGH或LOW),将数字接口值置高或置低。
( 3) digitalRead(接口名),读出数字接口的值。
( 4) analogWrite(接口名,数值),给一个接口写入模拟值( PWM波)。
( 5) analogRead(接口名),从指定的模拟接口读取值, Arduino对该模拟值进行10bit的数字转换,可将0~ 5V的电压值转换成0~ 1023间的整数值。
( 6) delay(),延时一段时间,以毫秒为单位。
( 7) Serial.begin(波特率),设置串行每秒传输的数据的速率。
( 8) Serial.read(),读取持续输入的数据。
( 9) Serial.print(数据),从串行端口输出数据。
( 10) Serial.println(数据),从串行端口换行输出数据。这十种为用到的基本函数,还有很多,以后需要慢慢学习。
3) 语言库文件
官方库文件
• EEPROM- EEPROM读写程序库
• Ethernet- 以太网控制器程序库
• LiquidCrystal-LCD控制程序库
• Servo- 舵机控制程序库
• SoftwareSerial- 任何数字I/O口模拟串口程序库
• Stepper- 步进电机控制程序库
• Wire-TWI/I2C总线程序库
• Matrix - LED矩阵控制程序库
• Sprite - LED矩阵图像处理控制程序库
非官方库文件
• DateTime - a library for keeping track of the current date and time in software
• Debounce - for reading noisy digital inputs ( e.g. from buttons)
• Firmata - for communicating with applications on the computer using a standard
serial protocol
• GLCD - graphics routines for LCD based on the KS0108 or equivalent chipset
• LCD - control LCDs ( using 8 data lines)
• LCD 4 Bit - control LCDs ( using 4 data lines)
• LedControl - for controlling LED matrices or seven-segment displays with a MAX7221 or MAX7219
• LedControl - an alternative to the Matrix library for driving multiple LEDs with Maxim chips
• Messenger - for processing text-based messages from the computer• Metro - help you time actions at regular intervals
• MsTimer2 - uses the timer 2 interrupt to trigger an action every N milliseconds
• OneWire - control devices ( from Dallas Semiconductor) that use the One Wire
protocol
• PS2Keyboard - read characters from a PS2 keyboard
• Servo - provides software support for Servo motors on any pins
• Servotimer1 - provides hardware support for Servo motors on pins 9 and 10
• Simple Message System - send messages between Arduino and the computer
• SSerial2Mobile - send text messages or emails using a cell phone ( via AT
commands over software serial)
• TextString - handle strings
• TLC5940 - 16 channel 12 bit PWM controller
• X10 - Sending X10 signals over AC power lines
4) 数据类型
• boolean 布尔
• char 字符
• byte 字节
• int 整数
• unsigned int 无符号整数
• long 长整数
• unsigned long 无符号长整数
• float 浮点
• double 双字节浮点
• string 字符串
• array 数组
5.软件,你好
1) Altium Designer
Altium Designer 是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统,主要运行在Windows操作系统。这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,熟练使用这一软件必将使电路设计的质量和效率大大提高,软件开启界面如图1.12所示。
Altium Designer 除了全面继承包括Protel 99SE、 Protel DXP在内的先前一系列版本的功能和优点外,还增加了许多改进和很多高端功能。该平台拓宽了板级设计的传统界面,全面集成了FPGA设计功能和SOPC设计实现功能,从而允许工程设计人员能将系统设计中的FPGA与PCB设计及嵌入式设计集成在一起。 由于Altium Designer 在继承先前Protel软件功能的基础上,综合了FPGA设计和嵌入式系统软件设计功能, Altium Designer 对计算机的系统需求比先前的版本要高一些。
我们在制作一个硬件的系统时,为了保证体积和其他因素的要求,便会制作单独的PCB板来完成。在软件上也提供了一环扣一环的操作,从原理图绘制,库文件的绘制,到生成PCB文件,最后到出板, Altium Designer相对于其他的软件也更加专业和方便。
2) Fritzing
Fritzing是个电子设计自动化软件。它支持设计师、艺术家、研究人员和爱好者参加从物理原型到进一步实际的产品,还支持用户记录其Arduino和其他电子为基础的原型,与他人分享。软件开启界面如图1.13所示。
这款软件主要用于我们日常写作教程的过程中使用,方便为了让读者更加直观清晰地了解硬件接线的方式。
3) Photoshop
Photoshop主要处理像素构成的数字图像,使用其众多的编修与绘图工具,可以有效地进行图片编辑工作。 ps有很多功能,在图像、图形、文字、视频、出版等各方面都有涉及。软件开启界面如图1.14所示
该软件虽然在我们设计硬件时使用频率较低,但在设计硬件屏幕上的画面时,起到重要的作用,也是其他软件不能完全替代的。
6.常用元器件
1) 面包板
面包板上有很多小插孔,专为电子电路的无焊接实验设计制造的。由于各种电子元器件可根据需要随意插入或拔出,免去了焊接,节省了电路的组装时间,而且元件可以重复使用,所以非常适合电子电路的组装、调试和训练。面包板如图1.15所示。
在面包板上读者们可以看到,边缘处有两条红色和蓝色的线,这表示所在行是连通的,进行硬件接线时,可以默认这两行为接地和VCC,既方便接线,又可以解决硬件接线过多时,面包板线孔过少的问题。
2) 色环电阻
硬件电路简单设计中,色环电阻因其价格低廉,成为最常用的电阻类元器件。电阻的作用是保护电路和限制个别元器件的电流大小。在设计硬件电路时,不同的模块需要用到的电阻大小也不同。下面先来看看怎样区分色环电阻的阻值大小,如图1.16所示。
四色环电阻是指用四条色环表示阻值的电阻,从左向右数,第一道色环表示阻值的最大一位数字;第二道色环表示阻值的第二位数字;第三道色环表示阻值倍乘的数;第四道色环表示阻值允许的偏差(精度)。例如,一个电阻的第一环为橙色(代表3)、第二环为灰色(代表8)、第三环为棕色(代表10倍)、第四环为金色(代表± 5%),那么这个电阻的阻值应该是380Ω,阻值的误差范围为± 5%。
3) 电容
电容也是在硬件设计中不可缺少的元器件,在设计中使用次数较多的为电解电容,优点就是价格低廉,使用方便,别看一个小小的电容,作用可大着呢!
隔直流:作用是阻止直流通过而让交流通过。旁路(去耦):为交流电路中某些并联的元件提供低阻抗通路。 耦合:作为两个电路之间的连接,允许交流信号通过并传输到下一级电路。滤波:这对DIY而言很重要,显卡上的电容基本都是此作用。温度补偿:针对其他元件对温度的适应性不够带来的影响,而进行补偿,改善电路的稳定性。 计时:电容器与电阻器配合使用,确定电路的时间常数。调谐:对与频率相关的电路进行系统调谐,比如手机、收音机、电视机。整流:在预定的时间开或者关半闭导体开关元件。 储能:储存电能,用于必须要的时候释放。例如相机闪光灯、加热设备等。如今某些电容的储能水平已经接近锂电池的水准,一个电容储存的电能可以供一个手机使用一天。 电解电容如图1.17所示。
4) 电源
在使用Arduino硬件开发时,通常需要的供电电压是3.3~ 5V,所以读者们在设计硬件电路时,可以使用Arduino开发板上的引脚给外围电路供电,也可以使用锌锰电池或者锂电池进行供电。但无论使用哪种方式进行供电,都要记得正负极不要短接或接反,否则会带来难以想象的后果。
7.数字输入
在数字电路中开关( switch)是一种基本的输入形式,它的作用是保持电路的连接或者断开。 Arduino从数字I/O引脚上只能读出高电平( 5V)或者低电平( 0V),因此我们首先面临到的一个问题就是如何将开关的开/断状态转变成Arduino能够读取的高/低电平。解决的办法是通过上 /下拉电阻,按照电路的不同通常又可以分为正逻辑( Positive Logic)和负逻辑( Inverted Logic)两种。
在正逻辑电路中,开关一端接电源,另一端则通过一个10kΩ的下拉电阻接地,输入信号从开关和电阻间引出。当开关断开的时候,输入信号被电阻“拉”向地,形成低电平( 0V);当开关接通的时候,输入信号直接与电源相连,形成高电平。对于经常用到的按压式开关来讲,就是按下为高,抬起为低。
8.数字输出
Arduino的数字I/O被分成两个部分,其中每个部分都包含有6个可用的I/O引脚,即引脚2 到引脚7和引脚8到引脚13。除了引脚13上接了一个1kΩ的电阻之外,其他各个引脚都直接连接到单片机上,如图1.18所示。
电路中在每个I/O引脚上加的1kΩ电阻被称为限流电阻,由于发光二极管在电路中没有等效电阻值,使用限流电阻可以使元件上通过的电流不至于过大,能够起到保护的作用。下载并运行该工程,连接在Arduino数字I/O引脚2到引脚7上的发光二极管会依次点亮0.1秒,然后熄灭。
程序示例:
int vaule1 = 2;
int NUM = 6;
int vaule2 = 0;
void setup()
{
for ( int i = vaule1; i < vaule1 + NUM; i ++) {
pinMode( i, OUTPUT);
} }
void loop()
{
for ( int i = vaule1; i < vaule1+ NUM; i ++) {
digitalWrite( i, LOW);
}
digitalWrite( vaule1 + vaule2 HIGH);
index = ( vaule2 + 1) % NUM;
delay( 100);
}
9.串口输入
串行通信是实现PC与微控制器交互的最简单的办法。之前的PC机上一般都配有标准的 RS-232或者RS-422接口来实现串行通信,但现在这种情况已经发生了一些改变,读者更倾向于使用USB这样一种更快速但同时也更加复杂的方式来实现串行通信。尽管在有些计算机上现在已经找不到RS-232或者RS-422接口了,但我们仍可以通过USB/串口或者PCMCIA/串口这样的转换器,在这些设备上得到传统的串口。
通过串口连接的Arduino在交互式设计中能够为PC机提供一种全新的交互方式,比如用PC机控制一些之前看来非常复杂的事情,像声音和视频等。很多场合都要求Arduino能够通过串口接收来自于PC机的命令,并完成相应的功能,这可以通过Arduino语言中提供的 Serial.read()函数来实现。
把程序下载到Arduino模块中之后,在Arduino集成开发环境中打开串口监视器并将波特率设置为9600,然后向Arduino模块发送字符A。我们会发现板载的LED亮了四次,如图1.19所示。
程序示例:
int ledPin = 13;
int val;
void setup() {
pinMode( ledPin, OUTPUT);
Serial.begin( 9600);
}
void loop() {
val = Serial.read();
if ( -1 != val) {
if ( 'A' == val) {
digitalWrite( ledPin, HIGH);
delay( 500);
digitalWrite( ledPin, LOW);
Serial.print( "Available: ");
Serial.println( Serial.available(), DEC);
}}}
10.串口输出
在许多实际应用场合中我们会要求在Arduino和其他设备之间实现相互通信,而最常见和最简单的办法就是使用串行通信。在串行通信中,两个设备之间一个接一个地来回发送数字脉冲,它们之间必须严格遵循相应的协议以保证通信的正确性。
在PC机上最常见的串行通信协议是RS-232串行协议,而在各种微控制器(单片机)上采用的则是TTL串行协议。由于这两者的电平有很大的不同,因此在实现PC机和微控制器的通信时,必须进行相应的转换。完成RS-232电平和TTL电平之间的转换一般采用专用芯片,如MAX232等,但在 Arduino上是用相应的电平转换电路来完成的。
根据Arduino的原理图我们不难看出, ATmega的RX和TX引脚一方面直接接到了数字I/O端口的0号和1号引脚,另一方面又通过电平转换电路接到了串口的母头上。因此,当需要Arduino与PC机通信时,可以用串口线将两者连接起来;当需要Arduino与微控制器(如另一块Arduino)通信时,则可以用数字I/O端口的0号和1号引脚。
串行通信的难点在于参数的设置,如波特率、数据位、停止位等, Arduino可以使用Serial.begin()函数来简化这一任务。为了实现数据的发送, Arduino提供了Serial.print()和Serial.println()两个函数,它们的区别在于后者会在请求发送的数据后面加上换行符,以提高输出结果的可读性。
将程序下载到Arduino模块中之后,打开串口监视器,如果一切正常,此时我们就可以在串口监视器上看到“Hello World”了,如图1.20所示。
11.模拟输入
模拟输入是从指定的模拟引脚读取值。 Arduino主板有6个通道( Mini和Nano有8个, Mega有16个), 10位AD(模数)转换器。这意味着输入电压0~ 5V对应0~ 1023的整数值。这就是说读取精度为: 5伏/1024个单位,约等于每个单位0.049V ( 4.9mV)。输入范围和进度可以通过analogReference()进行修改。模拟输入的读取周期为100微秒( 0.0001秒),所以最大读取速度为每秒10000次。
12.模拟输出
模拟输出即将模拟值( PWM波)输出到引脚。可用于在不同的光线亮度调节发光二极管亮度或以不同的速度驱动电动机。调用analogWrite()后,该引脚将产生一个指定占空比的稳定方波,直到下一次调用analogWrite()(或在同一引脚调用digitalRead()或digitalWrite())。 PWM的信号频率约为490Hz。
在大多数Arduino板(带有ATmega168或ATmega328),这个函数工作在引脚3, 5, 6, 9, 10和11。在Arduinomega上,为2~ 13号引脚,老版本的带有ATmega8的Arduino板只支持9, 10, 11引脚上使用。读者并不需要在调用analogWrite()之前为设置输入引脚而调用pinMode()。
本讲小结
Massimo Banzi与团队共同开发的Arduino是一款微型的,使用便捷的源代码微控制器。它激励着全世界成千上万的人去做他们认为最酷的事情——从艺术设计到卫星通信设备,让从前这些需要使用昂贵的源代码微控制器的交互式项目变得可以负担。因为,正如他所说:“当你需要去做一些伟大的事情的时候,你不需要任何人的许可。”
在如今众多的电子开发中, Arduino扮演着重要的角色。随着时代的进步, Arduino也在不断更新。最新款的Arduino 101/Genuino 101是一个性能出色的低功耗开发板,它基于 Intel ® Curie™ 模组,价格亲民,使用简单。
101不仅有着和UNO一样特性和外设,还额外增加了 Bluetooth LE 和 6轴加速计、陀螺仪,能助你更好地释放创造力,让你轻松地连接数字与物理世界。模块包含一个x86的夸克核心和一个32bit的ARC架构核心( Zephyr),时钟频率都是32MHz, Intel的交叉工具链可以完成两个核心的开发。 Intel开发的一个实时操作系统和开发框架会在2016年3月开源,但是那时并不能直接与101对接,只能通过arduino核心的动态消息盒子来操作,所以只有有限的功能可以被使用(和PC的交互通过USB接口,下载程序到flash,使用蓝牙和PWM),此款单片机使用的实时操作系统还在开发中,新的功能将于近期发布。
从Intel角度来看,能够和Arduino合作也是一大挑战,不过在挑战的背后我们也能够看出Arduino的发展前景,所以掌握此款单片机的开发,也是为学好嵌入式硬件打下坚实的基础。