Arduino的互动产品平台创新设计
2012-09-25杨继志郭敬
杨继志,郭敬
(北京航天试验技术研究所 机电技术事业部,北京 100074)
引 言
Arduino是一系列基于单片机的人机互动产品开发平台,由于其具有高度的模块化特点,有时也叫它“电子积木”。它的硬件平台是开放的,任何人都可以在Arduino官方网站上下载最新的PCB设计进行复制。Arduino的硬件平台包括基于AVR单片机的主控制电路板,以及大量的各式输入/输出电子模块。输入/输出模块包括开关输入模块、温度压力传感器输入模块、超声测距传感器输入模块、各类显示输出模块、电机控制模块等,甚至还有以太网接入模块。由于Arduino具有丰富易用的模块,已经在各类机电创新设计比赛中得到广泛应用。在软件方面,Arduino有一个属于自己的基于Eclipse的IDE软件开发环境,开发语言采用类C++语言的高级语言,容易被使用者掌握。有大量的库文件可以通过互联网下载免费获得,大大简化了程序开发工作。由于Arduino丰富的外围模块、容易掌握的开发语言和环境,大量的库支持,使得基于Arduino的电子互动产品设计越来越多。从Arduino诞生的2005年到2011年,已有超过15万块的Arduino模板售出[1]。本文介绍了Arduino的硬件、软件,并给出了采用Arduino开发互动产品的实例,使初学者对它有一个基本的认识。
1 Arduino硬件
1.1 Arduino主控板
Arduino的主控板采用AVR单片机,最新的版本是UNO,与之前的版本不同,它不再使用FTDI USB串行驱动芯片,而是把Atmega8U2编程为一个USB设备。相对于它的前几代,这带来了许多好处。首先是价格降低了,更重要的是这使得Arduino在PC端可以显示为一个USB设备,就像是一个鼠标或游戏操作手柄,这开辟了Arduino的新用途[1]。总之,Arduino的主控板就是一个单片机控制板,在这一点上与其他单片机控制板并无本质的区别,但是由于其拥有丰富的系列产品、大量的开源软件,让Arduino得到了更为广泛的应用和支持。
1.2 Arduino输出模块
市场上已经出现了围绕Arduino Duemilanove开发的很多输出模块:有视觉输出的,如LED灯控制、LCD控制、触摸屏控制等;有声音输出的,如蜂鸣器和扬声器模块;还有物理系统的控制模块,如各类直流小马达、步进电机、机器人舵机等。另外,还可以利用AVR单片机的PWM输出口进行D/A转换。这些模块大大拓展了Arduino作为一个单片机平台的用途。其中基于LN298设计的直流马达控制模块在各类机器人项目中采用得很多,这种模块能够同时控制两路直流马达,与Arduino-Duemilanove之间的连接也十分简便。输出单元的模块化使搭建基于Arduino系统的应用项目很方便。
1.3 Arduino输入模块
最一般的输入如各类按钮、位置行程开关等都有相应的模块可以购买。其他诸如超声测距、压力传感器、温度传感器、倾角传感器等也有相应的模块可以直接应用。还有记录数据和通信用的模块、如SD卡模块,以太网接入模块等,这让Arduino不仅仅作为一个控制终端使用,还可以进行数据的存储和简单处理,以及与外界系统通信等,可见其输入模块资源丰富。从输入的信号来看,可以分为数字量的信号输入(如以上的开关模块等),模拟量的信号输入(如温度、压力传感器模块),通过总线网络方式的数据输入(如采用各类通信协议的传感器模块等)。
2 Arduino软件
2.1 Arduino编程语言
Arduino编程语言是建立在C/C++语言基础上的。Arduino语言把AVR单片机(微控制器)相关的一些参数设置都参数化了,不用开发者去了解其底层,对AVR单片机了解不多的用户也可以容易地开发基于AVR的项目。需要注意的是,Arduino的语言与C语言运行机制还是有一些区别的,特别是在项目程序中必须包括setup和loop两个函数。setup函数在系统上电或复位后运行一次,因此一般用户在其中做一些初始化工作,如设定串口通信的波特率等,一些一次性的工作也可以放在这个函数中运行,如下文中的写SD卡文件的例子程序。Loop函数是Arduino软件项目的主体,系统上电并且运行完成setup函数后,就进入loop函数,并且该函数是一个无限循环的过程,这一点需要开发者特别注意,这与C语言的void main(){}是有很大区别的。loop函数相当于下面这样一个无限循环过程:
在系统setup执行之后,总是进入这个函数,开发者需要把自己的程序放在这个函数内运行。
2.2 Arduino开发环境
Arduino的开发环境很简洁,用户可以在其官方网站上免费下载使用,IDE如图1所示。可以看到,在一个简单的菜单和工具条下,就是IDE的编程窗口和一个串行通信监视窗口。其中工具条包含了保存打开文件、向Arduino板下载程序等主要功能,与一般的Windows软件并无不同。在编程窗口下是一个串口监视器窗口。因为Arduino开发板没有专门的显示平台,在许多程序的调试过程中需要Arduino传输给上位机一些信息以便于开发者判断程序的运行状况,或者得到程序的运行结果。这些结果可以通过串口监视器显示,开发者也可以通过该窗口向Arduino板发送一些信息,极大地方便了项目的开发。
图1 Arduino的IDE
3 Arduino平台开发实例
3.1 用Arduino读写SD卡
SD卡体积小,价格便宜,因此在许多工业数据记录和家用电子产品中有越来越多的应用。Arduino可以通过SPI接口与之通信,进行诸如建立文件、删除文件、向文件中添加内容、修改文件等操作,这样采用Arduino配合SD卡可以开发数据记录设备。
Arduino与SD卡的简单连接,只需要6只电阻和1张SD卡,通过软件模拟的方式实现SPI接口,Arduino与SD卡连接电路如图2所示。
图2 Arduino与SD卡连接电路
由于SD卡的操作电压为3.3V,而Arduino的逻辑电压为5V,因此需要用起分压作用的电阻(本文采用了Josh Adams书中的验证性电路),在实际的应用中最好采用分压模块以保证卡和Arduino板的安全。之后在网址http://code.google.com/p/sdfatlib/下载 Bill Greiman开发的SdFat.h和SdFatUtil.h头文件和库文件,并安装到Arduino安装目录中的库文件夹中就可以使用了。简化程序如下:
将该程序下载到Arduino主控板内即可向SD卡内建立一个新的文件,并写入"something you want"字符,当然也可以根据需要写入想要记录的信息。
程序的开头包含了两个头文件:SdFat.h和SdFatU-til.h。这两个头文件定义了一些操作SD卡必需的类。之后建立4个有关操作SD卡的对象。然后自定义了一个向SD卡内写一个字符串的函数,这个函数需要一个文件的引用和一个字符串作为参数。setup函数是Arduino软件项目中必须有的,做一些运行的初始化工作。这个实例程序由于只是完成简单的写文件操作,因此对文件的写操作在这个函数中完成。函数依次完成了设定SD卡的通信模式为SPI模式、打开卡的根目录、建立文件名为testfile.txt的文本文件、给文件添加时间信息、向文件内写入文件内容、关闭文件。从以上的过程中看,采用Arduino操作SD卡上的文件与采用C语言操作PC上的文件十分相似,这也是Arduino易用性的体现,再一次验证了采用Arduino开发电子互动产品的方便性。
结 语
Arduino是一个开放的单片机开发人机互动产品的软硬件平台,由于它有丰富的软硬件资源而且易于使用,得到了广泛的应用,特别是在电子竞赛、电子艺术品开发等方面。因此,有必要研究它的应用,拓展其应用范围。
[1]Josh Adams.Beginning Arduino[M].[S.l.]:Apress,2010.
[2]Massimo Banzi.Getting Started with Arduino[M].[S.l.]:Make,2008.