主页 > 编程资料 > Arduino >
发布时间:2015-03-20 作者:网络 阅读:509次

Arduino 是一款价格不高、易于使用的电子平台。包括硬件和软件在内的整个平台是完全开源的,并且使用的是松散地基于 C/C++ 的语言。Arduino 是为希望尝试创建交互式物理对象的实践者、喜欢创造发明的人以及艺术家构建的。这个三部分系列将从基本的 Arduino 硬件开始,并使用它创建名为 “'Duino tag”的交互式激光游戏,玩家可以使用几乎从头开始构建的设备玩 tag 游戏。在 “构建基于 Arduino 的激光游戏” 的第 1 部分中,我们将构思作为 'Duino tag 的一部分的基本预备试验。
开始之前
无论您是 Arduino 新手还是经验丰富的构建者,此项目都有适合您的内容。没有比创建交互式物理对象更令人满意的事情了,因为在需要中断或者需要修改时,您知道所有部件的位置以及所有部件的工作原理。'Duino tag 枪是适合独立完成或与朋友共同完成的优秀项目。要完成此项目,您至少应当基本了解电子学(您应当知道寄存器是什么,但是不必知道其中的深奥原理)并且了解编程(您应当知道循环和变量是什么,但是您不必解析 Big O Notation)。您可以勇敢地进行动手实践。
关于本系列
在本系列中,我们将使用 Arduino 技术来创建名为 'Duino tag 的基本交互式激光游戏:

  • 第 1 部分:了解一些 Arduino 基础知识,布置项目,并且做一个帮助您了解红外线工作原理的实验。

  • 第 2 部分:构建和测试 'Duino tag 枪的接收器部分,包括测试。

  • 第 3 部分:构建发送器并完成 'Duino tag 枪。

