Arduino实战

978-7-115-34331-4
作者: 【美】Martin Evans Joshua Noble Jordan Hochenbaum
译者: 况琪
编辑: 杨海玲
分类: Arduino

图书目录:

详情

这是一本全面介绍Arduino的实战指南,讲解了如何使用Arduino平台完成原型开发及构建电子设备。全书共分两个部分,第一部分从总体上介绍了Arduino;第二部分更加深入地讲解了Arduino,将Arduino推向实用。书的最后的几个附录分别介绍如何在Windows、Mac OS X和Linux操作系统上安装Arduino软件、Arduino语言的编程基础、Arduino的软件库等内容。

图书摘要

Arduino实战

Arduino IN ACTION

〔美〕Martin Evans Joshua Noble Jordan Hochenbaum 著

况琪 译

人民邮电出版社

北京

内容提要

本书是用Arduino搭建趣味电子产品的实践指南。本书循序渐进、深入浅出地讲解了Arduino创意电子制作的方方面面:拆封Arduino板卡并让一个LED闪烁,然后进一步介绍在实际项目中最常用的技术,如控制电动机、LCD显示器、超声波和红外线传感器等。书中还讲解了一些流行的技术,如Wi-Fi、蓝牙、GPS、USB通信等。通过本书,读者可以尝试制作五音阶电子琴、简易气象站、微博盒子、可穿戴路标灯等妙趣横生的创意电子产品。除了Arduino和Processing 开发环境以外,读者还会接触到Pure Data和Python 编程、iOS开发等热点话题。书后附录包括了图解驱动安装、编程基础知识等,即使是没有编程基础的初学者也可以轻松入门,而书中丰富的案例不但兼具深度和广度,更是兼具实用性和艺术性,想必Arduino高手也会从中有所收获。因此本书既可以作为Arduino初学者的入门教材,也可以作为Arduino进阶玩家的创意指南和参考手册。

译者序

每个人的心中都会藏着一个关于改变世界的小小梦想,每一个敢于向这个目标迈出哪怕只是一小步的人,都是我心目中的英雄。然而有这么一些人,他们会为软件编写一些小插件,他们为操作系统订制个性的主题,他们改装键盘和鼠标,为它们添加酷炫的 LED灯……他们不满足于商场买回来的成品,总觉得那些工业化生产的东西缺少一点儿个性和人情味儿,他们不妥协,他们用自己的方法在现实世界中修修补补并乐此不疲,他们有一个相同的名字——创客。创客不必是身怀绝技的科技精英,也不必是腰缠万贯的富翁,有人用多彩的十字绣装点日常的衣物,有人用璀璨的水钻制作精致的手机壳,有人在橡皮上雕刻个性的图案,将它印在书本的扉页上……他们都在对身边世界进行小小的改造,他们都是创客。只要你心怀梦想,只要你不甘平庸,只要你有想法并付诸实践,你就是创客。欢迎你加入创客的大家庭!

然而,小小的翅膀并不能撑起大大的梦想。飞速运转的工业化设备就像一片原野,尽管有富饶的水土,尽管孕育着千万的生命,却将平民创客的呼喊淹没在呼啸而过的风中。幸运的是,创客的先行者们搭建了许多可以让平民创客施展拳脚的平台,Arduino就是其中之一。Arduino 是一个很小的平台,一张信用卡的大小,小到可以将其放在掌心;Arduino又是一个巨大的舞台,全球数以百万计的玩家共同组成了庞大的Arduino社区,这里每个人都乐于分享,这里每个人都是主角。庞大的用户群创造了海量的资源,让Arduino成为一只羽翼丰满的鸿鹄,带着你的梦想扶摇直上!

也正是得益于Arduino社区的孵化,最终让《Arduino实战》一书借着创客运动的春风,呈现在了各位读者的面前。本书的英文原版由三位作者合著。与诸多同类书籍不同的是,本书作者当中除了有传统意义上的电子工程师、硬件创客以外,还有专业的创新技术专家、交互设计师和艺术家等。作者丰富的背景使得本书的内容变得异彩纷呈。本书所涵盖内容的广泛性、实用性和艺术性在国内乃至国际范围内都堪称同类图书之最。

除了“流水灯”等少数几个经典保留项目之外,本书还制作了五音阶电子琴、可穿戴路标灯、小型气象站等趣味性和实用性更强的项目。更可贵的是,本书还介绍了一些在同类图书中非常罕见且具有较强实用价值的技术,比如利用Cosm平台进行云端数据交换的示例,就渗透了近年来大红大紫的“物联网”技术思想;而通过iOS编程与Arduino板卡通信的示例,则顺应了移动计算的大方向。

对于Arduino板卡本身来说,其硬件外设和计算资源都非常有限。因此,“学Arduino不能只学Arduino”已经成为了人们的共识。由于Arduino的软硬件平台均以开源许可证发布,全世界的 Arduino 玩家已经为其开发了浩如烟海的软件库和硬件扩展模块,使得Arduino的功能得以无限地扩展。所以,学习Arduino要注重两个“扩展”。第一,要学会让各种电路组件成为Arduino的扩展,例如在本书第5章就介绍了直流电机、单极型步进电机、双极型步进电机、伺服电机和无刷电机这5种电动机。这些电动机的不同特性使其适用于不同的场合,通过这一章的学习,读者就可以基本上扫清在制作各种小型机器人时遇到的跟电动机有关的问题。第二,要学会让Arduino成为计算机的扩展,例如在本书第13 章就介绍了Arduino与运行在计算机上的Python、Pure Data、Processing等编程语言整合,借助PC机的计算能力,可以完成许多仅凭Arduino自身完成不了的应用。大部分同类图书都在第一个“扩展”上浅尝辄止,而本书则做到了两全其美。本书的写作风格风趣活泼,实例教程妙趣横生,在有限的篇幅内很好地把握了内容的深度和广度,既可以作为初学者的入门教程,也可以作为进阶玩家的参考手册。

由于作者丰富的背景,本书涉及的内容也十分广泛,这就为本书的翻译工作带来了挑战。除了电子方面的专业名词以外,本书中还出现了计算机视觉、iOS开发、USB协议、网络通信等方面的概念,所幸我对这些技术还略有涉猎。更夸张的是,书中还出现了一些音乐、军事、设计等方面的术语,而这些的翻译只能通过搜索或请教别人来完成。为了搞懂一个短语的含义,我甚至阅读了作者本人撰写的学术论文。

翻译的过程是一个再创作的过程,在尊重原文的基础上,也尽可能地注意了汉语的语言习惯,对一些长句进行了拆分,还对一些句式和词性做了转换。另外,由于文化背景的差异,作者在文中提到的一些事物在国外可能妇孺皆知,但国人可能感到陌生,翻译过程中也针对这些内容撰写了数十条译者注,希望能为国内的读者带来一些方便。然而,人非圣贤,即使是这本优秀的图书也并非完美无瑕,译者在原版图书中也发现了一些错误和疏漏,其中大部分已在译稿中予以修正,但也有一部分出于尊重原文的考虑予以保留,并将译者的个人见解以译者注的形式给出,以供读者参考。

在百余天的翻译过程中,遇到的困难和挫折是令我始料未及的。幸运的是,我的工作受到了来自家人、朋友、同学和老师的关注、支持和鼓励,是他们的鞭策使我最终完成了这本译著。首先要感谢我的父母,他们在假期为我提供了“衣来伸手,饭来张口”式的生活照料,他们对我的工作给予了高度关注和鼎力支持,他们是我最大的粉丝和最忠实的读者。我想感谢国家级大学生创新创业训练为本书相关研究提供经费支持,也要感谢我在北京师范大学的良师益友:感谢我的导师孙波教授以及项目组成员陶最、陈亚冰为本书相关研究付出的努力,感谢李朱峰老师的热情帮助,感谢感谢我的室友王俊升与我探讨并解决了很多问题,感谢北京师范大学先进计算与软件研究中心的所有同学和老师,特别是胡久林、黄小芳、陈会杰几位学长的理解和包容。感谢在我之前著书立说、成一家之言的宋若溪、周颖萱和联骏老师对本书的关注,他们是我的偶像和榜样。感谢人民邮电出版社的杨海玲以及更多为本书付出辛勤劳动的编辑们。感谢一直以来关注和鼓励我的张万祥、田宏、李思瑶以及更多无法一一列出的朋友。

