Arduino基础知识.docx
《Arduino基础知识.docx》由会员分享,可在线阅读,更多相关《Arduino基础知识.docx(17页珍藏版)》请在冰豆网上搜索。
Arduino基础知识
Arduino是一款价格不高、易于使用的电子平台。
包括硬件和软件在内的整个平台是完全开源的,并且使用的是松散地基于C/C++的语言。
Arduino是为希望尝试创建交互式物理对象的实践者、喜欢创造发明的人以及艺术家构建的。
这个三部分系列将从基本的Arduino硬件开始,并使用它创建名为“'Duinotag”的交互式激光游戏,玩家可以使用几乎从头开始构建的设备玩tag游戏。
在“构建基于Arduino的激光游戏”的第1部分中,我们将构思作为'Duinotag的一部分的基本预备试验。
开始之前
无论您是Arduino新手还是经验丰富的构建者,此项目都有适合您的内容。
没有比创建交互式物理对象更令人满意的事情了,因为在需要中断或者需要修改时,您知道所有部件的位置以及所有部件的工作原理。
'Duinotag枪是适合独立完成或与朋友共同完成的优秀项目。
要完成此项目,您至少应当基本了解电子学(您应当知道寄存器是什么,但是不必知道其中的深奥原理)并且了解编程(您应当知道循环和变量是什么,但是您不必解析BigONotation)。
您可以勇敢地进行动手实践。
关于本系列
在本系列中,我们将使用Arduino技术来创建名为'Duinotag的基本交互式激光游戏:
∙第1部分:
了解一些Arduino基础知识,布置项目,并且做一个帮助您了解红外线工作原理的实验。
∙第2部分:
构建和测试'Duinotag枪的接收器部分,包括测试。
∙第3部分:
构建发送器并完成'Duinotag枪。
关于本教程
要继续学习本教程,您无需具有任何电子学工作经验,尽管使用电子元件的经验肯定对您有用。
对于微控制器经验也是如此。
如果您使用过微控制器,则有一定的优势,但是记住Arduino平台非常适合没有相应经验的人员。
首先,您应当愿意拓展自己的技能。
使用电子器件和微控制器会是一种有益的经验。
大多数软件工程师没有机会为与物理世界交互的设备编写代码,而Arduino提供了使用交互式设备的低成本入口点。
本教程是“构建基于Arduino的激光游戏”三部分系列的第1部分,将主要介绍Arduino基础知识。
我们将开始使用Arduino,了解语言基础知识和API。
我们将为'Duinotag项目做准备,包括设计基础和整合部件列表。
我们将了解如何在线订购部件、去哪里购买以及需要哪些部件。
最后,使用一些采购的元件和一些基本测试代码,我们将演示控制枪械操作的基本原理
统要求
对于本教程,我们需要一些工具和设备:
具有USB端口的计算机
虽然从技术的角度来说并不合适(许多类型的Arduino硬件接口都是基于旧式串行端口的),但是本系列在撰写时假定您使用的是基于USB进行通信的模型。
Arduino软件可用于Microsoft®Windows®、MacOSX和Linux®(32位和AMD64位)。
ArduinoDiecimila
这是本教程中使用的Arduino硬件的具体模型。
您可以替换ArduinoDuemilanove。
请从正规的网上经销商那里订购一个。
要获得链接,请参阅参考资料。
USBA-B线
这是类似于已经连接到打印机上的一根USB线。
基本的5mm红色发光二极管(Light-EmittingDiode,LED)
您可能已经有一个,或者可以在RadioShack或者从网上经销商那里购买。
闪光灯
越亮越好。
Arudino软件
要下载Arudino软件,请参阅参考资料。
Arduino的安装和设置指南
要下载Arduino安装指南,请参阅参考资料。
构建基于Arduino的激光游戏,第1部分:
Arduino基础知识
用开源硬件与软件平台Arduino开始创建电子项目
Arduino简介
在本节中,我们将介绍Arduino硬件的基础知识、如何设置,并简单介绍如何编写软件。
Arduino是什么?
简言之,Arduino板是一个微控制器—具有各种输入管脚和输出管脚的小型计算器。
使用这些管脚,您可以创建无数交互式设备,包括像闪光灯一样简单的设备,以及通过各种输入创建使用伺服系统和引擎的复杂行为的复杂设备。
第一个Arduino是2005年1月由米兰交互设计学院的两位教师—DavidCuartielles和MassimoBanzi—创建的。
要获得介绍Arduino开发人员的在线杂志文章,请参阅参考资料。
Arduino平台由两部分组成:
硬件(包括微控制器、电路板等)和软件(编程接口和语言)。
平台的两个部分都是开源的。
如果需要,您可以下载Arduino的图表、购买需要的所有独立部件、切割电路板并从头开始制作一个电路板。
有很多用于这一用途的各种项目(如Freeduino)。
图表和CAD文件已经在CreativeCommonsShare-Alike许可下发布。
用于编写Arduino的软件也是开源的。
它是用Java™编程语言编写的并且是在GPL(有一些已经在LGPL许可下发布的C/C++微控制器库)下发布的。
有几个可用的微控制器平台,并且许多平台都实现相同的目的:
易于编程、与微控制器进行交互、将所有内容封装到一个包中等等。
同样地,Arduino旨在提供一个简单的界面和一个将所有功能集于一身的包,同时尝试提供其他优点:
低成本
可以从头开始构建便宜的Arduino板,并且预组装的组件十分便宜。
ArduinoDiecimila花费大约35美元。
跨平台软件
获得适用于MicrosoftWindows、MacOSX和Linux的Arduino软件。
简单的语言
Arduino开发人员尝试使语言可以被初学者轻松掌握,但是对于高级用户足够灵活。
开放源码
Arduino从上到下完全是开源的。
如果需要构建或修改软件,您可以随意执行。
此外,Arduino的官方Web站点包含丰富的维基,其中的代码样例和示例都是免费共享的。
有大量可用的Arduino信息。
最佳起点位于官方Web站点(请参阅参考资料)。
花一些时间阅读该站点中的优秀介绍性信息。
入门
要与Arduino硬件进行交互,您需要安装软件。
下载适用于您的操作系统的软件并遵循相应的分布安装和设置指南(请参阅系统要求)。
它们遵循相同的步骤:
1解压缩软件
2安装Arduino的USB驱动程序
3连接Arduino板
4启动软件
5上传示例
我们将不会详细介绍每个步骤,因为这些步骤将随着环境的不同而变化。
让我们讨论一下软件和Blink示例。
注:
按照Arduino的说法,独立的脚本和程序被称为“sketches”。
在启动软件并装入Blink示例后(根据入门指南中的说明),您应当会看到类似图1的内容。
这里简要介绍一下该界面,顶部按钮行将控制基本任务,如编译、创建和保存文件、将代码上传到Arduino板中以及打开或关闭SerialMonitor(稍后还有更多任务)。
中间窗格包含Blink示例的所有代码,并且底部窗格将显示控制台输出、编译错误和序列消息(打开SerialMonitor时)。
目前,让我们将精力放在中间的窗格上并讨论Arduino语言。
Arduino语言基础知识
Arduino语言是基于C/C++的,并且如果您以前使用过这种语言,则应十分熟悉它的构造函数和特性。
虽然完整回顾该语言不在本教程范围内,但是让我们剖析Blink示例并了解一点该语言的知识。
如果您已经可以熟练使用代码,则这些内容可能有些过于简单,因此如果您愿意获取一本手册并进一步深入研究,请随意查阅更多语言参考(要获得更多语言参考,请参阅参考资料)。
首先,查看大块注释。
Arduino语言中的注释是用两种样式编写的。
清单1.块样式
*/
*BlockStylelikethis
*/
也可以用内联样式编写。
清单2.内联样式
//inlinelikethis
接下来,注意声明一个变量:
intledPin=13;。
从这一行可立即看出Arduino语言中的行都是以分号为结尾的。
此外,从中可以了解在Arduino语言中声明变量所需的几乎所有内容。
语法为:
声明变量类型,声明变量名,设置变量的初始值。
除了整型之外,Arduino语言还支持无符号的整型、布尔型、字符型、无符号的字符型、字节型、长型、无符号的长型、浮点型、双精度型、字符串型和数组型。
在Arduino语言参考中查找每种数据类型的详细信息,但是花一些时间了解一下数组类型。
在声明数组时,清单3中所示的每种方法都是正确的。
清单3.声明数组的方法
intfourlong[4];//createsanemptyarray,4elementslong
intnolength[]={8,18,32,64};//thecompilerwillfigureouthowlongthisarrayis
intsetboth[4]={8,18,32,64};//Thiscreatesa4elementarray
//andsetstheinitialvalue
charsomeword[7]="fizbin";//Youneedtoaddoneextraelementforanullcharacter
如果您拥有Web开发背景,则这些数组可能看上去有点奇怪。
不必担心。
在开始使用后,这些数组就更容易理解了。
注:
数组是零索引的(zero-indexed)。
清单4显示了setup函数。
清单4.setup函数
voidsetup()
{
pinMode(ledPin,OUTPUT);
}
每当Arduino板被重置时,就运行一次该函数。
每个sketch都必须有setup函数,即使该函数为空。
在这种情况下,setup函数用于设置Arduino硬件中的一个管脚的模式。
目前忽略pinMode语句并查看该函数的结构。
通过声明函数的返回类型(在这种情况下,void表示函数将不返回值)和函数名来声明函数。
在函数名后,请在括号内声明所有必要参数。
setup函数将不接受参数,但是如果需要创建一个接受一个或多个参数的函数,则只需像声明变量一样声明参数。
清单5.声明参数
voidsomeFunction(inta,intb=2)
最后,我们会看到函数代码是用大括号括起来的。
setup函数之后是名为loop的另一个函数。
清单6.loop函数
voidloop()
{
digitalWrite(ledPin,HIGH);
delay(1000);
digitalWrite(ledPin,LOW);
delay(1000);
}
在执行了setup函数后,将不确定地无限次调用loop函数,直至Arduino板被关闭,或者直至某个重要事件在时间和空间上造成断层。
我们通常在loop函数中执行大部分工作,侦听传感器输入并触发某种形式的输出。
同setup函数一样,每个sketch都必须有loop函数,即使该函数为空。
除了从Blink示例中了解的知识之外,关于Arduino语言还需要注意以下事项:
∙大多数熟悉的控制结构都是受支持的(if、while、for、switch等)。
∙算术、比较、布尔、位和混合运算符都是十分标准的。
∙语言本身支持一些数学、时间、三角学、随机数和串行通信功能。
∙可以在sketch顶部使用#include语句包括外部库。
除了所有这些标准功能之外,Arduino还有一些独特的语言元素。
这些构造函数(如上面所示的pinMode和digitalWrite函数)主要关心如何在Arduino中处理各种输入和输出管脚。
Arduino站点中有一个丰富的语言指南(请参阅参考资料)。
好的—我们已经介绍了足够的Arduino基本知识。
让我们了解一下此项目,看看您将从中学习到哪些知识,以及您将面临哪些挑战。
用开源硬件与软件平台Arduino开始创建电子项目
准备制造'Duinotag枪
如果您从未使用过Arduino或者任何其他微控制器,那么看上去这是一个比较庞大的项目。
它的确是。
此项目将带来一些需要克服的有趣挑战。
但是就个人和社会而言,此项目也将带来同等的获益。
让我们来看看这些挑战和获益。
在本节中,我们将开始制造'Duinotag枪。
为什么构建'Duinotag枪?
官方Arduino页面同时加载了一些样例项目,其中大多数项目将比钻研诸如激光信号枪之类的内容简单得多。
构建'Duinotag枪将引入一些独特的挑战,同时也提供了一些非常棒的优点。
首先,使用红外线十分复杂(很抱歉,在本教程的课程中没有使用实际的激光)。
红外线远比您想像的复杂(肯定比我最初开始做这个项目时考虑得更加复杂)。
首先,红外光源到处都是,并且它将从所有事物上弹回(如果您曾经从墙上或画上弹回过遥控装置的信号,则会知道这是怎么回事)。
处理复杂的数据算法或者编写每秒必须处理数百万请求的代码是一回事。
尝试并处理现实世界的干扰源(如太阳)完全是另一回事。
编写代码时使用的解决方法在尝试解决物理世界的问题时会十分有用。
此外,一旦您能够开始使用红外线,那么您将能够开发许多以前从未考虑过的项目—包括与电视进行交互以创建通过IR彼此通信的廉价交互式设备,使用您自己设计的遥控装置控制计算机的各个部分。
除了处理红外线的复杂性之外,您将发现游戏中还有一个计时问题。
目标是构建一个设备,用作发射红外线的枪和一个检测器,后者可以记录其他合法红外光源的击中数。
处理这个特殊问题时有一点难度,并且您会发现在克服这个特殊难题后将获得一些好处(并且有希望得到一些乐趣)。
从社会学的角度讲,这个项目非常适合与朋友协同完成。
我非常喜欢在我自己的工作室里创建设备,但是有时与一些朋友围坐在桌边并且一起工作也是一种乐趣。
由于这些设备往往彼此交互操作,因此不可能只构建一个设备。
通过朋友的参与,您将减轻自己的工作。
您已经得到了更多发射传感器和更多枪来测试您自己的传感器。
这必然将非常有趣。
在'Duinotag启动并运行后,您将被迫立即向朋友射击。
并且最后,您不必从商店购买一个现成的、无法改装的设备,您已经和他人共同创造了自己的设备。
如果您不喜欢它的工作方式,可以改造设备或者更改规则。
这可能比购买便宜的现成组件花费多一点,但是最后,您能够拥有可以拆卸检修、重新组装并且随心所欲的设备。
您在喜欢的全国玩具连锁店中可购买不到这种玩具。
现在您已经对该项目产生兴趣,让我们讨论一下'Duinotag枪。
它将做什么?
它如何工作?
您需要哪些组件?
如何封装电子元件?
设计'Duinotag枪
在开始设计枪之前,需要讨论它的工作原理。
我在此过程中作出了一些声明和假设,以便使一切内容更加清晰。
让我们讨论一下这种枪如何工作:
6当玩家扣动扳机时,则射出一发子弹。
7开枪时,它应当发出“PEWPEW”之类的声音。
8枪支还将用于检测命中率。
9当检测到命中时,枪支应当发出“KZZKHKZZKH”之类的另一种声音。
10每把枪都可以射出一定数量的子弹。
11当枪支没了弹药并且玩家扣动扳机时,枪支应当发出“EEERKEEERK”之类的第三种声音。
12当玩家被除掉时,枪支应当发出“BOOMKAPOW”之类的最后一种声音(是的—那是两种声音)。
在这里可以添加更多规则变体,但是这是一个不错的起点。
在我们将编写的代码中,我们将建立以下规则集:
∙每把枪有六发无损的子弹。
不可以重新装弹药。
可以在没有遇到危险的情况下射出这些子弹。
∙每个玩家都可以中六枪。
当您中了六枪后,您就被杀死了。
∙在射完第六只子弹后,玩家每射出一发子弹都会增加枪支失灵的可能性。
如果枪支失灵,玩家将被杀死。
更通俗地讲,您可以被击中六次,并且可以射击六次。
在使用了六发无损的子弹后,每次射出一枪,枪支失灵的概率就会增加。
如果枪支失灵,那么您就被杀死了。
基于这些简单规则以及教程中先前提及的一些声明,我们可以建立一些硬件基础:
13'Duinotag是基于红外线的。
14枪用作发射器和传感器。
15枪需要某种扳机。
16枪有声音。
17枪应当耐用。
本教程将不会花大量时间讨论如何封装'Duinotag枪。
在制造完电子元件后,我们将介绍各种选项以创建或对应项目的各种案例。
现在已经布置了行为,现在应当对硬件进行说明。
但是必须先讨论一下红外线传感器如何工作。
处理红外线
如述,红外辐射包围着我们。
太阳放射出红外辐射,灯泡、电视和动物(蝮蛇的“腹”指这类蛇用于寻找食物的传感器的形状)也会发出红外辐射。
如果设置一个只要检测到任何红外线就触发的传感器,它将被经常触发,因而基本上是没有用处的。
因此如果是这种情况,红外线遥控装置如何工作?
电视遥控器包含一个特殊设计的内置传感器,可以检测按照特定频率发射的红外线。
例如,索尼将其红外线接口标准化为40KHz。
换言之,红外线LED是以每秒40,000次的频率打开和关闭。
通过仅感测给定频率的输入,电视可以忽略来自其他来源的红外线。
遥控器将通过发射IR脉冲信号向电视发射不同的代码。
这是'Duinotag枪的实际工作原理。
这意味着需要特殊类型的IR传感器。
我们现在就将讨论这个问题,因为将介绍所需的部件以及从何处得到这些部件。
部件
如述,我们需要一个Arduino扳。
让我们看一下还需要什么。
红外线LED
LED没有任何特殊之处。
我使用的是AllElectronics的T1四分之三的IRLED。
红外线传感器
撰写本系列时使用的是TSOP2138YA红外线传感器(也是AllElectronics的产品)。
单极瞬时开关
这是扳机,因此需要一个不大不小的东西。
压电(Piezo)元素
我们将使用此元素发声。
建议使用小闷声。
22规格实心线或绞线
需要两种颜色。
不需要太多—最多一米。
电阻
需要几个不同的电阻。
一个100Ω电阻(即100欧姆或者Brown-Black-Brown)、一个10kΩ电阻(即10000欧姆或Brown-Black-Orange)及一个82Ω电阻(即82欧姆或Grey-Red-Black)。
电容
需要一个0.1uF电容。
镜头
小放大镜(直径为3/4到1英寸)—对于这第一次实验,您可以使用作为宴会礼物提供的便宜塑料镜头。
管子
短的PVC或其他钢管。
这些部件花费不到5美元,这取决于您在哪里购买。
在哪里购买部件
您应当能够走进RadioShack并找到完成本系列需要的电子元件。
如果您愿意从在线经销商那里购买,下面有三家推荐商家:
Digi-Key
以合理的价格提供各种电子元件
Mouser
另一家优秀的在线电子元件货源
AllElectronicsCorp.
选择比另外两家少一些,但是提供了愉快的购物体验
要获得这些在线经销商的信息,请参阅参考资料。
此外,简单的Web搜索将返回许多选项。
如果您决定在其他地方购买,请记住以下四点:
18核对交付时间,尤其是从eBay经销商那里订购时。
您可以从eBay经销商那里找到许多电子元件,但是这些商品经常是直接从中国运来的,需要花费一到两个星期。
19不要订购没有规格表的元件。
所有电子元件都有规格表,其中列出了关于电压和连接等大量重要信息。
如果您手上没有这些信息,您可能会发现使用这些元件十分困难。
20货比三家。
元件价格差别很大。
不要害怕相互参照不同站点开出的价格。
除非您将下大单,否则从一个站点订购传感器而从另一个站点订购LED没有多大意义。
但是您仍然应当确定自己获得的是有竞争力的价格。
21精确核对型号,尤其是IR传感器的型号。
如果您以前使用过电子元件,很显然应该这样做,但是如果您刚开始使用电子元件,则可能不清楚如何做。
IR传感器有许多制造商和型号,并且外观十分相似,但频率不相似。
频率十分重要。
在等待部件运达时,让我们先仅使用Arduino完成一些操作。
这将激发您对项目的兴趣并引入LED的罕见功能。
这个实验不会成为最终项目的一部分,但是它应当可以帮助您更好地理解频率的工作原理。
此外,它将让您开始使用Arduino软件和硬件。
用Arduino做实验
让我们做一个小实验,通过这个实验可以学习到一些LED的新知识,并且帮助我们了解频率。
激发兴趣的巧招
早些时候,我们说过需要一个LED和一个闪光灯才能完成本教程。
在Blink示例中,我们已经使用过LED。
让我们使用同一个LED来检测光。
是的,检测光。
除了闪光、照射和眩光(blinding)之外,LED可用于检测光。
要获得最佳结果,需要使用有色的LED(例如红色)和普通白色闪光灯(越亮越好)。
首先取一个LED并将阳极(正极—通常为长端)插入板子底部的0AnalogIn管脚中。
将阴极(负极—通常为短端)插入板子底部的两个Ground管脚(标记为“GND”)之一。
接下来,我们将编写一点代码来侦听0Analog管脚并将读数输出到串口监视器中(我曾经说过我们会谈到这个主题)。
清单7.侦听0Analog管脚并将读数输出到串口监视器中
/*LEDLightSensor
*byDuaneO'Brien
*forIBMDeveloperWorks
*/
intrecvPin=0;
intwait=1000;
intval=0;
voidsetup()
{
//InitializetheSerialInterface
Serial.begin(9600);
}
voidloop()
{
//TakeareadingfromtheAnalogPin
val=analogRead(recvPin);
//Outputthedetectedvalue
Serial.print("DETECT:
");
Serial.println(val);
//Waittotakethenextreading.
delay(wait);
}
您可以看到这段代码没有太多内容。
我们设置了几个变量,初始化串行接口,然后每秒从模拟输入中获取读数。
它是一个简单的脚本,但是起到了非常好的效果。
保存该脚本并将其上传到Arduino硬件中。
上传完成后,单击Arduino窗口顶部的SerialMonitor按钮。
这将重置Arduino板,然后您应当开始看到一些读数