关于本教程
要继续学习本教程,您无需具有任何电子学工作经验,尽管使用电子元件的经验肯定对您有用。对于微控制器经验也是如此。如果您使用过微控制器,则有一定的优势,但是记住 Arduino 平台非常适合没有相应经验的人员。首先,您应当愿意拓展自己的技能。使用电子器件和微控制器会是一种有益的经验。大多数软件工程师没有机会为与物理世界交互的设备编写代码,而 Arduino 提供了使用交互式设备的低成本入口点。
本教程是 “构建基于 Arduino 的激光游戏” 三部分系列的第 1 部分,将主要介绍 Arduino 基础知识。我们将开始使用 Arduino,了解语言基础知识和 API。我们将为 'Duino tag 项目做准备,包括设计基础和整合部件列表。我们将了解如何在线订购部件、去哪里购买以及需要哪些部件。最后,使用一些采购的元件和一些基本测试代码,我们将演示控制枪械操作的基本原理
统要求
对于本教程,我们需要一些工具和设备:
具有 USB 端口的计算机
虽然从技术的角度来说并不合适(许多类型的 Arduino 硬件接口都是基于旧式串行端口的),但是本系列在撰写时假定您使用的是基于 USB 进行通信的模型。Arduino 软件可用于 Microsoft® Windows®、Mac OS X 和 Linux®(32 位和 AMD 64 位)。
Arduino Diecimila
这是本教程中使用的 Arduino 硬件的具体模型。您可以替换 Arduino Duemilanove。请从正规的网上经销商那里订购一个。要获得链接,请参阅 参考资料
USB A-B 线
这是类似于已经连接到打印机上的一根 USB 线。
基本的 5mm 红色发光二极管(Light-Emitting DiodeLED
您可能已经有一个,或者可以在 Radio Shack 或者从网上经销商那里购买。
闪光灯
越亮越好。
Arudino 软件
要下载 Arudino 软件,请参阅 参考资料
Arduino 的安装和设置指南
要下载 Arduino 安装指南,请参阅 参考资料
 
构建基于 Arduino 的激光游戏,第 1 部分: Arduino 基础知识
用开源硬件与软件平台 Arduino 开始创建电子项目
Arduino 简介
在本节中,我们将介绍 Arduino 硬件的基础知识、如何设置,并简单介绍如何编写软件。
Arduino 是什么?
简言之,Arduino 板是一个微控制器 — 具有各种输入管脚和输出管脚的小型计算器。使用这些管脚,您可以创建无数交互式设备,包括像闪光灯一样简单的设备,以及通过各种输入创建使用伺服系统和引擎的复杂行为的复杂设备。第一个 Arduino 是 2005 年 1 月由米兰交互设计学院的两位教师 — David Cuartielles 和 Massimo Banzi — 创建的。要获得介绍 Arduino 开发人员的在线杂志文章,请参阅 参考资料
Arduino 平台由两部分组成:硬件(包括微控制器、电路板等)和软件(编程接口和语言)。平台的两个部分都是开源的。如果需要,您可以下载 Arduino 的图表、购买需要的所有独立部件、切割电路板并从头开始制作一个电路板。有很多用于这一用途的各种项目(如 Freeduino)。图表和 CAD 文件已经在Creative Commons Share-Alike 许可下发布。用于编写 Arduino 的软件也是开源的。它是用 Java™ 编程语言编写的并且是在 GPL(有一些已经在 LGPL 许可下发布的 C/C++ 微控制器库)下发布的。
有几个可用的微控制器平台,并且许多平台都实现相同的目的:易于编程、与微控制器进行交互、将所有内容封装到一个包中等等。同样地,Arduino 旨在提供一个简单的界面和一个将所有功能集于一身的包,同时尝试提供其他优点:
低成本
可以从头开始构建便宜的 Arduino 板,并且预组装的组件十分便宜。Arduino Diecimila 花费大约35 美元。
跨平台软件
获得适用于 Microsoft Windows、Mac OS X 和 Linux 的 Arduino 软件。
简单的语言
Arduino 开发人员尝试使语言可以被初学者轻松掌握,但是对于高级用户足够灵活。
开放源码
Arduino 从上到下完全是开源的。如果需要构建或修改软件,您可以随意执行。此外,Arduino 的官方 Web 站点包含丰富的维基,其中的代码样例和示例都是免费共享的。
有大量可用的 Arduino 信息。最佳起点位于官方 Web 站点(请参阅 参考资料)。花一些时间阅读该站点中的优秀介绍性信息。
入门
要与 Arduino 硬件进行交互,您需要安装软件。下载适用于您的操作系统的软件并遵循相应的分布安装和设置指南(请参阅系统要求)。它们遵循相同的步骤:

  1. 解压缩软件

  2. 安装 Arduino 的 USB 驱动程序

  3. 连接 Arduino 板

  4. 启动软件

  5. 上传示例

我们将不会详细介绍每个步骤,因为这些步骤将随着环境的不同而变化。让我们讨论一下软件和 Blink 示例。
注:按照 Arduino 的说法,独立的脚本和程序被称为 “sketches”。
在启动软件并装入 Blink 示例后(根据入门指南中的说明),您应当会看到类似图 1 的内容。

这里简要介绍一下该界面,顶部按钮行将控制基本任务,如编译、创建和保存文件、将代码上传到Arduino 板中以及打开或关闭 Serial Monitor(稍后还有更多任务)。中间窗格包含 Blink 示例的所有代码,并且底部窗格将显示控制台输出、编译错误和序列消息(打开 Serial Monitor 时)。目前,让我们将精力放在中间的窗格上并讨论 Arduino 语言。
Arduino 语言基础知识
Arduino 语言是基于 C/C++ 的,并且如果您以前使用过这种语言,则应十分熟悉它的构造函数和特性。虽然完整回顾该语言不在本教程范围内,但是让我们剖析 Blink 示例并了解一点该语言的知识。如果您已经可以熟练使用代码,则这些内容可能有些过于简单,因此如果您愿意获取一本手册并进一步深入研究,请随意查阅更多语言参考(要获得更多语言参考,请参阅 参考资料)。
首先,查看大块注释。Arduino 语言中的注释是用两种样式编写的。
清单 1. 块样式

                              
 */
 * Block Style like this
 */

 
也可以用内联样式编写。

清单 2. 内联样式

                              
// inline like this

 
接下来,注意声明一个变量:int ledPin = 13;。
从这一行可立即看出 Arduino 语言中的行都是以分号为结尾的。此外,从中可以了解在 Arduino 语言中声明变量所需的几乎所有内容。语法为:声明变量类型,声明变量名,设置变量的初始值。除了整型之外,Arduino 语言还支持无符号的整型、布尔型、字符型、无符号的字符型、字节型、长型、无符号的长型、                                                                浮点型、双精度型、字符串型和数组型。在 Arduino 语言参考中查找每种数据类型的详细信息,但是花一些时间了解一下数组类型。在声明数组时,清单 3 中所示的每种方法都是正确的。

清单 3. 声明数组的方法

                              
int fourlong[4];  // creates an empty array, 4 elements long
int nolength[] = {8,18,32,64};  // the compiler will figure out how long this array is
int setboth[4] = {8,18,32,64};  // This creates a 4 element array
                                // and sets the initial value
char someword[7] = "fizbin";  // You need to add one extra element for a null character

                                                   
如果您拥有 Web 开发背景,则这些数组可能看上去有点奇怪。不必担心。在开始使用后,这些数组就更容易理解了。
注:数组是零索引的(zero-indexed)。
清单 4 显示了 setup 函数。

清单 4. setup 函数

                              
void setup()
{
  pinMode(ledPin, OUTPUT);
}

 
每当 Arduino 板被重置时,就运行一次该函数。每个 sketch 都必须有 setup 函数,即使该函数为空。在这种情况下,setup 函数用于设置 Arduino 硬件中的一个管脚的模式。目前忽略 pinMode 语句并查看该函数的结构。通过声明函数的返回类型(在这种情况下,void 表示函数将不返回值)和函数名来声明函数。在函数名后,请在括号内声明所有必要参数。setup 函数将不接受参数,但是如果需要创建一个接受一个或多个参数的函数,则只需像声明变量一样声明参数。

清单 5. 声明参数

                              
void someFunction(int a, int b=2)

 
最后,我们会看到函数代码是用大括号括起来的。
setup 函数之后是名为 loop 的另一个函数。

清单 6. loop 函数

                              
void loop()
{
  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 开始创建电子项目
准备制造 'Duino tag 
如果您从未使用过 Arduino 或者任何其他微控制器,那么看上去这是一个比较庞大的项目。它的确是。此项目将带来一些需要克服的有趣挑战。但是就个人和社会而言,此项目也将带来同等的获益。让我们来看看这些挑战和获益。在本节中,我们将开始制造 'Duino tag 枪。
为什么构建 'Duino tag 枪?
官方 Arduino 页面同时加载了一些样例项目,其中大多数项目将比钻研诸如激光信号枪之类的内容简单得多。构建 'Duino tag 枪将引入一些独特的挑战,同时也提供了一些非常棒的优点。
首先,使用红外线十分复杂(很抱歉,在本教程的课程中没有使用实际的激光)。红外线远比您想像的复杂(肯定比我最初开始做这个项目时考虑得更加复杂)。首先,红外光源到处都是,并且它将从所有事物上弹回(如果您曾经从墙上或画上弹回过遥控装置的信号,则会知道这是怎么回事)。处理复杂的数据算法或者编写每秒必须处理数百万请求的代码是一回事。尝试并处理现实世界的干扰源(如太阳)完全是另一回事。编写代码时使用的解决方法在尝试解决物理世界的问题时会十分有用。
此外,一旦您能够开始使用红外线,那么您将能够开发许多以前从未考虑过的项目 — 包括与电视进行交互以创建通过 IR 彼此通信的廉价交互式设备,使用您自己设计的遥控装置控制计算机的各个部分。
除了处理红外线的复杂性之外,您将发现游戏中还有一个计时问题。目标是构建一个设备,用作发射红外线的枪和一个检测器,后者可以记录其他合法红外光源的击中数。处理这个特殊问题时有一点难度,并且您会发现在克服这个特殊难题后将获得一些好处(并且有希望得到一些乐趣)。
从社会学的角度讲,这个项目非常适合与朋友协同完成。我非常喜欢在我自己的工作室里创建设备,但是有时与一些朋友围坐在桌边并且一起工作也是一种乐趣。由于这些设备往往彼此交互操作,因此不可能只构建一个设备。通过朋友的参与,您将减轻自己的工作。您已经得到了更多发射传感器和更多枪来测试您自己的传感器。这必然将非常有趣。在 'Duino tag 启动并运行后,您将被迫立即向朋友射击。
并且最后,您不必从商店购买一个现成的、无法改装的设备,您已经和他人共同创造了自己的设备。如果您不喜欢它的工作方式,可以改造设备或者更改规则。这可能比购买便宜的现成组件花费多一点,但是最后,您能够拥有可以拆卸检修、重新组装并且随心所欲的设备。您在喜欢的全国玩具连锁店中可购买不到这种玩具。
现在您已经对该项目产生兴趣,让我们讨论一下 'Duino tag 枪。它将做什么?它如何工作?您需要哪些组件?如何封装电子元件?
设计 'Duino tag 
在开始设计枪之前,需要讨论它的工作原理。我在此过程中作出了一些声明和假设,以便使一切内容更加清晰。让我们讨论一下这种枪如何工作:

  1. 当玩家扣动扳机时,则射出一发子弹。

  2. 开枪时,它应当发出 “PEW PEW” 之类的声音。

  3. 枪支还将用于检测命中率。

  4. 当检测到命中时,枪支应当发出 “KZZKH KZZKH” 之类的另一种声音。

  5. 每把枪都可以射出一定数量的子弹。

  6. 当枪支没了弹药并且玩家扣动扳机时,枪支应当发出 “EEERK EEERK” 之类的第三种声音。

  7. 当玩家被除掉时,枪支应当发出 “BOOM KAPOW” 之类的最后一种声音(是的 — 那是两种声音)。

在这里可以添加更多规则变体,但是这是一个不错的起点。在我们将编写的代码中,我们将建立以下规则集:

  • 每把枪有六发无损的子弹。不可以重新装弹药。可以在没有遇到危险的情况下射出这些子弹。

  • 每个玩家都可以中六枪。当您中了六枪后,您就被杀死了。

  • 在射完第六只子弹后,玩家每射出一发子弹都会增加枪支失灵的可能性。如果枪支失灵,玩家将被杀死。

更通俗地讲,您可以被击中六次,并且可以射击六次。在使用了六发无损的子弹后,每次射出一枪,枪支失灵的概率就会增加。如果枪支失灵,那么您就被杀死了。
基于这些简单规则以及教程中先前提及的一些声明,我们可以建立一些硬件基础:

  1. 'Duino tag 是基于红外线的。

  2. 枪用作发射器和传感器。

  3. 枪需要某种扳机。

  4. 枪有声音。

  5. 枪应当耐用。

本教程将不会花大量时间讨论如何封装 'Duino tag 枪。在制造完电子元件后,我们将介绍各种选项以创建或对应项目的各种案例。现在已经布置了行为,现在应当对硬件进行说明。但是必须先讨论一下红外线传感器如何工作。
处理红外线
如述,红外辐射包围着我们。太阳放射出红外辐射,灯泡、电视和动物(蝮蛇的 “腹” 指这类蛇用于寻找食物的传感器的形状)也会发出红外辐射。如果设置一个只要检测到任何红外线就触发的传感器,它将被经常触发,因而基本上是没有用处的。
因此如果是这种情况,红外线遥控装置如何工作?电视遥控器包含一个特殊设计的内置传感器,可以检测按照特定频率发射的红外线。例如,索尼将其红外线接口标准化为 40 KHz。换言之,红外线 LED 是以每秒 40,000 次的频率打开和关闭。通过仅感测给定频率的输入,电视可以忽略来自其他来源的红外线。遥控器将通过发射 IR 脉冲信号向电视发射不同的代码。
这是 'Duino tag 枪的实际工作原理。这意味着需要特殊类型的 IR 传感器。我们现在就将讨论这个问题,因为将介绍所需的部件以及从何处得到这些部件。
 
部件
如述,我们需要一个 Arduino 扳。让我们看一下还需要什么。
红外线 LED
LED 没有任何特殊之处。我使用的是 All Electronics 的 T1 四分之三的 IR LED。
红外线传感器
撰写本系列时使用的是 TSOP2138YA 红外线传感器(也是 All Electronics 的产品)。
单极瞬时开关
这是扳机,因此需要一个不大不小的东西。
压电(Piezo)元素
我们将使用此元素发声。建议使用小闷声。
22 规格实心线或绞线
需要两种颜色。不需要太多 — 最多一米。
电阻
需要几个不同的电阻。一个 100Ω 电阻(即 100 欧姆或者 Brown-Black-Brown)、一个 10kΩ 电阻(即 10000 欧姆或 Brown-Black-Orange)及一个 82Ω 电阻(即 82 欧姆或 Grey-Red-Black)。
电容
需要一个 0.1uF 电容。
镜头
小放大镜(直径为 3/4 到 1 英寸)— 对于这第一次实验,您可以使用作为宴会礼物提供的便宜塑料镜头。
管子
短的 PVC 或其他钢管。
这些部件花费不到 5 美元,这取决于您在哪里购买。
 
在哪里购买部件
您应当能够走进 Radio Shack 并找到完成本系列需要的电子元件。如果您愿意从在线经销商那里购买,下面有三家推荐商家:
Digi-Key
以合理的价格提供各种电子元件
Mouser
另一家优秀的在线电子元件货源
All Electronics Corp.
选择比另外两家少一些,但是提供了愉快的购物体验
要获得这些在线经销商的信息,请参阅 参考资料。此外,简单的 Web 搜索将返回许多选项。如果您决定在其他地方购买,请记住以下四点:

  1. 核对交付时间,尤其是从 eBay 经销商那里订购时。您可以从 eBay 经销商那里找到许多电子元件,但是这些商品经常是直接从中国运来的,需要花费一到两个星期。

  2. 不要订购没有规格表的元件。所有电子元件都有规格表,其中列出了关于电压和连接等大量重要信息。如果您手上没有这些信息,您可能会发现使用这些元件十分困难。

  3. 货比三家。元件价格差别很大。不要害怕相互参照不同站点开出的价格。除非您将下大单,否则从一个站点订购传感器而从另一个站点订购 LED 没有多大意义。但是您仍然应当确定自己获得的是有竞争力的价格。

  4. 精确核对型号,尤其是 IR 传感器的型号。如果您以前使用过电子元件,很显然应该这样做,但是如果您刚开始使用电子元件,则可能不清楚如何做。IR 传感器有许多制造商和型号,并且外观十分相似,但频率不相似。频率十分重要。

在等待部件运达时,让我们先仅使用 Arduino 完成一些操作。这将激发您对项目的兴趣并引入 LED 的罕见功能。这个实验不会成为最终项目的一部分,但是它应当可以帮助您更好地理解频率的工作原理。此外,它将让您开始使用 Arduino 软件和硬件。
 
 
 
 Arduino 做实验
 
让我们做一个小实验,通过这个实验可以学习到一些 LED 的新知识,并且帮助我们了解频率。
激发兴趣的巧招
早些时候,我们说过需要一个 LED 和一个闪光灯才能完成本教程。在 Blink 示例中,我们已经使用过LED。让我们使用同一个 LED 来检测光。是的,检测 光。除了闪光、照射和眩光(blinding)之外,LED 可用于检测光。要获得最佳结果,需要使用有色的 LED(例如红色)和普通白色闪光灯(越亮越好)。
首先取一个 LED 并将阳极(正极 — 通常为长端)插入板子底部的 0 Analog In 管脚中。将阴极(负极 —通常为短端)插入板子底部的两个 Ground 管脚(标记为 “GND”)之一。
接下来,我们将编写一点代码来侦听 0 Analog 管脚并将读数输出到串口监视器中(我曾经说过我们会谈到这个主题)。
清单 7. 侦听 0 Analog 管脚并将读数输出到串口监视器中

                              
/* LED Light Sensor
 * by Duane O'Brien
 * for IBM Developer Works
 */
  int recvPin = 0;
  int wait = 1000;
  int val = 0;
 
  void setup()
  {
    // Initialize the Serial Interface
    Serial.begin(9600);
  }
 
  void loop()
  {
    // Take a reading from the Analog Pin
    val = analogRead(recvPin);
    // Output the detected value
    Serial.print("DETECT : ");
    Serial.println(val);
    // Wait to take the next reading.
    delay(wait);
  }

 
您可以看到这段代码没有太多内容。我们设置了几个变量,初始化串行接口,然后每秒从模拟输入中获取读数。它是一个简单的脚本,但是起到了非常好的效果。保存该脚本并将其上传到 Arduino 硬件中。上传完成后,单击 Arduino 窗口顶部的 Serial Monitor 按钮。这将重置 Arduino 板,然后您应当开始看到一些读数显示在底部窗格中。调暗光源并查看读数。这一切应当类似图 2。
 

 
显示的实际数字可能差别很大,这取决于周围的光线的强度、您使用哪种 LED 等等。接下来,打开闪光灯并用它照亮 LED。您应当会注意到检测到的值明显增加。在第一个屏幕快照中,读数大约为 167-168。但是查看图 3 中的读数。

您可以看到在 0-1,023 范围内的模拟输入在闪光灯照射到 LED 上时读数跳跃了大约 90。同样,这些数字可能差别很大,这取决于周围照明、LED 选择和闪光灯强度。但是这是最基本的光传感。
现在,为了作比较,打开 Arduino 硬件周围的几个光源,这样就增加了周边照明,然后注意基线如何增长。

当 LED 与其他光源结合在一起时,您可以看到基线数字增长大约 40,这种跳跃不太明显。在本例中,我们仍然可以从中看出闪光灯何时直接照射到 LED 上。

但是如果必须处理更多环境照明,或者必须处理漫射光源的物体(例如距离 LED 比较远的光),数字差异会变得越来越微妙。为了演示这种情况,需要对 Arduino 进行设置,以让闪光灯从房间的任何角落照射到 LED 上,然后检验结果。
除了展示使用基本 LED 的新方法之外,本例还演示了处理周围可见光和光检测时遇到的困难。您可以想象在处理红外线这样几乎无处不在并且肉眼看不到的光线时,问题将变得多么复杂。
 
 
频率的简单演示
现在光传感器已经工作,可以修改代码并使用它了解频率。我们已经了解到,红外线无处不在,因此传感器必须过滤掉不是以特定频率发射的光线。让我们在本节中简单演示一下发射频率如何工作。这并不是一次全面的科学实验,但是它可能会帮助阐明概念。
修改代码
我们将更改代码,以便在光读数跳到超出基线的 5% 时,将启动一个循环,该循环将查看下两个读数,根据检测到的代码输出特定代码。首先,声明一些附加变量。我们需要一个变量来决定应当获取多少个读数来确定周围光线的基线数字,还需要一个变量来保存期望的最小读数跳跃值,以及一个迭代器、一个保存不同代码的数组和一个跟踪 int 来说明在循环中的位置。
清单 8. 声明变量

                              
  int recvPin = 0;
  int wait = 1000;
  int val = 0;
  int readings = 5;
  int jump = 0;
  int i = 0;
  int code[2];
  int incycle = 0;

 
接下来,需要在设置期间获取一组读数,计算平均值,然后决定 5% 的含义。依照我的经验,第一个读数总是异常地高,因此直接去掉该读数。

清单 9. 获取一系列读数

                              
  void setup()
  {
    // Initialize the Serial Interface
    Serial.begin(9600);
    Serial.print("establishing baseline... ");
    val = analogRead(recvPin); // throw out the first one, it's usually high.
    delay(wait);
    for (i = 0; i < readings;i++)
    {
      jump += analogRead(recvPin);
      delay(wait);
    }
    jump = (jump / readings)*1.05;
    Serial.println(jump);
    // Output the detected value
    delay(wait);
  }

 
最后,在循环过程中,您需要读取管脚。如果在循环中,则需要保存代码,并且如果已经收到所有代码,则输出一个结果。如果不在循环中,并且读数高于基线 5%,则启动一个循环。清单 10 可以更加简洁,但是它清楚地说明了正在发生的情况。

清单 10. 读取管脚

                              
  void loop()
  {
    // Take a reading from the Analog Pin
    val = analogRead(recvPin);
    switch (incycle)
    {
      case 0:
        if (val > jump)
        {
          Serial.println("In Cycle");
          incycle = 1;
        } else {
          Serial.println("Out Of Cycle");
        }
        break;
      case 1:
         if (val > jump)
         {
           code[0] = 1;
         } else {
           code[0] = 0;
         }
         incycle = 2;
         Serial.println("Read One");
         break;
      case 2:
        if (val > jump)
        {
          code[1] = 1;
        } else {
          code[1] = 0;
        }
        incycle = 3;
        Serial.println("Read Two");
        break;
      case 3:
        if (code[0] == 0 && code[1] == 0)
        {
          Serial.println("Reset");
        } else if (code[0] == 1 && code[1] == 0)
        {
          Serial.println("Turn On");
        } else if (code[0] == 0 && code[1] == 1)
        {
          Serial.println("Turn Off");
        } else if (code[0] == 1 && code[1] == 1)
        {
          Serial.println("Explode");
        }
        code[0] = 0;
        code[1] = 0;
        incycle = 0;
        break;
    }
    delay(wait);
  }

 
如果保存并上传这段代码(每次上传后需要打开串行监视器),您应当会看到读数何时完成。通过将闪光灯照射到 LED 上,您可以触发一个循环。下两个读数(一秒一个)将决定输出的最终代码。您可以触发不同的输出,方法为以每秒一次的频率交替打开和关闭闪光灯。例如,如果只是将闪光灯照射到 LED三秒钟,则应当会触发 &ldquo;Explode&rdquo; 消息。如果打开闪光灯一秒钟,关闭一秒钟,然后打开一秒钟,则应当触发 &ldquo;Turn Off&rdquo; 代码。下面是一个输出样例。

在这里完成的是以非常低的频率发出二进制消息信号。这类似于 'Duino tag 枪的作用,不过信号枪要以更高的频率完成此操作。
现在,您应当已经为进一步创建和测试 'Duino tag 枪做好了准备,这些内容将在本系列的其余部分中介绍。

原文地址:http://www.cnblogs.com/haojixiao/archive/2011/09/23/2187809.html

关键字词: