第1章
入门
目标本章将向你介绍如下内容:
开源硬件Arduino的概念。
Arduino UNO R3控制板的设计。
介绍Arduino UNO R3控制板的不同特性和命名。
研究ATmega328微控制器的特性及功能。
罗列并简介其他Arduino控制板。
介绍如何扩展Arduino的硬件功能。
通过Arduino软件下载、配置并成功执行一段测试程序。
1.1概述
欢迎来到Arduino的世界!开源硬件Arduino的概念是由卓有远见的Arduino研发团队提出的,其成员包括来自意大利伊夫雷亚的Massimo Banzi、David Cuartilles、Tom Igoe、Gianluca Martino以及David Mellis等。Arduino研发团队的目标是研发一款简单易用的微控制器硬件及软件的产品线,从而使大家都能轻松发挥出处理能力。
本书延续了Arduino的设计理念,旨在能服务更大的读者群体。第1章和第2章为想要快速了解Arduino控制板及其易用软件平台的你而准备。如果你对ATmega328主微控制器的更多特性感兴趣,请参阅第3~8章,我们将向你详细解说。
秉承Arduino开源的精神,贯穿全书包含大量的软硬件样例。希望你能在了解Arduino的同时乐在其中,也能为你基于Arduino的项目开发收集有用的资源。
1.2入门
本章旨在让你快速入门基于Arduino的硬件平台。为了能使用基于Arduino的控制器,你需要如下软硬件工具:
一个基于Arduino的硬件控制器平台
一款兼容Arduino的电源
Arduino软件
Arduino硬件
. 贯穿全书都将使用Arduino UNO R3控制板。位于美国科罗拉多州博尔德的SparkFun Electronics出品的Arduino入门套件如图1.1所示,售价约为100美元。这款套件由如下元件组成:Arduino控制板、一根用于连接电脑主机编写程序的USB数据线、一块可以用来搭建外部原型硬件、跳线以及许多其他常用电子元件的小面包板。本章后面内容中会介绍一些其他的基于Arduino的控制板套件。UNO R3控制板可以单独购买,售价在30美元。
图1.1Arduino UNO R3入门套件(SparkFun Electronics许可使用)
电源
在项目开发期间,Arduino控制板能够直接通过USB端口供电工作。不过,我们强烈推荐使用外部电源供电。这能够满足有大电流工作要求的项目开发需求,从而避免USB端口供电不足的问题。SparkFun Electronics推荐使用DC 2.1mm中心正极插头的7~12V适配器电源供电。你能够在大量的电子类产品销售公司或网站上购买到这款通用的适配器。例如,Jameco编号为133891的电源模块就能满足要求:9V DC输出电压,额定输出300mA电流,同时使用2.1mm中心正极插头。其售价不到10美元。
Arduino软件
同时你还需要称为Arduino开发环境(Arduino Development Environment)的Arduino软件。你可以通过Arduino官网(www.arduino.cc)免费下载。在本章末的应用部分,我们将向大家介绍如何使用软件、加载驱动并且教会大家在Arduino UNO R3控制板上运行一个样例程序。
在接下来的内容中,将说明Arduino UNO R3控制板以及其主控器Atmel公司的ATmega328的性能和设计布局上的信息。同时会讨论其他一些基于Arduino的控制板,以及如何使用扩展板的概念去扩展Arduino UNO R3控制板的功能。
1.3Arduino UNO R3
Arduino UNO R3控制板如图1.2所示。从左边说起,控制板上安装有一个USB接口,用于通过电脑主机对其进行编程(代码烧录)。控制板也可以通过在系统编程技术(In System Programming, ISP)进行编程,后面我会对其进行更详细介绍。6引脚的ISP编程接口在控制板右侧的边缘。
图1.2Arduino UNO R3设计布局(该图经Arduino团队(www.arduino.cc)许可使用)(CS-SA-BY)
该控制板内置USB转串口电路,通过USB转串口芯片实现电脑主机与Arduino板载的ATmega328处理器的通信系统进行数据通信。Arduino UNO R3同时设计有多个小型贴片LED指示灯,从而为你的开发提供串口发送和接收灯光指示,以及一个额外的可控LED指示灯,便于测试使用。控制板顶部的排母接口包括:模拟量信号采集参考电压接口、PWM脉宽信号输出接口、数字信号输入/输出(I/O)接口以及串行数据通信接口。而在控制板底部的排母接口则包括:模数转换系统的模拟信号输入接口、I2C通信接口以及供电端子。最后剩下的是位于板子左下方的外部供电插座。通过板子上下两排的排母插座也能够非常方便地连接Arduino扩展板,为你的主控器扩展额外的功能。
Arduino主处理器——ATmega328
Arduino UNO R3的主处理器使用的是Atmel公司的ATmega328。它是一款拥有28个引脚的8位微控制器。ATmega328的架构基于精密指令集计算机(RISC)的概念,使其拥有在20MHz的主频下每秒完成2000万个指令(MIPS)的能力。
ATmega328微控制器包含大量的功能,如图1.3所示。其硬件功能可归纳为如下几个系统:
内存系统
端口系统
定时器系统
模数转换器(ADC)
中断系统
串行通信模块
图1.3Arduino UNO R3控制板
1.4案例:自主迷宫导航机器人
在深入讲解Arduino UNO R3控制系统前,让我们先通过实际的案例来看看前面介绍的这些系统是如何运作的。Graymark公司(www.graymarkint.com)开发了许多成本低并且性能优越的机器人平台。在这个样例中,我们将使用Arduino UNO R3对Blinky 602A机器人进行控制。
Blinky 602A机器人套件包含搭建一个寻线机器人的硬件以及机械支架。机器人的电子处理元件主要由模拟电路构成。机器人通过2个3V直流电机对左右轮独立驱动从而控制运动速度及运动方向。而第3个无电机的支撑轮为机器人提供了平稳的支点。
在这个样例中,我们将会为Blinky 602A机器人平台安装3个夏普GP2D12红外距离传感器,如图1.4所示。机器人将会被放置在一个有白色反射墙包围的迷宫中。这个案例的目标是让机器人能够自主地检测到墙的位置并且自动寻路通过迷宫(如图1.5所示)。机器人在运行前对迷宫的环境一无所知。在Arduino UNO R3控制器中烧录有机器人的控制算法。
图1.4Blinky机器人设计
图1.5Blinky机器人导航迷宫
1.4.1结构图
结构图是一种可视化的工具,通过分割的方式将一个大的项目或目标分为多个可行的小部分。它也有助于罗列出机器人需要使用哪些控制系统中的接口或功能。结构图中的箭头用于指示程序控制机器人的不同部分的数据流方向。图1.6是这个机器人项目中的结构图。
如图1.6所示,机器人有3个主要的系统:电机控制系统、传感器系统以及数字输入/输出控制系统。这3个系统之间通过主控算法桥接,从而实现机器人根据传感器感应并避让墙壁,使其能自主导航走出迷宫。
图1.6Blinky机器人结构图
1.4.2UML活动图
UML(Unified Modeling Language,统一建模语言)是一种面向对象的建模语言,它是运用统一的、标准化的标记和定义实现对软件系统进行面向对象的描述和建模。机器人的UML活动图如图1.7所示。正如你所看到的,在机器人系统启动之后,机器人将循环执行收集数据、判断动作并控制电机的行为,以操纵自己走出迷宫。
1.4.3Arduino UNO R3系统
安装在机器人平台头部边缘的三款红外距离传感器(左、中、右)用来侦测迷宫中的墙壁。传感器的输出值被接入3个ADC(模数转化)的端口。机器人的电机通过PWM端口进行控制。Arduino UNO R3系统通过具有足够驱动能力处理电机需要的最大驱动电流的三极管对电机进行控制。整个系统能够使用一块9V的电池或者一个额定输出电流在2A的电源模块进行供电,电源会被接入带有5V稳压的电源管理系统。我们会在后面几个章节对电子设备接口进行详细描述。
通过这个样例,我们可以了解搭载在Arduino UNO R3上的不同传感器及控制系统能为Blinky机器人带来的不同功能特性。在接下来的几节中,我们将介绍关于Arduino UNO R3处理器和开发软件的信息。
1.5Arduino开源原理图
整个Arduino的产品线都是围绕着卓有远见的开源软硬件概念而设计的。其理念就是通过用户开放、分享软硬件的设计来刺激各种新创意,从而在用户中建立Arduino的概念。也正基于这种理念,Arduino团队公开了Arduino UNO R3控制板的原理图(如图1.8所示)。
图 1.8 Arduino UNO R3开源原理图(该图经Arduino团队许可使用(www.arduino.cc))(CS-SA-BY)
1.6其他基于Arduino的硬件平台
现在已经有大量基于Arduino的硬件平台。你能够通过各种开源硬件供应商购买到这些平台,如美国著名的SparkFun Electronics(www.sparkFun.com)。图1.9向我们展示了来自SparkFun的具有代表性的产品设计。左边为嵌有ATmega328的Arduino Lily Pad,其使用的主处理器和Arduino UNO R3是一样的。Lily Pad的主要设计理念是一款可穿戴并可以直接清洗的电子控制器。
图1.9Arduino变种控制板(该图经SparkFun Electronics许可使用)
最下面的一个则是内置ATmega 2560芯片的Arduino Mega控制板。它拥有54个数字I/O端口,其中14个可配置成PWM输出模式、16个ADC模数转换器以及4通道串行数据通信能力,功能强大。而右侧所展示的则是Arduino Mini Stamp。其设计核心为体积小巧,同时拥有丰富功能ATmega168处理器。
1.7扩展Arduino平台的硬件功能特性
Arduino硬件平台的设计使能够运用插卡的概念为你的系统添加外部的硬件从而获取各种丰富的功能。一般我们将这些功能扩展模块称为扩展板(Arduino Shield),如图1.10所示。这些扩展板的接口设计一般都能直接匹配Arduino控制板的硬件接口。图1.10展示的这一款扩展板就提供了一块原型电路焊接区、一个控制器重启按键、一个常见的按钮以及两个发光二极管即指示灯(LED),便于进行项目原型的电路开发及调试。
图1.10Arduino扩展板(该图经SparkFun Electronics许可使用)
本节我们主要简介了Arduino UNO R3以及Arduino衍生的控制板。在1.8节中,我们将一起来看下Arduino开发软件的功能并了解如何对Arduino控制板进行编程。
1.8Arduino软件
接下来,我们将简单介绍如何使用Arduino开发环境对Arduino UNO R3控制板编程。首先,我们需要下载并安装Arduino IDE开发软件。
在Arduino首页(www.arduino.cc)中包含具体的软件安装简介,如何安装USB驱动以及如何在Arduino UNO R3控制板上运行一个样例程序的详细步骤。限于图书篇幅的原因,在这里我们就不重复这一部分的内容,你可以通过官网具体了解。Arduino官网的Getting Started选项卡中提供了这一部分详细并易于理解的具体内容,只需要花上很短的时间,你就可以完成软件下载、安装及其与Arduino控制板进行编程通信的步骤。(Getting Started入门链接:http://arduino.cc/en/Guide/HomePage。)
1.9Arduino UNO R3/ATmega328芯片硬件功能
正如我们之前所提到的,Arduino UNO R3控制板的主控芯片是来自Atmel公司的ATmega328芯片。ATmega328的引脚及框架说明图如图1.11及图1.12所示。接下来将详细介绍处理器。
图1.11ATmega328引脚图(经Atmel公司许可使用)
图1.12ATmega328框架图(经Atmel公司许可使用)
1.9.1内存单元
ATmega328芯片主要内置3个内存单元:电可擦可编程只读存储器(Electrically Erasable Programmable. Read-Only Memory),EEPROM)、静态随机存取存储器(Static Random Access Memory,SRAM)以及用于数据存储的字节寻址EEPROM。接下来简单了解下这3种内存单元的性能。
1.9.1.1系统内可编程闪存EEPROM
大容量的可编程闪存EEPROM是用于存储程序的。它能够以单个单元的形式被擦除并重复编程。此外,如果一个程序需要大量的常数表,它可以在程序中以全部变量的形式与其他程序一起被烧录到闪存EEPROM空间内。闪存EEPROM空间内的非易失性是指,当微控制器掉电时,存储器中的内容不会改变或者丢失。ATmega328配备有32KB的板载可重复编程闪存EEPROM空间。这个内存单元被组织成16K个位置,每个位置上包括16位(即2个字节的内容)。
1.9.1.2字节寻址EEPROM
在程序执行时,字节寻址内存用于存储永久性或会被反复调用的变量。它也是非易失性的。它在程序执行时,常被用于对系统故障和故障数据进行记录。同时,在电源故障期间它能够有效地帮助存储必须保留的数据,但需要周期性充电才能维持工作。使用这类内存的应用主要是存储系统参数、电子锁组合以及电子门解锁序列等信息。ATmega328芯片中配备1024B的EEPROM。
1.9.1.3静态随机存取存储器
静态随机存取存储器(SRAM)存储是易变的。这也就是说,如果你的微控制器掉电时,所有的SRAM内存区内所存储的内容都将被清空丢失。在程序执行期间,所有的内容能够被读写。ATmega328芯片内置2KB自己的SRAM空间。其中一小部分的SRAM空间被分配给了通常的单片机数据寄存单元和板载I/O端口及外围子系统的状态存储。在附录A和附录B中,我们分别提供了一个完整的ATmega328芯片的寄存单元列表及头文件信息。程序运行时,RAM区一般被用于存储全局变量、支持动态内存分配的变量,并为堆栈提供位置(将在后面具体介绍)。
1.9.2端口系统
Atmel公司的ATmega328芯片配备有3个8位数字输入/输出(I/O)端口,被指定为PORTB(8位,PORTB[7:0]),PORTC(7位,PORTC[6:0])以及PORTD(8位,PORTD[7:0])。所有的这些端口还有额外的功能(之后我们再具体介绍)。接下来我们先初步了解下基本的数字I/O端口功能。
如图1.13所示,每个端口都有3个相关的寄存器:
数据寄存PORTx——用于对端口写入输出状态。
数据方向寄存器DDRx——用于指定引脚方向:输出(1)、输入(0)。
输入引脚地址PINx——用于从端口读取输入数据。
图1.13b描述了将端口配置为输入或输出模式的设置。如果选择为输入,引脚可以被用于信号输入引脚或者工作在高阻抗(Hi-Z)模式下。
图1.13ATmega328端口配置寄存器
一般来说,在程序运行的第一步,我们就会对控制板的所有端口进行初始化,配置其输入/输出的工作状态以及初始值。通常一个端口上的8个引脚是同时进行配置的。在后面的章节中,我们会具体谈谈如何配置端口引脚的状态以及读写其内容。
1.9.3内部系统
这一节主要介绍ATmega328芯片的内部系统。主要说明微控制器内部系统的一些功能特性。这些内置功能使得微控制器能够实现较为复杂的功能和逻辑。
1.9.3.1时间基准
微控制器是一个复杂的同步状态机。它根据用户编写的程序以连续的方式对程序的每一步做出响应。微控制器的执行序列是一个可预见的读取–解码–执行的步骤。每一个独特的汇编语言程序指令发出一系列的信号,从而控制微控制器的硬件来完成指令有关的操作。
微控制器有序执行这一系列动作的速度取决于一个精准的时间基准,称为时钟。时钟源被连接到整个微控制器的路由系统中,从而提供所有外围子系统的时间基准。ATmega328芯片能够使用一个用户可配置的内部RC(电阻–电容)作为时间基准,或者接入外部时钟源。通过选择可编程熔丝位能够启动内部RC时钟。内部时钟提供4个时钟工作频率,分别为:1MHz、2MHz、4MHz或8MHz。
为了能够提供更多的工作频率,你同样可以配置微控制器工作在外部时钟源模式下。为了提高准确度和稳定性,外部时钟源能够使用一个外部的RC网络、陶瓷谐振器或晶体振荡器。系统设计师需要根据实际应用来选择适当的时间基准频率以及时钟源设备。
1.9.3.2定时子系统
ATmega328芯片配备有辅助的定时器子系统,通过该系统用户能够生成精确的输出信号、测量输入的数字信号的特性(如周期、占空比以及频率等)或者对外部事件进行计数。具体地说,ATmega328有2个8位定时器/计数器以及1个16位计数器。在本书的后面几个章节我们会具体讨论定时器系统的操作、编程及应用。
1.9.3.3脉宽调制通道
脉冲宽度调制或者说PWM信号的特性是固定的频率和不同的占空比(duty cycle)。占空比是指重复的信号为逻辑高电平状态在信号周期内的时间百分比。它能用公式表达为:
占空比[%]=占用时间/时间周期×(100%)
ATmega328芯片内置4路PWM输出通道。其PWM通道拥有从系统时间基准分割出的多路PWM子系统时钟频率的灵活性,从而使用户能够根据实际需求,生成各种各样的PWM通道信号(从高频率低占空比的信号到低频率高占空比的信号)。
PWM信号已经在实际应用中得到广泛使用,例如,私服舵机位置控制以及直流电机转速控制等。在本书后面的内容中我们会具体讨论PWM系统的操作、编程及应用。
1.9.3.4串行数据通信
ATmega328芯片配备有不同的串行数据通信子系统,其中包括:通用同步/异步串行收发器(Universal Synchronous and Asynchronous Serial Receiver and Transmitter, USART)/串行外设接口(Serial Peripheral Interface, SPI)以及两线串行通信接口(I2C/TWI)。所有这些系统通过共同的串行方式来传输数据。在串行通信传输时,计划发送的数据以单个位的形式在固定的时间里从发射端被推送到接收端。
串行USART
串行USART一般用于发送器和接收器之间进行全双工(双向)数据通信。使用USART端口能实现ATmega328微控制器与其他独立设备的数据收发。USART典型应用在于异步数据通信,也就是说,它并不需要接收器和发送器之间使用一个通用的时钟系统来解决它们的同步问题。在USART端口发送字节数据时,是通过发送起始位和终止位数据的方式来维持接收器和发送器之间同步的。
ATmega328芯片的USART端口灵活性很强。它拥有可配置系列数据通信速率的功能,常称为波特率。USART端口也支持携带1个或者2个终止位数据,发送5~9个字节位的数据。此外,ATmega328配备硬件生成的校验位(偶数或奇数)和奇偶校验硬件的接收器。单奇偶校验位可以用来捕捉到一个字节数据中的单个数据位的发送错误。同时USART可配置工作于同步模式。在本书后面的内容中我们会具体讨论USART的操作、编程及应用。
串行外设接口(SPI)
ATmega328芯片的串行外设接口同样也能够用于接收器和发送器之间的两路串行数据通信。在SPI系统中,发送器和接收器需要共享一个通用的时钟源。因此,在发送器和接收器间需要通过一根额外的时钟线来连接,但是与USART通信相比,这一特性也为SPI通信带来了更高的数据传输速率。
SPI拥有16位同步移位寄存器,其中一半是8位数据发送寄存器,而另一半则是8位的数据接收寄存器。发送器通常被指定为主机,因为它需要为接收器和自身之间的连接提供同步时钟源。接收器称为从机。在本书的后面几个章节我们再具体讨论SPI的操作、编程及应用。
两线串行通信接口(I2C / TWI)
TWI子系统允许系统设计师使用两线互连的方案将一系列相关设备,如微控制器、传感器、显示器、记忆存储器等设备,以网络的形式连接到同一系统中。TWI接口最大能同时连接128个设备。其中每个设备具备独立的设备地址,并且能在两线的总线上以高达400kHz的速率进行通信。因此通过TWI接口设备之间在小范围的网络中自由交换数据。我们在本书后半部分会具体讨论TWI系统。
1.9.3.5模数转换器
ATmega328芯片配备8路模数转换器(ADC)子系统。ATmega328芯片的模数转换器系统拥有10位的分辨率。这也就意味着,从0~5V的模拟电压信号接入微控制器的ADC系统后,在微控制器眼中,这个电压信号就是一个从0~1024的二进制数值信号(从十六进制的00到十六进制的3FF)。因此它也提供了ATmega328芯片感应大约4.88mV电压变化的精度。在本书后面几章,我们会深入讨论ADC系统的操作、编程及应用。
1.9.3.6中断系统
一个程序的常规执行步骤根据指定的指令序列进行。然而,往往在实际应用中,我们需要对一些源自微控制器外部或者内部的较高优先级的错误或者状态进行快速响应,因而需要打断常规的程序执行步骤。在这些优先级较高的事件发生时,微控制器必须暂停正常运行并执行特殊事件的行为称为中断服务程序。一旦高优先级事件执行完成后,处理器会返回并继续执行常规的程序步骤。
ATmega328芯片配备26个中断源。其中两个作为外部中断源,其余中断为微控制器上的外围子系统的高效运作提供支持。我们在后面内容中再继续讨论中断系统的操作、编程及应用。
1.10应用:Arduino设备套件
就像艺术家一定会有一本艺术创作使用的草稿本,我们在本书中也会用到一套Arduino设备套件来开发各种有趣的项目。延续Arduino的DIY精神,我们自己拼凑了这个套件,如图1.14所示。其中包括:
一个黄色Pelican小型设备盒(#1040)
一块Arduino UNO R3开发板
两块来自Jameco(美国电子类产品销售网站)3.3×2.1英寸无焊面包板
一块黑色的有机玻璃
我们并不想提供更多的元件细节,更推崇的是大家自己通过想象去开发并构建属于自己的Arduino设备套件。