尽管如此,由于译者本人能力和精力的限制,本书仍不能在每个方面都做到尽善尽美。我非常愿意听到来自读者朋友的批评和建议,并渴望与志同道合的朋友共同探索,共同进步。读者可以通过关注我的新浪微博(http://weibo.com/kqwd)或者访问我的个人主页(http://kuangqi.me)与我取得联系。

译者简介

况琪 北京师范大学计算机科学与技术专业理学学士,北京师范大学软件工程硕士在读。专注底层技术的研究与应用,熟悉 C 语言、嵌入式系统和电子工艺。关注开源硬件和创客运动,曾将Arduino 底层代码移植到ARM 平台,在国内率先完成TI SimpleLink 方案在STM32平台的移植。也在机器视觉、移动计算、数字图像处理、互联网和信息系统方面有过科研或项目经验,与中国航天员中心合作的实验程序曾随“神舟九号”飞船进入太空。

前言

我的Arduino之旅起始于2009年夏天在Rails Underground大会上听取Elise Huard的讲演——“物联网”之后。那次会议之后,我立即购买了一本Massimo Banzi所著的《Getting Started with Arduino》 [1](O’Reilly, 2008)。在返程的火车上,我就把它从头到尾读了一遍。

不久以后,我购买了我的第一片Arduino,开始玩、做实验并搭建小项目。我的第一个大项目是一个避障机器人,我在2010年在苏格兰爱丁堡举行的苏格兰Ruby大会(2010 Scottish Ruby Conference)上展示了这个机器人。

我的毕生所爱是水下运载工具和海洋环境。在那次会议之后,我开始致力于研究用Arduino控制的水下遥控运载工具(ROV),并在2011年的苏格兰Ruby大会上做了展示。

从此,我就辗转在英国和爱尔兰,在许多制汇节上展示我的ROV,引发了诸多的关注和讨论。我是Aberduino的创始人之一,Aberduino是一个以苏格兰阿伯丁为基地的创客空间。在那里,我们为各种活动制作装置。

我参与的其他基于Arduino的项目还包括医疗培训援助和一个开源汽车的项目——Wikispeed。

我继续研究水下运载工具并积极研发一款新的基于Arduino的可以作为套件发布的水下ROV。

——Martin Evans

我最初接触微控制器的经历与很多艺术家和设计师在十几年前的经历一样——PIC微控制器。我发现它们很难懂,需要注意的细节很多,搭建的速度也很慢,但它是唯一的选择,没有替代品。后来我又发现了Teleo控制器,然后是Wiring电路板……但当Arduino出现在我面前时,我被迷住了。

我几乎所有的作品都要用到Arduino——从制作智能喷漆罐的原型,到为博物馆建造交互性的展品和为科学实验制作工具。我爱上了这块电路板、这个环境,还有,我尤其喜爱围绕Arduino不断成长的技术社区,热情地激发人们去教学、实验、探索和分享。

——Joshua Noble

出于对音乐科技的热爱,2008年前后,我开始探索将Arduino作为一个快速开发和物理计算的平台。最初,我将Arduino当做一种设计工具,用于设计供现场演奏时使用的音乐接口。我与长期合作伙伴Owen Vallis一道,将其最终演化成了Arduinome项目,它是流行的Monome USB MIDI控制器的一个开源的移植。Arduinome项目的成功是Arduino本身独特性的真实体现——Arduino赋予了不同技术背景的音乐家和艺术家创造独一无二的强大的音乐表现工具的能力。与此同时,我还在修读一门关于音乐机器人和活动雕塑的课程,我们使用Arduino来驱动一个协作的音乐机器人。

从那时起,Arduino就成了我的工作核心。2009年我开始攻读博士学位,研究多模态传感系统在音乐表演和教学中应用的可行性。利用Arduino,我制作了许多接口和超乐器来捕捉演奏中的数据和指标。我制作了SmartFiducial,在普通的桌子表面增加了z深度(接近)传感和压力传感。通过嵌入在乐器中或者安装在演奏者肢体上的多模态传感系统,我研究了多种机器学习任务,比如演奏者识别和击鼓手识别。我获得了博士学位,并在2012年成为了加州艺术学院的一名音乐技术学教授。音乐技术学研究的是交互、智能和设计。Arduino还将继续在我的艺术和科研实践中扮演重要的角色。我已经将使用Arduino制作的相关作品整理并发布在网上,有一些还在《连线》(WIRED)和《数码艺术杂志》(Computer Arts)上发表。目前,我的基于Arduino的一些项目包括了表面动力学实时投影映射和可视化、用于互动舞蹈表演的无线传感系统等方面。

——Jordan Hochenbaum

注 释

[1].中译本《爱上Arduino》由人民邮电出版社出版。——编者注

致谢

我想感谢Manning 出版社的一些人:感谢Sebastian Stirling 无尽的耐心和支持;感谢Cynthia Kane的指导,其在最终审稿阶段温柔的提醒,让我们的手稿最终付梓;感谢 Troy Mott全权负责了试制阶段;感谢技术编辑Sharon Cichelli和Daniel Soltis提供帮助并提出了如何修改最终手稿的建议;感谢文字编辑Andy Carroll不厌其烦地从头到尾梳理手稿,删除其中无用的词语,让一切都变得赏心悦目。

我还想感谢我们的审稿人,他们帮我们指出了书中需要进一步解释以及存在矛盾的地方。他们是Alan Burlison、Andrew Davidson、Bill Westfield、Daniel Soltis、George Entenman、Howard R.Hansen、Jeroen Benckhuijsen、John Raines、Margriet Bruggeman、Matt Scarpino、Nikander Bruggeman、P.David Pull、Philipp K. Janert、Scott Couprie、Scott Howard、Steve Prior 和Ursin Stauss。

Martin Evans想要感谢他的妻子Henrietta和他的孩子Leanne、Heather和Luke,他们都以这样或那样的方式鼓励他坚持致力于这本书的写作。他还想感谢 Pual 及其在Symposium咖啡屋的团队,感谢Peterhead总是在他最需要的时候为他加满咖啡。

Joshua Noble想要报偿一笔巨大的人情债:感谢Simona Maschi、David Gauthier还有在CIID [1]中允许他在课程论文中偷个小懒而去完成本书中相应章节的每一个人。感谢他可爱的女友 Rachel Buker,还有教他在迈出犹豫不定的第一步时规划自己的人 Morgan Schwartz。

Jordan Hochenbaum 想要感谢他的良师益友 Ajay Kapur,感谢他将自己带入 Arduino的世界,并引导自己以系统化的方法来考虑音乐接口设计。他还想感谢他的老朋友和同事Owen Vallis,他们一起磕磕绊绊地完成了第一个Arduino程序,并在之后深入地钻研了AVR的世界。

注 释

[1]. Copenhagen Institute of Interaction Design,哥本哈根交互设计学院。——译者注

关于本书

本书分为两个部分:第一部分总体介绍了Arduino,通过一个入门教程,手把手地带你完成你的第一个Arduino项目,接着通过另外几个简单的项目带你学习Arduino的输入输出功能。第二部分更深入地探讨了Arduino,在这一部分中我们才真正开始将Arduino与一些先进的技术结合,你可以将这些技术应用到自己的项目中。

书中所有项目的源代码都可以通过本书网站(www.manning.com/ArduinoinAction)下载,但我们还是建议你尽可能按照本书的编排来完成项目。自己动手敲代码有助于你牢记其中涉及的概念,也会让你更深刻地领会其中的思想。

本书对Arduino的初级和中级用户都是适用的。它从最基本的内容讲起,假设你没有任何基础,但我们相信即使是专家级的用户,也会在本书的第二部分中有所收获。本书的第二部分涵盖了丰富的内容,其中很多都可以合并到你自己的项目中。尽管我们会尽可能通俗地解释一个项目的电路原理,但了解一些电子学常识还是有助于你更好地理解一些项目的电路。

路线图

本书第一部分从总体上介绍了Arduino。

第1章讲解了如何搭建搭建开发环境,以及如何设置软硬件工具箱。这章会教如何让你的第一个LED闪烁,通过这个例子带你走通开发一个Arduino项目的整个流程。

第2章采用入门教程的形式带你完成第一个项目,这其中也涵盖了很多重要的概念。

第3章利用第2章中所学的知识,讲解了几个简单的项目,通过这些项目来学习Arduino的输入和输出功能。

本书的第二部分更加深入地讲解了Arduino。在这一部分中,我们将Arduino推向实用。

第4章介绍了扩展了Arduino功能性的软件库。

第5章通过讲解如何使用Arduino控制电动机来让Arduino动起来。

第6章介绍了目标检测技术,比如其中有一节讲解了超声波和超声波传感器如何协同工作。

第7章讲解了如何将信息输出到LCD显示屏。这章介绍了日立HD44780并行LCD,除此以外还介绍了可以显示图形的KS0108图形LCD。

第8章我们介绍了与外界通信的方法。我们首先使用以太网扩展搭建了一个Web服务器,进而用它把信息从Arduino发布到Twitter上。我们还将讲解如何使用Wi-Fi和蓝牙进行通信,如何将数据记录到SD卡上或者通过Cosm服务记录到因特网上,如何通过串行外设接口(SPI)与其他的设备通信等。

第9章详细讲解了如何将Arduino连接到游戏手柄。我们首先通过I2C总线来连接常见的Wii Nunchuk手柄,然后详细讲解如何使用一块USB扩展板来连接USB接口的Xbox游戏手柄。

第10章讲解了如何利用Redpark串口线将Arduino与iPhone、iPad等这类iOS设备整合。

第 11 章我们将介绍两种可穿戴的 Arduino。LilyPad 是一种可以被缝制到衣物中的Arduino;Arduino Mini Pro 是一种针对小体积应用而专门定制的Arduino。

第12章介绍了Arduino的扩展板,扩展板可以方便地扩展和增强Arduino的硬件。这一章还将教你制作自己的扩展板。

最后,第13章介绍了软件整合,这章介绍了如何在其他软件中与Arduino通信。

本书还有5个附录。

附录A 介绍了如何在Windows、Mac OS X和Linux 操作系统上安装Arduino 软件。

附录B是Arduino语言的编程基础。

附录C介绍了Arduino的软件库及其结构。

附录 D 提供了一个清单,其中列出了本书中所有的项目,以及每个项目都需要哪些器件。

附录E列出了一些有用的链接。

编码规范和代码下载

本书提供了大量的代码示例,这些代码都是使用Arduino的集成开发环境(IDE)创建的。书中给出的源代码清单以及行文中的代码都使用等宽字体(fixed-width font)与普通文本相区分。很多代码清单中都包含注释。

你可以从出版商的网站上下载书中示例的源代码。网址是www.manning.com/ArduinoinAction。

作者在线支持

购买本书将免费获得Manning出版社的私有论坛访问权限,在这里你可以对本书提出意见,咨询技术问题并得到论坛网友以及作者本人的帮助。想要访问并订阅该论坛,请访问 www.manning.com/ArduinoinAction,这个页面会告诉你如何注册并访问论坛、在论坛中可以获得哪些帮助以及需要遵守哪些规则等。

Manning承诺为我们的读者提供一个平台,让各位读者间以及读者与作者间能够进行有意义的交流。但我们并不承诺具体有多少位作者会参与到论坛讨论中,所有人为论坛做出的贡献都是自愿且无偿的。我们建议你向作者提出尽可能具有挑战性的问题,以免他们失去兴趣。

只要本书尚在销售,这个作者在线支持论坛和以往讨论的存档都将始终可以访问。

关于封面插图

本书封面上的插图题为“Travailleur de déplacement”,意思是“流动劳工”。这幅插图取自19 世纪在法国出版的四卷本——Sylvain Maréchal [1]的区域性服饰和风俗概览。每张插图都绘制精美并由手工上色。Maréchal 丰富多样的文集向我们生动地描绘了距今仅仅 200 年前,如何通过文化特征来区分世界上不同的城镇和地区。在不同的地区,是人们操着不同的乡音或者语言。不论在市井还是乡间,都很容易通过人们的服饰分辨出他们住在哪儿,以及他们的职业和身份。

服饰的密码从那时起就不断地变换,又因地区不同而有所差异,而彼时的繁盛,如今已经消逝。如今,甚至已经难以分辨出不同大洲的居民有什么区别了,更不用说不同的城镇或者地区了。也许我们已经用文化多样性换来了多彩的私生活——一种多样化、快步调的科技生活。

在这个计算机类图书同质化严重的时代,Manning通过将Maréchal的图片作为封面的方式来庆祝其在计算机业务上创造性和主动性,也让两个世纪前丰富多样的区域性文化在今日重放异彩。

注 释

[1]. Sylvain Maréchal(1750-1803),法国散文作家、诗人、哲学家和政治理论家,空想社会主义和共产主义理论先驱者。——译者注

第一部分 入门

这一部分(第1章~第3章)在总体上介绍了Arduino。你将从这里开始Arduino的学习之旅,了解它的开发环境并通过一个入门教程完成第一个Arduino项目,接着将接触几个简单的项目,学习使用Arduino的输入/输出功能。

第1章 你好Arduino

本章涵盖的内容

Arduino的历史

Arduino硬件

硬件和软件安装

第一个闪烁的LED

Arduino能用来干嘛?这个问题的答案是丰富多彩的。Arduino已经被广泛应用于各种项目中。

制作诸如 Pong 和 Space Invaders [1]这类各位儿时甚至父辈年轻时玩的游戏。这些游戏的画面都是单色的,音效也比较简单。

制作循迹机器人,并学习机器人的基本原理。循迹机器人也可以用于工厂和仓库,它们可以按照既定的轨迹搬运货物。

制作光电竖琴,通过手的挥舞来演奏乐曲,就像演奏家Little Boots [2]那样。

制作MIDI 控制器,来控制各种乐器。

制作像Segway [3]那样的自平衡机器人。

所有这些示例项目都是基于Arduino制作的,Arduino是一个不到手掌大小的微控制器。它最初被设计作为一个物理计算的工具,由设计或者艺术专业的学生使用。Arduino已经被一些爱好者团体和创客们接纳,将其作为一个制作项目原型的工具。

本章我们将回顾Arduino的发展史,看看它是如何成为很多创客开始一个新项目时的首选工具的。这段背景材料将介绍Arduino从伊夫雷亚互动设计学院的起源,并解释它为何有如此迫切地需要。我们会评论并对比各种不同形式Arduino的优缺点,还将告诉你入门时需要哪些工具、设备和电子元件。最后,在我们开始第一个闪烁 LED 的项目之前,还将介绍Arduino的集成开发环境(IDE)。

首先让我们了解一下Arduino是从哪儿来的。

1.1 Arduino简史

Arduino于2005 年诞生于意大利伊夫雷亚市的互动设计学院。当时Massimo Banzi教授正在寻找一种低成本的途径,以使设计专业的学生能更容易地运用科技。他与来自瑞典马尔默大学的访问学者David Cuartielles 讨论了这个问题,而Cuartielles 同样也在寻找类似的方案,Arduino就在这样诞生了。

市场上现有的产品不但昂贵,而且相对难以使用。Banzi和Cuartielles决定制作一个微控制器,让他们的艺术和设计专业的学生能够将其应用到他们的项目中。最主要的要求是,它一定要够便宜——理想中的价位应该不高于一位学生出去吃一个比萨的价格——它还要成为一个人人皆可使用的平台。David Cuartielles设计了电路板,Massimo的学生David Mellis编写了在电路板上运行的软件。Massimo 联系了一位当地的工程师,Gianluca Martino,他也在设计学院工作,帮助学生完成他们的项目。Gianluca同意生产第一批的200片电路板。

这块全新的电路板被命名为Arduino,这是设计学院的师生经常光顾的一个当地的酒吧的名字。这块电路板以套件的形式出售,由学生自己组装。第一批电路板很快就卖完了,他们又制造了更多的电路板以满足需求。来自其他地区的设计师和艺术家们也听说了Arduino,并也想将其应用到他们自己的项目中。它的知名度很快提高,更为广泛的创客群体也意识到Arduino是一个简单易用且成本低廉的系统,可以将其引入到自己的项目中,就像当时大刀阔斧地引入可编程微控制器一样。Arduino最初的设计得到了逐步地改进,新的版本也随之出现。目前,官方售出的Arduino已经超过了300000套,他们还通过很多分销商在世界范围内销售。

现在Arduino电路板已经出现了很多不同的版本,下一节将具体介绍它们。

1.2 Arduino硬件

Arduino有很多个版本,但所有的Arduino都基于一片Atmel的8位AVR精简指令集(RISC)微处理器。第一款Arduino基于ATmega8,它具有16 MHz主频和8 KB Flash存储空间,之后的Arduino NG plus和Diecimila(意大利语的10000)使用了具有16 KB Flash存储空间的ATmega168。最近的Arduino版本Duemilanove和Uno使用了具有32KBFlash存储空间的ATmega328,并支持在USB和外接直流电源间自动切换。对于需要更多存储和I/O 的项目,还可以选用具有128 KB Flash存储空间的Arduino Mega1280 和更新的具有256 KB Flash 存储空间的Arduino Mega2560。

这块电路板有14个数字引脚,每个都可以被独立的设置为输入或者输出,还有6个模拟输入引脚。此外,有 6 个数字引脚可以通过编程提供脉宽调制(PWM)模拟输出功能。它还支持多种通信协议,包括串口、串行外设接口(SPI)总线以及I2C/TWI总线等。而每块电路板上都包含的基本功能是一个在线串行编程(ICSP)插座和一个复位按钮。

注意 扩展板(Shield)是一种专门的电路板,用以扩展 Arduino 的功能,它们可以一层一层地堆叠起来,从而添加更多的功能。

下面就来了解一下几种比较常见的Arduino 电路板,就从Arduino Uno 开始吧。

1.2.1 Arduino Uno

“大餐准备好了”——这是2010年9 月25 日,Arduino Uno(意大利语“一”的意思)和它的“大哥”Arduino Mega2560发布时的博客标题。Arduino Uno的引脚与先前的Arduino (包括Duemilanove和更早的Diecimila)保持兼容。

Uno与先前的版本相比,最主要的区别是用一片ATmega8U2微控制器代替了之前版本中过时的FTDI芯片,这片ATmega8U2已经被编程为USB到串口的转换器。ATmega8U2还可以重新编程,从而使Arduino 看起来像其他的USB设备,比如鼠标、键盘或者游戏摇杆。另外一个区别是板上配备了一个更加可靠的3.3V 电压,这有助于提高一些在先前出现过问题的扩展板的稳定性。关于这部分完整的技术说明请参见附录C。

图1-1 展示了Arduino Uno 电路板的布局和引脚。

图1-1 Arduino Uno的电路板布局和引脚

Uno是一片良好的通用型的Arduino,它搭载了供电自动切换电路和经过稳压的板上3.3V 电压,它是Arduino 项目开发入门的首选!

1.2.2 Arduino Duemilanove

Duemilanove(意大利语“2009”的意思)是已生产的最流行的Arduino电路板之一,已取代了它之前的版本 Arduino Diecimila。但现在,它又被更新的 Arduino Uno所取代。Duemilanove的特色是使用了供电自动切换电路,自动选择从USB还是从外部电源供电。它还使用了ATmega328处理器,但2009年3月之前的版本采用的仍然是ATmega168。它的引脚布局和运算能力与Uno相同,只是它使用FTDI芯片实现USB转串口通信。

如果你打算买一片新的 Arduino,那就应该选择 Arduino Uno。如果你已经有一片Duemilanove,并且需要更稳定的3.3V电压或者想做一些基于ATmega8U2的高级编程,那么可以考虑将其升级为Uno。

1.2.3 Arduino Ethernet

Arduino Ethernet是一个与Uno一起发布的低功耗版的Arduino。与其他版本的Arduino相比,它的主要区别在于其电路板上有一个用于连接以太网的RJ45接口以及一个microSD读卡器。Arduino Ethernet没有板载USB转串口驱动芯片,但它有一个6 针的接口,可以连接到一条FTDI串口线或者其他USB到串口转接板,从而提供一条通信链路,以便给电路板编程。它还可以用一个可选的以太网供电(POE)模块供电,这使得Arduino Ethernet可以从一条5类以太网双绞线取电。

将Arduino Ethernet用于远程监控和数据记录站是很理想的,它可以将数据通过板载的microSD读卡器记录到卡上,通过有线方式连接到以太网并从中获得供电。

1.2.4 Arduino Mega

作为Arduino家族的老大哥,Mega使用了一个更大的表面贴装微处理器ATmega1280。Mega曾与Uno 一起升级,现在它采用的微处理器是ATmega2560,与最初的128 KB Flash存储空间的版本相比,新版本具有256 KB的Flash 存储空间。

与标准的Arduino相比,Mega显著提高了输入输出的功能,由于具有更大的存储器,它可以被理想地应用于一些较大的项目,比如控制大量的LED,需要大量的I/O或者需要多个硬件串口的项目。Arduino Mega有4个硬件串口。这块电路板有54个数字输入输出引脚,其中的14个可以提供脉宽调制(PWM)模拟输出,另外还有16个模拟输入引脚。在通信方面,它具有多达4个硬件串口。另外SPI通信和I2C/TWI设备也都是可以支持的。这块电路板还有ICSP插座和一个复位按键。一片ATmega8U2替代了之前版本采用的FTDI芯片,完成了USB串口的通信。

Mega 与现有的绝大部分扩展板都是兼容的,但在购买新的扩展板时最好还是确认一下其是否能与Mega兼容。当你对额外的输入输出引脚和更大的存储有明确需求的时候,可以考虑购买Maga。完整的技术指标请见附录C。

图1-2展示了Mega的引脚和电路板布局。

图1-2 ArduinoMega的引脚和布局。请注意,与ArduinoUno相比,它具有更多的输入输出引脚和额外的串口

下面让我们来了解几款更专用化的Arduino。

1.2.5 另外几种 Arduino 电路板

为了适应特定的需求,Arduino的原始设计被重新打包成不同的形式,从而使Arduino产生了许多变种。让我们一起来了解其中的两个——LilyPad和Nano。

1.LilyPad Arduino

LilyPad Arduino由SparkFun 电子和Leah Buechley设计,它是可穿戴类应用设计的绝佳选择,你可以将你的作品穿在身上,大摇大摆地走起猫步。它设计了很大的连接焊盘以便于缝制,它还有一系列的可缝制的附件,其中包括光线传感器、蜂鸣器、三色LED、温度传感器、电子针线包和加速度计等。这个低功耗版的Arduino甚至是可以洗涤的!只要别忘了在洗之前先把电池拆下来。

LilyPad 与其他Arduino最主要的区别是它具有较慢的8 MHz的处理速度,而其他的Arduino 通常是16 MHz的。还有一点需要注意:它的输入电压绝不能超过5.5 V。图1-3就是LilyPad Arduino的实物图。

图1-3 LilyPad Arduino适合缝到织物上,它有一系列可缝制的附件

2.Arduino Nano

如果你作品的尺寸是受限的,那 Arduino Nano会是一个正确的选择。它由Gravitech设计并制造,3.0 版本的 Nano(搭载 ATmega328处理器)还有一个板载的 MiniUSB 接口,它是一个适合用在面包板上的紧凑型的Arduino。

Nano在功能性上与Duemilanove类似,但它有两个额外的模拟输入引脚。给这块电路板供电可以通过USB接口,也可以通过板上两个分立的引脚:30号引脚可以接受未经稳压的6V至20V的电压,27号引脚可以接受整流后的5.5V供电。电路板会自动选择电压较高的供电用做自己的电源。

这块电路板尺寸较小,这使其成为了尺寸受限的应用项目的理想选择。

1.2.6 复制品的冲击

从一开始,Arduino就一直被认为是一种开源硬件。用户可以免费获得它的设计资料,下载它的计算机辅助设计(CAD)文件,生产并销售基于它的硬件产品。这导致 Arduino 出现了大量的复制品和仿制品,许多制造商按照原始的规格加以修改,就制成了一个仿制品。

Arduino这个名字是一个注册商标,这防止了其衍生品继续使用Arduino这个名字,除非得到了Arduino团队的授权。

1.Seeeduino(没错,有3个e)

如果你喜欢红色,就选这块电路板吧。它由中国深圳的Seeed Studio设计并制造,它基于Diecimila这款早期的Arduino设计,有搭载ATmega168和搭载ATmega328微处理器的两种型号可供选购。它选用不显眼的表面贴装器件,红色的电路板是它的特征。

这片电路板兼容Diecimila的引脚布局和外形尺寸。改进包括自动感应USB和外部供电,还在板上提供了更好的供电电路。

2.Seeeduino Film

相对于 LilyPad 基于织物的架构,Seeeduino Film 则在可穿戴技术上采用了不同的思路。这是一个柔性的Arduino复制品,当然它也可以被用于数据记录项目中。它采用了表面贴装的 ATmega168 和柔性印刷电路板。相比于传统的扩展板,它的扩展模块被其制造商称为帧(frame)。目前它只有一种扩展模块,包括了一个气压计、32 MB的Flash 存储器和一个三轴加速度计,这对入门来说已经绰绰有余了。

3.Boarduino

Boarduino 是一个小型的电路板,与Nano 3.0 类似,但它只以散件形式销售,所以需要用户有一定的焊接技巧。Boarduino 由Adafruit Industries制造,它被设计成可以直接插在免焊接的面包板上。该套件使用 ATmega328 作为控制器,有两种版本可供选择,一种是带USB接口的,另一种带一个串口连接器,需要再配一根串口线才能使用。

4.Sippino

来自SpikenzieLabs的Sippino是一种微型的Arduino兼容型复制品。它也像Boarduino一样以散件形式销售,因此也需要用户掌握焊接技巧。Sippino使用ATmega328,不过它也可以使用ATmega168。所有的数字和模拟输入输出引脚都被引出并排成一行,所以它可以直接插到免焊接的面包板上。你还需要一条FTDI的USB转串口电缆来为它刷写程序。

5.eBay

大量的Arduino仿制型电路板在eBay上销售,它们大部分是Duemilanove的复制品。对于所有的仿制品,你都需要注意:确保它采用了一个 ATmega328 微处理器,并且板上的插座与你的扩展板是相匹配的。

我在eBay上订购的第一片Arduino上的插座是公头的,而不是母头的,这使得它难以接插扩展板。我不得不又购买了一些特制的跳线来将其连接到面包板。虽然这对我们入门来说已经足够了,但你最好能反复确认一下自己要买的东西是不是真的是自己想要的东西,从而尽可能地避免此类错误。

1.2.7 获取一片 Arduino

如果你打算购买用于入门的第一片Arduino,我们推荐你买Uno,它具有出色的USB连接器和更好的板载供电电源。

Arduino Uno 可以从很多在线零售商那里买到。在美国最大的 3 家是 SparkFun Electronics(www.sparkfun.com)、Adafruit Industries(http://adafruit.com)和 Maker Shed (http://makershed.com/)。在英国有 SK Pang Electronics(http://skpang.co.uk)和 oomlout (http://oomlout.co.uk)。在 Arduino 的官方网站上,还有一份全球范围内经销商的列表(http://arduino.cc/en/Main/Buy)。

当你拥有一片Arduino之后,你就可以将它连接到计算机,然后设置你的开发环境了。

1.3 设置你的工作环境

当你得到那片崭新的Arduino,你也许会心里痒痒,想要试试它吧。这一节就来帮你挠挠这个痒痒,我们将学习如何第一次将Arduino连接到你的计算机,你还会了解如何设置你的工作环境。

首先,你需要一片Arduino。正如上一节所述,一片Duemilanove或者一片Uno都是入门不错的选择。你还需要一条USB电缆将Arduino连接到你的计算机。

1.3.1 Arduino 软件

到现在为止,你的Arduino还只是一片上面有许多电子元件的电路板。为了让它能完成一些有意义的工作,你还需要给它指令,这就是为什么需要Arduino的IDE软件的原因。Arduino的IDE软件提供了为Arduino编程所需的一切,包括大量示例程序,用以演示如何将其连接到一些常用设备并与之通信,比如LED、LCD以及一些传感器。

有一个好消息告诉你,像它的硬件一样,Arduino的软件也是开源的,其源代码可以从网上免费下载,网址是 http://arduino.cc/en/Main/Software。只是需要确认你下载的软件版本适合你的操作系统。IDE软件有适用于Windows、Mac OS X和Linux平台的三个版本。每个平台完整的安装步骤请参阅附录A。

让自己熟悉这个 IDE 环境是很重要的,因为今后你会在这里完成所有的编码。在Arduino的世界里,一块代码称为一个Arduino程序(sketch [4])。一个Arduino程序是一串给Arduino的指令,Arduino执行这些指令,实现你设想的功能。IDE软件很大程度上屏蔽了Arduino的复杂性,使得开发一个Arduino项目简单了很多。

注意 术语Arduino程序(sketch)来自Processing,这也是一个设计和艺术类学生常用的编程语言,Arduino IDE 就是基于 Processing 构建的。对于已经熟悉编程的人来说,可以认为Arduino程序就像一个普通的软件程序。

1.3.2 基本硬件安装

Arduino 电路板通过USB 接口连接到你的计算机。USB 电缆提供了Arduino 所需的5V供电,这个供电足以点亮几个LED并做一些基础的实验。

1.3.3 你的 Arduino 工具箱

这是一个推荐给Arduino初学者的购物单:

Arduino(Uno 或者Duemilanove)

迷你面包板和跳线(用以搭建小型的电路)

一些LED

一些电阻

9V 电池

电池连接器

光敏电阻

小型直流电机和伺服电机

压电陶瓷蜂鸣器(一种小型的扬声器,常用于音乐贺卡中)

电位器(一种阻值可调的电阻)

利用这些材料,你可以制作的典型项目有闪烁的 LED、交通灯模型、音乐蜂鸣器、光控开关等。

如果你有点喜欢冒险,你还可以添置以下器件。

Adafruit 的 GPS 和数据记录扩展板,用来记录传感器数据、时间和地理位置信息。

Adafruit 的Wave 扩展板,用来播放SD 卡中的音频文件,营造特殊的效果。

电动机扩展板,用来驱动几个电动机,这也许是制作机器人的第一步。

你也可以直接购买套件,这其中会包含一片Arduino和各种常用的电子元件,很多经销商都在售卖这种套件,而且通常有折扣。

既然你的开发环境已经搭建好了,下面就该写你的第一个程序了,那就是一个硬件版的“Hello World”程序。

1.4 做点什么

在你冲出家门去买那些酷炫的附件之前,完成第一个示例则只需要一片Arduino,因为所有的Arduino都有一个板载的LED,它已经连接在了13号数字引脚上。在第一个示例程序中,你要让一个LED反复地点亮和熄灭。

注意 如果你想来一个小小的冒险,我们也提供了添加一个外部LED的方法,操作步骤请见1.4.3节。

1.4.1 第一个闪烁的 LED

LED有很多种颜色,但连接在Arduino的13号引脚上的LED通常是绿色的。当有电流通过LED时,它就会被点亮,因此你可以将13号引脚当做一个开关来使用。当你打开它时,LED就会点亮,当你关闭它时,LED就会熄灭。

让我们开始写程序吧。

1.4.2 使 LED 闪烁的程序

启动ArduinoIDE并输入如下代码。刚开始可能感觉有点不知所措,但是别担心。我们稍后会在本章详细地讲解其中的每一行都是什么意思。

代码清单1-1 让一个LED闪烁的代码

这段代码清晰明了。首先将13号数字引脚配置为输出,然后循环执行一段代码,这段代码每隔1 s就将13号引脚切换成高电平或者低电平。 延迟时间是以毫秒为单位给出的,因此每1000 ms就会产生1 s的延迟。

注意 请确保你准确地输入了代码。要特别注意行末的分号(;)还有字母大小写的正确使用。从Arduino的角度来看,digitalwrite跟digitalWrite是不同的。

1.4.3 把所有的东西连起来

如果你将Arduino通过USB线连接到你的计算机,这个程序就会控制板上13号引脚旁边的LED。

你也可以控制一个跨接在 13 号引脚和 GND 引脚之间的外接的 LED。连接方式如图 1-4 所示。注意一定要以正确的方式连接LED——较短的引脚是负极(−),较长的引脚是正极(+),所以一定要把较长的引脚插进第13号口,较短的引脚插到GND口。如果你对一些电子学术语感到困惑,有一份不错的入门读物推荐给你,请访问www.kpsec.freeuk.com/compon.htm。

图1-4 在13号引脚和GND引脚之间插接一个LED。注意将LED较短的引脚接负极(GND)

注意 为了防止LED 被烧毁,我们通常需要为它加一个限流电阻,这在第2 章会讲到。目前来说,我们暂且只用板上现有的LED。

插好LED后,你就可以进入下一节,来测试这个程序了。

1.4.4 上传和测试

到了检验你的程序是否运行正常的时候了!首先,将Arduino 通过USB电缆连接到你的计算机。下面你要做几项Arduino和软件有关的设置。

首先,你需要选择Arduino的型号。点击Tools > Board,然后选择你使用的Arduino的类型。见图1-5。

接下来,你需要设置串口,因为USB将Arduino 视为一个串口设备。点击Tools >Serial Port,然后选择你的串口(见图1-6)。对于Mac OS X系统下的Arduino Uno,串口会显示为类似于/dev/tty.usbmodem的形式。而对于像Duemilanove或者Diecimila这类较老的板卡,则会显示为类似于/dev/tty.usbserial 的形式。在 Windows 系统下,串口会被识别成类似于“COM3”这种形式。

图1-5 在这个示例中,我们选择了Duemilanove,但你可以看到有一个很长的列表可供选择

注意 图1-6展示了Mac OS X的板卡选择菜单。Windows系统下的串口选择菜单与图中不同,串口会被显示成类似于“COM3”的形式。

下一步是点击IDE中的Upload按钮,见图1-7。

图1-6 在列表中选择正确的串口
图1-7 点击Upload按钮将程序烧写到Arduino

稍等几秒,就会发现LED以大概每秒一次的速度在闪烁了。

注意 这个程序会一直保留在Arduino的存储器中,即使断电也不会消失,直到你写入另外一个程序将其覆盖。

看到你的第一个LED开始闪烁并且一切都像预期一样,真是件令人兴奋的事情。但 Arduino 能做的还远不止这些。下面会带你更仔细地了解 IDE,然后看一下主编辑器界面。

1.5 熟悉IDE

如前文所述,IDE是基于Processing构建的,其设计目标就是易于学习和易于使用。IDE提供了供你编写和上传程序到Arduino所需的所有东西。

1.5.1 主编辑器

IDE软件打开后,会自动创建一个空的程序,这个程序会临时以当前日期来命名。在你保存这个程序的时候,还可以给它改一个更合适的名字。

图1-8展示的是打开了一个程序的IDE界面,图中还对各种按钮和窗口做了标注。主编辑器顶部的工具栏包含了以下功能。

Verify——检查程序是否有错误。发生的错误会报告在屏幕底部。

New——创建一个新的程序。

Open——显示一个列表,其中包含了之前保存的程序和一些示例程序。

Save——保存当前程序,如果是首次保存则会提示输入一个名字。

Upload——检查代码是否有错误,然后将程序写入到Arduino。

Serial Monitor——在新窗口打开串口监视器(见下一节中的图1-9)。

主屏幕下方有两个窗口。第一个窗口提供了状态信息和反馈,第二个窗口在你校验和烧写程序时提示相关信息。编码的错误也会在这里显示。

图1-8 一个典型的程序,其中标注了按钮和屏幕上的一些区域

代码编辑器会自动匹配花括号{},用来标示代码块,它还会进行语法高亮和自动缩进操作,以提高代码的可读性。

1.5.2 串口监视器

前一节中提到的串口监视器,监视着Arduino 和主机系统间通过USB电缆传输的数据。Arduino可以通过代码发送和接收信息,正如你在图1-9中看到的那样。

串口监视器窗口的上部是用来把数据发送到Arduino的。比如说,你可以通过它将控制指令发送到Arduino,让它驱使一个伺服电机转动一个角度,打开或者关闭一个开关等等。这个窗口的主要部分显示的是Arduino输出的数据。这个可以用来检查来自GPS的数据输出,或者用来监视其他信号。

当将Arduino连接到一个主机系统时,在该系统上运行着与Arduino进行某种交互的软件,串口监视器在调试时将非常有用。你可以用串口监视器检查Arduino是否输出了正确的数据,以及数据的格式是否与预期一致。在串口监视器中,你还可以设置通信使用的波特率、文本的自动滚动以及发送到Arduino的数据的断行方式。

图1-9 串口监视器显示了一片Arduino的打印输出,图中打印的是一张ASCII码表

1.5.3 捕获错误

现在让我们转向主编辑器。屏幕的主要区域就是你输入代码的编辑器。当你输入完代码后,既可以选择校验你的程序,也可选择将其写入Arduino。

代码中的错误会显示在下方的窗口中。图 1-10 中,我们通过故意在其中一行的行末漏掉了一个分号(;)而引入一个错误。

软件会提示错误的具体原因,还有出错的位置。如果代码错误检查器没有准确地指出哪里错了,但愿它还是能提供足够的信息,指引你查找错误的方向。正如在图 1-10 中看到的那样,代码检查器正确识别了缺失分号的错误,以及错误发生的位置。

图1-10 代码编辑器报告了一个我们在代码中故意引入的错误。代码检查器指示了它认为出错的位置,这与我们的预期一致

1.5.4 流程

IDE到底对你的代码做了什么?当你点击Upload按钮后,它会检查代码是否有错误,并进行一些简单的翻译,将Arduino程序转换为合法的C++代码。代码接下来会通过编译,将其转换为Arduino可以理解的形式。然后,产生的文件会与Arduino标准库组合,形成最终写入到Arduino硬件的代码。

既然你已经大概熟悉了IDE,下面就要更好地感受一下Arduino的程序了。

1.6 Arduino程序的结构

一个典型的Arduino程序由两个子程序组成:第一个是初始化子程序,称为setup,第二个子程序通常包括程序的主体,称为loop。下面我们来详细了解一下这两个子程序。

1.6.1 setup 子程序

如果你打算出去跑步,在出门之前你得先做一些准备工作:穿上你的运动鞋,拿一瓶水,做一下伸展运动,……。对于Arduino,也是一样的道理。在正式开始工作之前,你需要先做一些准备工作。

这些准备工作在一个叫做 setup 的初始化子程序或者说是函数中完成(详见代码清单)。通常在setup函数中完成的工作是初始化数字引脚——将它们设置成输入或者输出——还有设置串口通信的波特率。

代码清单1-2 setup函数

代码清单1-2中的这段初始化代码将13号引脚设置为输出,并将串口通信的波特率设置为9 600。在 setup前的 void表示这个函数不会返回一个值。

即使你没有任何东西需要设置,你仍然需要输入这个函数,否则在程序校验或者烧写时就会报错。只要写一个这样包含注释的空函数就可以了:

下面我们来了解另外一个必须的函数,loop。

1.6.2 无限循环

当你去跑步的时候,你会不停地跑,直到完成为止(无论你如何定义完成)。Arduino跟这个过程是一样的,它也会不停地循环执行一个叫做loop的函数,直到满足一些条件,或者Arduino被断电时停止。下列代码清单展示了代码清单1-1实现的闪烁的LED应用中的loop函数。

代码清单1-3 一个闪烁的LED的示例程序

在这个程序中,Arduino反复执行这段程序,点亮LED一秒钟然后关闭一秒钟,不停地循环直到Arduino断电。

既然你已经了解写一个Arduino程序的基本知识,下面我们以一项重要的编程技巧来结束这一章。

1.7 为代码编写注释

你刚刚写了一段引以为豪的绝妙的代码。设想一下,在6个月之后,别人在浏览你过去的工作时看到了这段代码,但他们却搞不太懂这段代码在干什么或者是如何工作的。一段简单的说明在这时也许会派上大用场。在这种情况下,为你的代码编写注释就非常有必要了。

为程序添加注释有两种方式:单行注释和块注释。单行注释的方法是在行首添加一个双斜线(//)。这就是在告诉编译器这只是一段注释,可以将它忽略。当你想将一个代码块作为注释时,将这段代码以/*开头,以*/结尾即可。下面就演示了这两种方法:

你应该在哪里添加注释呢?每个程序的开头都应该有一个块注释,在其中说明这个程序起什么作用,谁在什么时间写了这些程序以及版本号等等。下面的代码清单就给出了一个代码头的示例。

代码清单1-4 代码头示例

遍布代码中的单行注释能够让你快速地了解每段代码都起什么作用。你并不需要对每一段代码都写注释,只要添加那些你认为在日后可能会帮自己和他人理解代码的注释就够了。但多写点注释总比一点都不写要好。下列代码清单展示了一些典型的代码注释。

代码清单1-5代码注释示例

我们在这节介绍了代码编辑器,了解了一个Arduino如何由setup和loop函数构成,最后探讨了为代码编写注释的必要性。

1.8 小结

这是十分忙碌的一章,我们讲解了大量的背景知识。我们从学习一点Arduino的历史开始,介绍它在意大利互动设计学院的起源。我们了解了Arduino Uno和Mega这两种板卡的引脚和主要元件布局。我们还简要介绍了其他几种版本的 Arduino,包括 LilyPad 和Seeeduino Film,并介绍了它们能提供什么特性。你搭建了开发环境并写了第一个Arduino程序,让Arduino走进你的生活。

我们详细讲解了 Arduino 的 IDE 软件并知道了一个 Arduino 程序是由 setup 和loop函数组成的,我们还介绍了串口监视器的主要作用,最后讲解了为代码添加注释的重要性。下一章是一个入门教程,带你循序渐进地开发一个项目,并介绍实现它涉及的一些步骤。

第2章 数字输入和输出

本章涵盖的内容

使多个LED闪烁

使用按钮控制一系列LED的闪烁

一步一步地完成一个项目

学习关于中断的知识

制作一个反应速度计

现在你已经对 Arduino 可以干什么有了一个直观的认识,并完成了你的首次试运行,是时候深入研究一下了。你会利用在第 1 章中所学的知识,构建你第一个完整的项目——使用LED、按钮和定时器搭建一个反应速度计来记录反应时间。让我们开始吧。

2.1 准备开始

为了完成你的反应速度计,你需要一些元件:

1 块面包板,用来组装你的项目

一些跳线,用来将原件连接到一起

6 个红色LED,你也可以用其他你喜欢的颜色

1 个绿色LED

1 个按钮式瞬时接触开关

7 个电阻,每只阻值约180Ω,或者比180Ω 稍大一些

1 个10 kΩ 的电阻

元件如图2-1所示。

接下来,你要在面包板上搭电路了。

图2-1 完成本章入门教程所需的器件

2.1.1 面包板的使用

在项目的开发阶段,面包板是组装电路的极佳选择,因为它使你可以很容易地移动和增加元件。

一块面包板的典型布局如图 2-2 所示。面包板由许多插座组成。在面包板的中部,插座是纵向相连的,在正中间断开,而在面包板的上方和下方,插座则是横向相连的。上方和下方的区域通常用来为所搭建的电路提供电源。元件之间的连接则通常使用各种不同长度的跳线。

图2-2 面包板布局:顶部和底部的两排插座是横向相连的,其他的插座是纵向相连的,并在面包板中间的凹槽处断开

现在就来添加第一批 LED 和电阻,让它们来占据你的面包板吧。

2.1.2 电路图

本项目的第一步,你要在面包板上插接5个LED。图2-3所示的图形,也叫电路图,它表示了你即将要搭建的电路。如果你现在看不懂它也别担心——你很快就会掌握阅读电路图的窍门,并将其转化为面包板上的电路。

在电路图中,Arduino的数字引脚D8至D12各连接到一个LED(LED1至LED5),每个LED都连接了一个限流电阻(R1至R5)。负极,通常就是LED上较短的那个引脚,被连接到了Arduino上的GND引脚。电路的电源由连接到你的计算机的USB线提供。

当你熟悉了电路图,并且明白了LED、电阻和Arduino是如何连接到一起的,你就可以将元件插接到面包板上了。

图2-3 电路图表示Arduino连接了5个LED

2.1.3 添加 LED

在图2-3中,LED1至LED5依次连接到了Arduino的第8~12号数字引脚(在电路图中以D8至D12表示)。每个LED都分别连接到Arduino的一个引脚。

每个LED上都串联了一个电阻,这些都是限流电阻,它们可以限制流过LED的电流,以免LED被烧毁。

计算限流电阻的阻值

限流电阻的阻值通过下列公式计算得出:

(工作电压−LED正向电压) /电流的安培值=电阻的欧姆值

根据经验来说,绝大多数LED都可承受最多20 mA的电流而不至于烧毁。mA是表示毫安培,通常简称毫安。正向工作电压对于红色、黄色和橙色的LED来说是1.5 V,对于绿色的LED来说是2.0 V,对于蓝色和白色的LED来说是3.0 V。

你使用USB为电路供电,也就是5 V。如果你使用具有1.5 V正向电压的红色LED,假设工作电流是20 mA,那么计算电阻值的方法如下:(5 V~1.5 V) / 0.02 A = 175 Ω。

与之最接近的可用的电阻的阻值是180 Ω,所以为可靠地保护LED,你需要使用180Ω或者更大的电阻。我们使用了 270 Ω 的电阻,因为这个型号我们有很多,而且使用它们时 LED 仍然可以点亮。

2.1.4 连接硬件

确保Arduino没有连接到你的电脑上,在你连接硬件电路的时候请不要给它通电。

图2-4展示了如何使用一根跳线将Arduino的第12号引脚连接到第一个电阻,从而完成第一个LED的连接。注意电阻要跨过面包板中央的横槽,确保LED较长的引脚,也就是正极,连接到了电阻,而较短的引脚,也就是负极,连接到了面包板上部的GND电源插座。

接下来,按照图2-5中那样,用跟刚才一样的方式连接剩下的4个LED。

图2-4 将Arduino的第12号引脚通过一个限流电阻连接到第一个LED
图2-5 将5个电阻连接到Arduino的第8~12号引脚

图2-6展示了连接完成后的电路。注意将Arduino上GND引脚与面包板上公共端用一根长跳线连接在一起。你可以使用USB接口为这个项目的电路提供电源,因为这些LED只需要很小的电流。

图2-6 组装完成后的电路,通过USB接口提供电源

现在已经组装好了电路,接下来你就可以开发程序代码,来让这些LED闪烁起来了。

2.1.5 使5个LED闪烁的程序

完成硬件的连接后,你就可以开始编程序了。启动Arduino IDE,然后新建一个Arduino程序。仔细地将以下代码输入到编辑器窗口中。

代码清单2-1 5个闪烁的LED,一个接一个地闪烁

在程序的第一部分,声明了程序的变量。数组 ledArray 用来设置你要使用的数字引脚编号。

你也可以直接使用引脚编号为变量赋值,就像这样:

但当你要操作一组功能类似的引脚时,使用数组就会更加高效。

在setup子程序中,可以使用一个for循环将8~12号引脚全部设为输出。

在程序的主循环中,可以再使用一个for循环,循环调用的digitalWrite函数,通过索引值count从数组ledArray中获得要写入的LED引脚编号,依次将引脚设置为高电平,从而将相应的LED点亮。在75 ms的延时之后,引脚再次通过 digitalWrite设置为低电平,相应的LED就会熄灭。

这个循环继续执行,就会以一个短暂的延时,轮流点亮和熄灭每个 LED。你可以通过修改timer变量的值来修改延时的长短。

注意 digitalWrite 函数的作用是将相应的引脚设置为高电平或者低电平。如果相应的引脚设置为高电平,digitalWrite 将其电压置为 5V,这就足以点亮一个 LED;如果相应引脚设置为低电平,digitalWrite将其电压置为0V,LED就会熄灭。

现在你已经搭建好电路并编写好了程序,接下来让我们来测试一下它吧。

2.1.6 烧写和测试

用USB电缆将Arduino连接到你的计算机上,校验这个程序就会执行编译。如果发生了任何错误,请确保你已经准确输入了代码清单 2-1 所列的代码。要特别注意大括号{}左右匹配,还有不要漏掉分号(;)。当程序成功编译之后,就可以将其写入到Arduino中。如果烧写过程中出现错误,请检查是否已经选择了正确的Arduino类型和串口。

一旦程序被写入到Arduino,在一个短暂的延迟之后,LED就会开始一个接一个地闪烁。如果在程序在编译和写入到Arduino的过程中都没有发生任何错误,但LED并没有闪烁,请将Arduino从USB电缆上断开,然后仔细检查电路的连线。确保LED连接正确而且负极已经接地,然后尝试再次接上USB电缆。

注意 你并不需要为Arduino重新烧写程序,因为程序会保留在它的内置存储器中。

你的 LED 现在已经开始闪烁了,现在是时候做些更复杂的事情了。在这个入门教程接下来的部分中,你要为这个电路添加一个按钮。

2.2 获得控制权

现在你的程序已经开始工作了,伴随着 LED 一个接一个地点亮和熄灭,下面我们要添加一个按钮,来控制这电路了。这个按钮用来启动和停止LED序列的闪烁。

2.2.1 电路图

电路图如图2-7所示。你需要保留最初版本的电路,并再添加一个按钮(S1)和一个阻值为10 kΩ的电阻(R6)就可以了。

在你看懂了修改过的电路图之后,就可以把新的元件添加到面包板上了。

图2-7 电路图表示Arduino连接到5个LED并由一个按钮控制

2.2.2 连接

首先,将Arduino从USB电缆上断开,然后将按钮安装到面包板上,如图2-8所示。请注意如何将其跨接在面包板中间。电阻R6是一个下拉电阻,在按钮未被按下的时候,它能防止D2的输入浮空,而将D2的输入下拉到地(GND),也就是低电平。当按钮按下的时候,D2 的输入会接到5V,也就是高电平。

图 2-9 展示了在面包板上组装完成后的电路。Arduino 的供电由连接在计算机上的 USB电缆提供。

上拉电阻和下拉电阻

在包含按钮的电路中,上拉电阻和下拉电阻的使用是十分普遍的,它可以防止由电气噪声或干扰带来的错误信号。这个电阻将输入口的电平保持在与程序检测电位相反的电平上。一个上拉电阻将电平上拉到5 V,一个下拉电阻将电平下拉到地。

当你连接好按钮和增加的电阻后,就可以来处理一下代码这边的工作了。在这个程序里,我们要使用Arduino中一个专门的特性,称为中断。

图2-8 将按钮连接到面包板上
图2-9 组装完成后的电路,通过USB接口提供电源

2.2.3 认识中断

Arduino的中断非常强大,它可以在任何时候打断程序流程的执行。中断就像你就要走进浴室时突然有人按门铃一样——你必须马上处理它。Arduino也是一样的,一旦中断信号发出,你的程序就要马上去处理它。

标准的Arduino可以使用最多两个中断,但在这个项目中,你只会用到一个。当按钮被按下时就会发生一个中断,第一次按下按钮会时 LED 序列停止闪烁,再按一次则会使其重新开始闪烁,以此类推。

2.2.4 通过按钮控制 LED 的程序

下列代码清单就是新版的程序。你可以在现有程序的基础上修改,也可以再新建一个程序。

代码清单2-2 开始-停止显示

在代码的开头,你将变量state声明为volatile。用volatile关键字修饰一个变量,表示该变量可能在其出现的代码段以外被修改,volatile的主要用途之一就是用于中断处理,我们在这里遇到的就是这种情况。

标准的Arduino有两个中断:中断0绑定在2号数字引脚,中断1绑定在3号数字引脚。Arduino Mega还有4个额外的中断:中断2 绑定在21号数字引脚,中断3绑定在20号数字引脚,中断4绑定在19号数字引脚,中断5绑定在18号数字引脚。

注意 函数 attachInterrupt(interrupt, function, mode)有3 个参数。第一个参数是中断号,可以设置为0或者1;第二个参数是中断调用的函数,必须是一个无参数无返回值的函数;第三个参数是产生中断的模式。中断模式可赋下列4种值:设置LOW时,中断在引脚电平为低时触发;设置为 CHANGE 时,中断在引脚电平改变时触发;设置为RISING时,中断在引脚电平从低电平变为高电平时触发;设置为FALLING时,中断在引脚电平从高电平变为低电平时触发。

在这个程序中,将中断的触发方式设为RISING。在按下按钮时,会将相应引脚的电平从低电平切换到高电平,中断就会在这个时候被触发。这个程序的另外一个改变是,现在所有的LED会以一个很小的间隔一个接一个地点亮,当所有的LED都被点亮后,会有一个很小的停顿,之后再以一个很小的间隔一个接一个地熄灭。这个过程会不断重复。按下按钮会使这个过程停止,再按一次按钮会让它重新开始。

抖动消除

在中断服务程序,也就是ledOnOff()函数中,我们还添加了一些代码,用于处理机械按钮中存在的抖动(bounce)问题。当按钮被按下时,在它从断开状态转换到闭合状态的瞬间,其中机械部件的接触并不完美,而是会产生一系列被称为抖动的干扰信号,导致与之相连的引脚电位高低变化数次后才最终稳定。按钮通常需要10 ms~50 ms才能最终稳定,但当你观察到一些奇怪的结果并怀疑其是由于抖动造成的时,你也可以尝试将这个时间改得更长一些。

在这个程序中,对抗按钮抖动现象的方法是使用了一个叫做lastMillis的静态变量。静态变量在多次调用函数之间会保留其数值。millis()函数会返回程序开始运行以来经过的毫秒数,每次调用中断服务程序时,都将 millis()的返回值赋值给变量newMillis。将newMillis与lastMillis的数值进行比较,如果结果小于50ms (处于抖动期),就什么也不做,然后回到主程序中继续循环。如果结果大于等于50 ms,说明已经在抖动期之外,意味着按钮真的被再次按下了。在这种情况下,在返回到主循环之前需要更新变量state并将newMillis的值赋给lastMillis。

警告 很多人认为中断是一个高级技巧,但只要你够仔细,应该可以毫无障碍地使用它。在中断服务程序中,让你的程序代码尽可能小巧,这将会避免你在程序的其他部分遇到预料之外的事情。另外一个警告就是,你不能在中断服务程序中使用delay函数。

接下来让我们一起来测试我们最新的程序吧。

2.2.5 烧写和测试

将Arduino通过USB电缆连接到你的计算机。确保你的程序已经被正确编译,然后将其写入到Arduino 中。当程序烧写完成后,所有LED都处于熄灭状态,直到你按下按钮。尝试着多按几次按钮,观察LED序列如何开始和停止。

2.2.6 使用 break 语句

保留原来的电路不动,现在把一个break语句添加到你的程序中。break指令用于跳出一个循环或者switch语句。你利用它停止LED序列并保持LED的点亮状态,直到再次按下按钮,所以如果你在已经点亮3个LED的时候按下按钮,这3个LED就会一直处于点亮状态,直到再次按下按钮,序列才会继续循环点亮。

下列代码清单给出了使用break语句的新版程序。

代码清单2-3 添加break 语句

当所有的LED都点亮后,你检查状态变量state,看按钮是否已经被按下。如果按钮已经被按下,就会执行break语句,使程序从循环中跳出。当按钮被再次按下的时候,序列重新开始循环。

下面要检查一下你的程序能否正常工作。

2.2.7 烧写和测试

确保你的程序已经正确地编译,然后烧写并测试它。当按下按钮时,闪烁的 LED 序列应该会暂停,再次按下按钮,序列应该重新开始循环。

是时候让你的项目进入到下一个阶段了。你要来制作一个反应测试仪。

2.3 反应测试仪

这是你在本章中最后一次电路修改。你要在电路中再添加两个 LED,最好是一红一绿,它们被用作开始和停止指示灯。最初是红色LED点亮,当它熄灭且绿色LED点亮时,你要尽可能快地按下按钮,来让在前一节中搭建的 LED 序列暂停。反应速度处于平均水平的人,可以在序列有2个或者3个LED亮起时将其停止。

2.3.1 电路图

请看图2-10给出的电路图,注意新加入的两个LED是如何连接到Arduino的。绿色的LED6和红色的LED7已被添加到电路中,一起加入的还有两个220Ω的限流电阻,R7和R8。

图2-10 电路图表示连接有一个按钮和7个LED的Arduino,其中2个LED用作开始/结束指示灯

2.3.2 连接

图2-11展示了连接完成后的Arduino和面包板,已将两个新加的LED和两个电阻添加到了现有的电路中。

这就是本章最后完成的电路。下面让我们看一下本章的倒数第二个程序。

图2-11 组装完成后的电路,其中新加的两个LED用于指示开始和结束

2.3.3 测试反应速度的程序

下列代码清单给出了反应测试仪的程序,请将其仔细地输入一个新的程序文件中。

代码清单2.4 反应测试仪

在这个程序中,将 6 号和 7 号引脚配置为输出模式,这两个引脚会连接到两个新的LED。还用到了一个 Arduino 的函数 random,它可以接受两个参数,在这个程序中是randMin和randMax。这个函数返回一个long型的数值,其值在randMin(含)到randMax(不含)之间。

初始化随机数生成器的种子

你可以在初始化阶段调用randomSeed来初始化随机数生成器的种子:

randomSeed(analogRead(0));

传递给randomSeed的值取自未连接的0号模拟引脚的模拟输入值。由于电气噪声的影响,一个未连接的模拟引脚的输入值是不断变化的。

变量state用于控制程序逻辑,并且已经与按钮的状态绑定。第一次按下按钮时,会触发下列事件:原来的5个LED熄灭,红色的stopLed点亮,绿色的goLed熄灭。在一段随机的时间之后,stopLed熄灭,goLed点亮,并启动由原来的5个LED构成的序列,5个LED一个接一个地点亮。按下按钮会停止LED点亮的过程。再次按下按钮会使整个流程重新开始。

2.3.4 烧写和测试

将Arduino连接到USB电缆,确保你的程序已经被正确编译,然后将其写入到Arduino中。按下按钮试玩一下,看看你的反应速度有多快。你还可以跟别人比拼,看谁的反应速度是最快的。

你还可以在程序中再加入一些代码,让它用定时器更精确地记录反应时间。我们会在下一节中讲到这些。

2.4 反应速度计:谁真正拥有最快的反应时间

在本章的最后一个程序中,会使用一个定时器更精确地测定你的反应时间。电路可以保持不变,只需要对程序做一些修改。

2.4.1 测定反应速度的程序

下列代码清单给出了新的反应速度计的程序,你可以修改之前的程序,也可以新建一个程序文件然后输入以下代码。

代码清单2-5 反应计时器

在这个程序中,添加了一个定时器用来准确地测定你的反应时间。当时间被测定后,数据会通过串口发送出来。串口在程序的setup函数中使用下列命令启动:

Serial.begin(9600);

数字9600是波特率,也就是Arduino发送数据的速率。为了能解码这些数据,上位机程序(在这个例子里是串口监视器)的波特率设置必须要与Arduino的保持一致。

当需要输出数据时,你可以使用两个函数:Serial.print和Serial.println。这两个函数唯一的区别在于,Serial.println函数会在输出字符串的结尾添加一个回车换行符。

2.4.2 烧写和测试

确保程序已经正确编译,然后将其烧写到Arduino。跟之前一样,用按钮来控制反应速度计的开始和停止。 图2-12 展示了最终完成并且正在工作中的作品。

为了看到反应时间,需要使用Arduino IDE中的串口监视器,请确保波特率已经设置为9600。图2-13展示了一些记录到的反应时间。

图2-12 运行反应速度计的最终电路
图2-13 串口监视器显示了反应时间

显示这些反应时间有助于平息你跟你朋友之间的争论!

2.5 小结

在本章,你了解了如何开发一个典型的项目,从一个简单的程序开始,然后逐步增加其复杂性。在开发一个项目的过程中,每次只做出较少的修改,可以使其更容易调试和发现错误。如果程序不能正确地通过编译或者显示的结果与预期不符,你只需要着眼于最近修改和增添的代码就可以了。

这个项目将你带入了数字电路的世界,这里的输入输出只有两个状态:高电平和低电平。你已经探索了一些Arduino的功能,包括可用的函数,以及强大的中断功能。在之后的章节中,你会更加深入地研究几个数字引脚及其具有的更多特殊功能。

在下一章中,你要暂时离开数字电路的世界一会儿,然后去探索一些Arduino提供的模拟功能。

第3章 简单项目:输入和输出

本章涵盖的内容

着眼于模拟世界

读取一个模拟输入

使用扬声器发声

搭建一架五声音阶电子琴

在前一章中,我们了解了Arduino数字化的一面,循序渐进地搭建了一系列项目,展示了Arduino的输入、输出和中断等特性。在本章,我们将着眼于Arduino的另一面,看看它如何与我们周围的世界交流。

基本上,我们周边的世界可以分成两部分——模拟和数字——在这一章我们将研究与模拟世界的交互。让我们再从一个简单的元件开始,电位器,它可以为Arduino提供模拟量的输入。接下来,我们要尝试添加一个传感器——压电换能器,它既可以提供模拟输入,也可以进行模拟输出。我们接下来会再添加4个压电换能器和一个小型扬声器来制作一架五声音阶电子琴。

以下是完成本章所需的元件:

1 片Arduino 板卡

1 块面包板和一些跳线

1 个小型电位器(最好用微调型电位器,因为它很容易插进面包板)

5 个稳压二极管,0.5W5.1V(我们使用的是BZX55C5V)

5 个带线的无外壳的压电换能器(敲击传感器)。

5 个1 MΩ(100 万欧姆)电阻。

1 个1 kΩ 电阻。

1 个8Ω 的小型扬声器。

下面让我们开始学习模拟电路的基础知识吧。

3.1 认识模拟电路

在前一章中,已尝试使用了可以闭合和断开的按键,但如果你想测定一个模拟量的输入,比如一张照片或者一个力敏电阻,那又该怎么办呢?如果Arduino是一个纯数字的设备,那你将无法测定这些量,这也就限定了你所能制作的作品的范围。幸运的是,Arduino也已经具备了与模拟世界交互的能力。

Arduino可以调节一个LED的亮度,却不改变施加在LED上的电压,这是利用了一种专门的技术,称为脉冲宽度调制(PWM),或者简称脉宽调制(后面会详细讲解)。除了可以利用脉宽调制进行模拟输出以外,Arduino 还可以接受0~5V 的模拟输入。

标准的Arduino有6 个模拟输入引脚,标注为ANALOG INA0、A1、A2、A3、A4、A5;另外,还有6个模拟输出引脚。

在本章,我们将集中精力讲解analogRead函数,而analogWrite函数我们留到以后的章节再讲解。

让我们来了解一下数字设备和模拟设备有什么区别吧。

3.1.1 模拟和数字有什么区别

那模拟世界与数字世界的区别是什么呢?在数字世界中,所有的事物都只有两个状态,开关只能是开或关,LED只能是亮或灭,你要么是醒着的,要么是睡着的。这些状态可以用多种方式表示,0或1,开或关,高或低。Arduino的数字引脚也以与之相同的方式工作,当设置为输出时,它们要么输出0 V,要么输出5 V,0 V就是逻辑零,5 V就是逻辑一。在模拟世界中,事物都有很多种取值。音乐中的音符涵盖了很多个频率,汽车加速的过程达到了很多个速度,一束正弦波在最大最小值之间平滑过渡,温度在最大最小值之间连续变化。

我们时常想要探索模拟的世界,Arduino有6个模拟输入引脚可以帮我们完成这个愿望。但Arduino仍然是一个数字设备,所以你需要一种方法,将输入的信号转换为数字表示。这项工作是由模数转换器(analog-to-digital convertor,ADC)完成的。表3-1列出了Arduino 和Arduino Mega中模拟输入和模拟输出引脚的分辨率、电压范围和引脚编号。

在下一节中,要用电位器来提供一个手动可调的模拟输入,你可以通过串口监视器的显示,即时地观察到这些改变带来的效果。

表3-1 Arduino的模拟分辨率和模拟输入输出引脚

3.1.2 读取电位器

为了观察Arduino的模拟输入功能是如何工作的,使用一个电位器是最简单的方法。电位器有各种不同的形状和尺寸,如图3-1所示,它们广泛应用于我们身边的各种设备中。如果你拥有一套带有音量旋钮的立体声音响,那它的音量调节很可能就是基于对一个电位器的旋转实现的。其他的例子包括使用电位器控制灯光的亮度,控制电炉或其他电热炊具的温度等。无论电位器的形状和尺寸如何,都可以通过某种方法改变它的电阻,无论是以线性方式还是以对数方式。

图3-1 几种电位器

大多数电位器有3个引脚,中间的那个通常称为滑片,它通过移动接触器在一个固定电阻上的位置来改变电阻。对于本章,你需要一个电阻线性可调的电位器,而且要方便插接到面包板上,微调型电位器通常是一个理想的选择。

图3-2给出了电位器的电路符号。中部的箭头,也就是滑片,叠加在标准的电阻符号之上,用来表示这个电阻是可变的。

图3-2 电位器的电路符号:美制(左)、国际标准(中)、旧制(右)

下面让我们动手将一个电位器连接到Arduino上。

3.1.3 连接硬件

现在你已经知道要用哪一种电位器了,让我们将它安装好吧。电路图如图3-3所示,电位器标记为R1,连接在5V 和地(GND)之间,滑片连接到模拟输入引脚A0。当你顺时针或逆时针旋转电位器的时候,就会将A0 的电压在0~5V 之间调节。

将电位器插接到面包板上。中间的引脚通常是滑片,也就是你要连接到模拟输入端A0的引脚。组装完成后的电路如图3-4所示。

图3-3 电路图表示Arduino连接了一个电位器
图3-4 将电位器连接到Arduino

图3-4所示的电位器没有旋转柄,但可以插入一个微调工具来转动。如果没有电位器微调工具,你可以使用一个小型的一字型螺丝刀代替。

电位器连接好后,就可以开始写程序来读取它的数值了。

3.1.4 读取电位器的程序

下列代码清单给出了用于读取A0 模拟引脚上0~5V 模拟数值的程序。

代码清单3-1 读取电位器

你并不需要在初始化函数中将sensotPin配置为输入,因为所有的模拟输入引脚已经默认配置成了输入。变量sensorValue存储了由analogRead函数读取到的数值,这个数值在0~1 023(含)之间,0 表示0V,1 023 表示5V。

两次读取之间10ms的延时使得Arduino的模数转换器有时间来稳定并捕获到一个准确的数值。在Serial.println(sensorValue, DEC);这一行中的DEC指示println以十进制方式输出数据。其他的选项还包括HEX(十六进制)、BIN(二进制)和OCT(八进制)。

3.1.5 烧写和测试

将程序输入IDE之后,校验使之通过编译,然后将Arduino连接到你的计算机并将程序写入其中。打开IDE中的串口监视器,然后从头到尾地顺时针和逆时针旋转电位器。你应该可以看到串口监视器输出的数值随电位器的旋转而改变。示例输出如图3-5所示。

你现在知道了如何将一个值读入一个模拟输入引脚。下一节中,你要将Arduino连接到一个压电换能器。为此,你需要一些额外的元件,因为压电换能器可以产生非常高的电压,这可能会损坏Arduino。

图3-5 电位器旋转时显示的数据

3.2 压电换能器

你是否收到过一种生日贺卡,在它打开时就会播放一段有点走调的 Pointer Sisters 的《I'm So Excited》旋律。压电换能器还应用于很多其他的设备,比如移动电话、门铃以及水下声呐。

图3-6展示了一个典型的可以用于发声的压电换能器,它与那些在音乐贺卡中使用的类似。

图3-6 一个典型的压电换能器,它常用于音乐贺卡,也在鼓组中用做传感器

它们是如何工作的?术语压电的意思就是“由压力产生电流”。当一个压电设备受到挤压时,它就会产生一个电荷,如图 3-7 所示。换能器在与 Arduino 一起使用时的一个典型应用就是将其作为敲击传感器。

当换能器受到击打或碰撞时,Arduino就可以检测到,并触发相应的动作,比如点亮一个LED或者用扬声器发出一个声响。

相反地,当一个电荷施加到压电换能器上时,它就会发生形变,如图 3-8 所示。如果你对其施加一个以一定频率变化的电压,换能器的振动就会使其发出声音或者旋律。用在音乐贺卡或者蜂鸣器中的压电换能器正是在这种模式下工作。

图3-7 当压电换能器发生形变时,就会产生一个电荷,交替挤压和松开换能器,就会产生一个变化的电压
图3-8 当对压电换能器施加一个变化的电压时,换能器就会发生形变

正如你所看到的那样,一个压电换能器既可以作为输入设备,也可以作为输出设备。以压电换能器为核心的声呐设备,就以这样的方式发出一个声音信号并接收回声。这就是潜艇电影中最让人熟悉的经典探测音。通过测定探测音从发出到接收到回声的时间,就可以计算出距离目标有多远。我们将在第6章讲解另外一个示例,那时会将Devantech SRF05作为测距仪。

现在你已经对压电换能器有了一个大概的了解,并知道了它如何工作,下面就要将压电换能器作为一个敲击传感器了。当Arduino检测到敲击传感器受到击打或者碰撞时,它就会点亮一个LED。

3.2.1 电路图

对于这个项目,你需要下列元件:

1 片Arduino

1 块面包板和一些跳线

1 个稳压二极管,0.5W5.1V(我们使用的是BZX55C5V)

1 个无外壳的压电换能器(我们使用了一个在eBay上购买的27 mm的型号)

1 个1 MΩ 电阻

你要使用一个不带外壳的压电换能器,这会比带外壳的效果更好。

受到敲击时,压电换能器会产生非常高的电压,足以对 Arduino 造成损坏。稳压二极管可以保护Arduino免受高电压的损坏,而电阻的作用是泄放来自换能器的高电压。

图3-9展示了完整的电路图。注意稳压二极管的的方向,还有如何将其与电阻和压电换能器并联。

图3-9 一个压电换能器连接到A0模拟输入引脚。当换能器受到敲击时,稳压二极管可以保护Arduino以免其受到换能器产生的高电压的损坏

现在你已经看过了电路图,可以在面包板上组装这个电路了。

3.2.2 连接硬件

电路除了Arduino 以外还有3 个主要元件:一个5.1 V 的稳压二极管,一个1 MΩ 的电阻和一个压电换能器。

如前文所述,稳压二极管和电阻都并联在压电换能器上。

下面就可以将器件安放到面包板上了,要特别注意压电换能器的极性,极性可以通过由低熔点焊料焊接在上面的一红一黑两条线来区分。黑线连接到电路中的GND部分,红色连接到Arduino的模拟输入引脚A0。

稳压二极管需要以正确的方式连接才能保护Arduino的模拟输入端电压不超过5 V。按照惯例,在二极管的阴极或者负极,一般会设计有一条黑色的条纹,这一极会被连接到GND,但在你的电路中,你要将二极管反向偏置,也就是将二极管的阴极连接到电路的正极。稳压二极管的工作原理是,只在超过反向击穿电压的时候导通,在本例中击穿电压是5.1 V。任何超过5.1 V的电压都会导致二极管反向导通并与 GND 短路,从而保护Arduino的输入端。

当这三个元件都连接到面包板上之后,你最终就可以连接Arduino的GND和模拟输入端A0了。图3-10展示了组装完成后的电路,包括到Arduino的连接。

图3-10 组装完成后的电路。注意稳压二极管的方向和压电换能器的极性

当所有器件组装完毕并连接到 Arduino之后,你就可以开始写程序来让 Arduino 与压电换能器协作了。

二极管

二极管是一种双端器件,电流沿一个方向流过时电阻很小,而沿另一个方向流过时电阻很大(理想情况下是无穷大)。稳压二极管是一种特殊的二极管,它被设计成在超过击穿电压(膝点电压)时允许电流反向通过。

3.2.3 用于测定压电换能器输出的程序

首先,你要使用如代码清单3-1所示的程序。如果你没有保存之前的程序,请创建一个新的程序文件并输入这些代码。

接着,你将Arduino 连接到USB接口,烧写你的程序并启动串口监视器。最初,串口监视器应该只输出0值。现在,尝试着轻轻敲打或挤压换能器,然后观察传感器的数值如何改变。一个典型的输出如图3-11所示。

图3-11 在按压或者敲击压电换能器时串口监视器的输出

当换能器受到击打时,这个数值会快速攀升到最大值,然后跌落回0。不同的数值反映了换能器受到挤压或击打的强烈程度,值越大说明其受到的挤压越猛烈。如果什么都没观测到,请检查你的连接,尤其注意检查换能器和稳压二极管的方向。

下面你要修改程序,只把超过一个既定阈值的数据打印出来。可以在现有的电位器程序上修改,也可以创建一个新的程序。新版的程序见下列代码清单,将这个程序保存并命名为threshold。

代码清单3-2 压电换能器的阈值

在代码清单3-2中,将阈值设定为200。在程序的循环中,只会输出高于阈值的传感器数值。

接下来让我们来测试这个程序。

3.2.4 烧写和测试

在输入程序清单3-2中的代码后,校验使其通过编译,然后将它写入到Arduino中。打开串口监视器,然后以不同的力度敲击换能器。你会发现敲击的力度越大,返回的传感器数值越高。图3-12给出了一些示例输出。

图3-12 以不同的力度敲击压电换能器时的输出

现在你已经有一个程序检测模拟输入端A0的数值,并在其超过一个既定的阈值时输出这个数值。接下来,你要让它做一些更有意义的事情,而不仅仅是报告一个数值。如果你将一个扬声器添加到电路中,你就可以让Arduino在压电换能器受到敲击时播放一个音符或者音阶,这就是你接下来要做的事情。

3.2.5 添加一个扬声器的电路

在本节中,你需要添加以下两个器件:

1 个8Ω 的小型扬声器

1 个1 kΩ 的电阻

图3-13所示的电路在图3-9的基础上添加了扬声器和电阻。

图3-13 一个扬声器已经加入了电路,可以用它产生一个音阶

现在就把电路组装到一块面包板上吧。

3.2.6 连接硬件

将扬声器通过一个1 kΩ电阻连接到8 号数字引脚,这就完成了硬件连接。组装完成后的电路如图3-14所示。

图3-14 添加一个扬声器后电路的连接

我们需要在扬声器上焊接两根跳线,因为扬声器原来的线太软,以至于无法直接插入到面包板上。如果你没有焊接设备,可以用一些绝缘胶带将导线固定在跳线上,也可以使用鳄鱼夹。

当所有的元件都连接好后,就可以编写程序了。

3.2.7 产生一个音阶的程序

代码清单3-3给出了新程序的代码,其中定义了3个新变量。

toneDuration指定每个音阶持续的时间,单位是毫秒(ms)。

toneFrequency 设定了所播放音阶的频率,单位是赫兹(Hz)(中央C的频率是 262 Hz)。

speakerPin指定了扬声器所连接到的引脚。

代码清单3-3 用扬声器产生一个音阶

在这个程序中,使用的是Arduino内置的库函数,tone,它接受3个参数。

tone (pin, frequency, duration)

pin是输出音阶的引脚;frequency是输出音阶的频率;duration是一个音阶播放的时间的毫秒数。如果没有给定 duration 参数,这个音阶就会一直播放,直到发出noTone指令:

noTone(pin)

在这个程序中,只有当sensorValue大于阈值时才会播放一个音阶。现在让我们来试一下吧。

3.2.8 烧写和测试

当程序顺利通过编译之后,将Arduino连接到计算机并为它写入程序。尝试着敲击压电换能器,然后听扬声器是否发出了声响。如果没有发出声音,请检查所有的连接。

提示:如果检查了所有的连接,而扬声器始终没有发出任何声音,请尝试将toneDuration从40增大到1000,或者改变toneFrequency的值。

当一切都正常工作后,你可以修改变量 toneFrequency 的值来让扬声器演奏不同的音符。频率越高,音调越高;频率越低,音调越低。你还可以尝试修改变量threshold的值。这个值越小,就可以用越轻柔的力量敲击换能器,来让扬声器播放一个音阶。

在下一节中,将会给电路添加更多的压电换能器,这样就可以制作一架电子琴,而换能器则作为琴键。

3.3 制作一架五声音阶电子琴

五声音阶,英文 pentatonic,它由 penta(意思是“五”)和 tonic(意思是“音阶”)组成。五声音阶每个八度由5个音符组成,与之相比,七声音阶每个八度则由7个音符组成。五声音阶在世界范围内广为流传并在不同类型和风格的音乐中得以应用,其中包括布鲁斯音乐、凯尔特音乐、爵士乐和古希腊音乐 [5]。五声音阶是儿童音乐入门的理想选择。它的简单性和易用性,使其很容易快速创作出可辨认的曲调,因此许多儿歌都是基于五声音阶的。

下面就要来搭建本章的最后一个项目了,你要向电路中再添加另外4个压电换能器,这总共5个压电换能器将用做5个琴键。敲不同的键时,扬声器就会产生不同的音阶,也就是不同的音符——这就是一架五声音阶电子琴。

3.3.1 电路图

每个新加的压电换能器都需要并联一个1MΩ电阻和一个稳压二极管,正如你使用的第一个压电换能器一样。完整的电路图如图3-15所示。添加这些元件后它显得有点复杂,但只是把图3-9中的电路重复了几次而已。

电路图中有5个压电换能器,每个都与一个电阻和一个二极管并联。使用模拟输入引脚A0~A4作为Arduino的输入。

现在就可以把硬件连接到一起了。

图3-15 五声音阶电子琴的电路图

3.3.2 连接硬件

将额外的压电换能器、电阻和二极管添加到面包板上。要特别注意压电换能器和稳压二极管的方向。如图3-16所示,可以使用面包板上的一个横条作为公共的地线。

图3-16 全部组装完成的五声音阶电子琴

在面包板上完成所有元件的组装之后,最好再检查一下每个压电换能器是否已经正确连接。可以将代码清单3-3中的程序写入到Arduino,然后敲击连接到模拟输入端A0的换能器,看扬声器是否能发出声音。如果没有发出声音,请再次确认所有的连接都正确,在面包板上很容易将元件插入错误的孔中,因为现在面包板拥挤了许多。还要检查一下稳压二极管的方向和压电换能器的极性。

当一切都工作正常后,你可以每次对程序做一点小修改,来测试下一个换能器。修改程序最顶部的传感器引脚的值,将 sensorPin = 0改成 sensorPin = 1。

将修改过的程序写入到 Arduino,即可测试连接到模拟输入端 A1 的压电换能器。当这个压电换能器受到敲击时,扬声器应会发声。

重复这个过程,通过每次修改sensorPin的值来测试另外3个换能器。一旦所有的压电换能器都通过了测试,你就可以开始编写五声音阶电子琴的程序了。

3.3.3 制作一架五声音阶电子琴的程序

下列代码清单给出了五声音阶电子琴的程序。你可以在原有代码的基础上修改,也可以创建一个新的程序然后输入以下代码。

代码清单3-4 五声音阶电子琴程序

这个程序将音符的频率装入了音阶数组,这些音阶基于五声音阶的中央C大调。

C=262 Hz

D=294 Hz

E=330 Hz

G=392 Hz

A=440 Hz

主循环轮流测试每个模拟输入端的值。当检测到一个压电换能器受到敲击,并且强度超过了阈值时,相应的音阶就会通过扬声器播放10 ms。

注意 在这个程序中,阈值被设定为50。之前使用的值是200,但我们发现在实际测试中,有一个压电换能器需要比其他的敲得更用力些才行,所以我们将阈值降到了 50,让这些琴键变得更灵敏一些。

所有的代码都输入完成后,用一个好记的名字将它保存。接下来就要烧写程序并测试五声音阶电子琴了。你甚至可能会想用它弹奏几个曲子。

3.3.4 烧写和测试

校验这个程序使其通过编译。完成后,将Arduino连接到你的计算机为其写入程序。现在,可以通过敲击每个换能器来测试是否一切正常,要确保每个琴键都能发出一个不同的声音。尝试弹奏几个简单的曲子。它的声音可能会有点走调,因为只使用了一个小型的扬声器,但你确实制作了自己的电子琴。

还可通过修改装载到音阶数组中的频率值来改变这些音符。你可以尝试用下列数值来演奏五声音阶的C小调。

C=262 Hz

E=311 Hz

F=349 Hz

G=392 Hz

B=466 Hz

通过为音阶数组装载不同的频率值,可以创作出各种不同的声音和曲调。

现在最重要的事情是玩得开心和炫耀你的新创造了。使用五声音阶的大调,尝试演奏下列旋律。

看看你能否辨别出这些曲调,如果能让别人也辨别出来,那就更好了。

1.GGAGCB GGAGDC——提示:每个人每年都会听到。

2.CDECCDEC EFG EFG——歌曲French brother [6]

3.CCGGAAG FFEEDC——歌曲Heavenly [7]

现在可以尝试自己创作一些旋律。使用五声音阶的好处之一就是相对容易创作出一些悦耳的旋律。

3.4 小结

在这一章中,通过使用analogRead函数了解了Arduino的模拟输入功能,还尝试从电位器和压电换能器两种分立模拟器件中读取模拟量。本章还讲解了模拟信号是如何通过模数转换器(ADC)转换为可以被Arduino处理的数字信号的。这种方法使你能够可靠地从许多其他模拟设备中读取数据。

本章最后的项目中大量使用了analogRead函数,利用5个压电换能器制作了一架五声音阶电子琴,敲击不同的压电换能器就能演奏出不同的音符。尽管声音有点走调,但愿你依然能找到愿意聆听的人,并在向他们炫耀你的音乐才能时获得一些欢乐。

在下一章,你会了解到扩展Arduino的两个主要途径:第一,使用软件库来驱动Arduino与其他传感器通信,比如双线设备或者SPI设备;第二,使用可以直接插接到Arduino的插座上的硬件扩展板。你还将了解到几种最常用的扩展板。

注 释

[1].Pong和Space Invaders是20世纪70年代出现的两款街机游戏。——译者注

[2].Little Boots原名Victoria Christina Hesketh,英国流行电音歌手。——译者注

[3].Segway 是一种用于代步或巡逻的两轮的自平衡电动车,由美国发明家 Dean L. Kamen 发明。——译者注

[4].全书当中,对sketch的使用一直比较随便。sketch并非是一段代码,而是一个项目中所有程序代码的一个组合,类似于Visual C++中的Project。——译者注

[5].中国古典音乐也采用五声音阶,人们常说的“五音不全”中的“五音”指的就是中国古代宫、商、角(jué)、徵(zhǐ)、羽五个音阶,对应于现代乐谱中的Do、Re、Mi、Sol、La五个唱名。——译者注

[6].两只老虎。——译者注

[7].闪烁的小星星、字母歌。——译者注

图书在版编目(CIP)数据

Arduino实战/(美)埃文斯(Evans,M.),(美)诺布尔(Noble,J.),(美)霍肯鲍姆(Hochenbaum,J.)著;况琪译.--北京:人民邮电出版社,2014.4

书名原文:Arduino in action

ISBN 978-7-115-34331-4

Ⅰ.①A… Ⅱ.①埃…②诺…③霍…④况… Ⅲ.①单片微型计算机 Ⅳ.①TP368.1

中国版本图书馆CIP数据核字(2014)第005150号

版权声明

Original English language edition, entitled Arduino in Action byMartin Evans, Joshua Noble, Jordan Hochenbaum,published by Manning Publications Co., 209 Bruce Park Avenue, Greenwich, CT 06830. Copyright ©2013 by Manning Publications Co.

Simplified Chinese-languageedition copyright ©2014 by Posts & Telecom Press. All rights reserved.

本书中文简体字版由Manning Publications Co.授权人民邮电出版社独家出版。未经出版者书面许可,不得以任何方式复制或抄袭本书内容。

版权所有,侵权必究。

◆著 [美] Martin Evans Joshua Noble Jordan Hochenbaum

译 况琪

责任编辑 杨海玲

责任印制 程彦红 杨林杰

◆人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

北京艺辉印刷有限公司印刷

◆开本:800×1000 1/16

印张:21.25

字数:455千字  2014年4月第1版

印数:1–3000册  2014年4月北京第1次印刷

著作权合同登记号 图字:01-01-2012-6451号

定价:69.00元

读者服务热线:(010)81055410 印装质量热线:(010)81055316

反盗版热线:(010)81055315

相关图书

动手玩转Arduino
动手玩转Arduino

相关文章

相关课程