目前Arduino开源硬件技术在国内渐渐兴起,相关的图书的市场表现不错,作为计算机的硬件科学,这本书apress系列书之一,内容正统,篇幅适中,翻译难度不大。与电子社已经获得版权的《beginning arduino》(偏重案例)和《arduino robotics》(偏重高端应用)相比,偏重初级与中级理论实践普及方面,属于入门图书,读者基数多。
本书在很多地方涉及了在Arduino编程手册中没有涉及的内容,甚至更深入地探讨了Arduino开发环境,提供了简单的全是干货的代码例程、简单易读的示意图和说明,遵循一定程度的“极简艺术”理念,通过使用简单并容易获得的硬件来培养以高雅的方式写代码的技能。本书将本书还涉及许多Arduino开发所独有的函数,这些函数用来控制数字和模拟量输入输出、定时器、随机事件,之后讨论如何编写自己的函数,以及如何使用丰富的Arduino库资源来控制各种各样的硬件和使用各种通信协议。
关于作者
Brian Evans 是专注于电子艺术装置领域的艺术家,同时也是位于丹佛的大都会州立学院的副教授。他教授艺术设计中的多学科融合课程和设计概论,包括特殊的艺术表现媒介、电子艺术品创作和 3D 打印课程。他在许多课程中使用了开源硬件,把它们用于艺术和设计创作,这些开源硬件包括 MakerBot 和 RepRap 的 3D 打印机及 Arduino 开发平台。
他的作品已经在洛杉矶巴恩斯德尔公园市政艺术画廊、奥兰治县的当代艺术中心、加州州立大学艺术博物馆、长滩市等地展出。Brian Evans 还是加拿大艾伯塔的班夫新媒体研究所开源硬件园地的常客和活跃分子。他于 2005 年在亚利桑那州大学获得美术学士学位,于 2008 年获得长滩市加利福尼亚州立大学的美术硕士学位,于 2009 年曾作为志愿者为纽约开源硬件高峰论坛服务。
关于技术顾问
Ryan Owens 毕业于华盛顿芝加哥大学,获得电子和计算机工程学位。他是 SparkFun Electronics 公司的设计工程师,他在那里设计新产品,为各层次的嵌入式电子爱好者编写手册和 “跟我学” 之类的指导书。 他也为电子技术初学者讲授初步的电子实践课程和 Arduino编程课程,无论是孩子还是 IT 专家都可以学习这些课程。
致 谢
没有我的妻子 Susan、同事和好朋友们的真诚支持和鼓励,我无法完成本书的写作。感谢你们对我的帮助;并感谢我的女儿 Kori,在我写作本书的过程中给了我精神上的支持;我还必须向我的父亲 Arvin 致敬并表示感谢,他帮助我挣脱了一些束缚,甚至可能最严重的一些羁绊;同时,我诚挚地向我的朋友和 Metropolitian State 公司的同事表示感谢,他们给了我一个成为人师的平台并鼓励我展开本书的写作。
感谢 Paul Badger, 我们俩围绕本书早期想法的反复讨论对我有很大的启发; 感谢 DavidMellis 对我的那些愚蠢的 E-mail 的回复;感谢 Tom Igoe,我们分享了那些有思想有内容的对话。本书的完成也离不开影响力巨大的活跃的社区创建者们的支持,是他们成就了Arduino 平台,还无私地分享了大量的成果。我受到了极大的启发,并使用了该平台的大量资源,感谢你们。
当然我还需要感谢出版者们——Apress 公司的了不起的编辑团队,他们不知疲倦地工作以使这本书出版:Frank Pohlmann,他给我机会实现这个蓝图;Jessica Belanger 帮助我坚持下去;James Markhan 使我从溜号状态返回到专注状态;也感谢技术顾问 Ryan Owens,他的洞察力和反馈对我完成这个项目帮助很大。
我必须感谢我的非常有创造力的天才般的学生们,他们使我在本书开始写作后不敢有丝毫松懈,并且给了我每天做我该做的事情的理由。
简介
本书可帮助你开发实用的 Arduino 控制器项目。我们主要关注物理计算方面的软件问题——通过设计软件代码控制物理实体来展现各种行为或通过软件实现人机互动。本书从讲解 Arduino 平台的基本内容开始,运行第一个例子代码,接下来讨论 Arduino 的类 C 编程语言的结构和语法,探讨变量、控制结构、数组和存储器。本书还涉及许多 Arduino 开发所独有的函数,这些函数用来控制数字和模拟量输入输出、定时器、随机事件,之后讨论如何编写自己的函数,以及如何使用丰富的 Arduino 库资源来控制各种各样的硬件和使用各种通信协议。
就像之前所说的,Arduino 适合模块化快速开发项目的理念。可以打这样一个比喻:我们在用代码实现项目蓝图时,就像是用“代码积木”以一种个性化的直观方法快速实现自己的设计目标。本书绝大部分论述方式都围绕了这样一种理念,通过实用项目来发展编程技巧,我们也提供了一些关于新项目和新元件使用的建议、新编程语言的试验项目,以及反哺技术社区的方法。本书有意避免涉及太深的电子技术理论、电路设计和琐碎的细节或其他基于特定硬件的练习项目,但是在每章最后回顾硬件方面的内容时提供了一些基础的物理计算公式。
本书在很多地方涉及了在 Arduino 编程手册中没有涉及的内容,甚至更深入地探讨了Arduino 开发环境,提供了简单的全是干货的代码例程、简单易读的示意图和说明。我在2007 年用 Arduino 给第十五系的学生上艺术和设计主修课时,编写了一本手册和一个小巧的 PDF 文档,这是我第一次编写 Arduino 编程知识,并不是一本简单的手册。这本精心编写的小册子,已经被译成西班牙语、俄语和荷兰语等版本,其中有许多内容与当前技术不同,可能跟不上 Arduino 的飞速发展,但它还是在全世界的工厂和课堂中被广泛使用。最近几年我没升级这本手册,我也不确信它现在还有用,因此希望本书能填补这个空白,成为这本手册的升级版。
本书读者对象
本书写给以 Arduino 为平台的艺术家、设计师、学生、喜欢创作小作品的人。在选择使用 Arduino 平台时,你需要一些在该平台上编程和实践的知识,本书的受众假定为没有编程经验的人。顺便说一下,用家用电脑去查找超出本书范围的答案会很有用。
Arduino 的大多数使用者通常不关心技术细节, 只想让其项目能够工作。 我非常理解这种想法,因为我就是其中一员。在还是一名艺术专业的学生时,我发现了可编程控制器,那时的艺术学校通常没有学写代码和缠电机的环境,Arduino 的到来改变了这一切。同样,我也不是一名数学爱好者,幸运的是,这也不是钻研写 Arduino 代码所预先要求具备的条件。
阅读本书
本书的每章内容都集中在几个基本项目上,这些项目又建立在相应章节所提到的基本概念之上。对于每个项目,都是先给出对项目的描述,之后讨论项目中需要的硬件。书中也提供一些关于如何建立这些简单的电路和如何把元器件连接到 Arduino 控制板的图示和说明。在学习这些项目的过程中,你可以在页边空白处做点笔记并写一些心得——我鼓励你这样做。一定要多加练习,试验新东西,观察新变化。
本书所涉及的项目都是非常典型的,或者是为演示设计新东西需要的基本概念而设计的。本书将遵循一定程度的“极简艺术”理念,通过使用简单并容易获得的硬件来培养以高雅的方式写代码的技能。一旦实践了这些典型的项目,这些项目就可以用到真正的项目中。本书不完全是在做这些实际项目,而是专注于如何编写代码并逐渐完善代码。书中的例子会互相借鉴,在需要理解正在编写的和逐渐完善的代码时,你可以回顾之前的例子。
例子代码的编写本着在任何地方都可以轻松复用的原则,或可以进一步改进为部件化的模块化的代码的原则。读者要花大量的时间提升编写复用代码的技巧,因此在得到一个独立的新项目时,你就会知道该如何下手。你可以随意更改这些通用的例子代码,例如改变数值、时间、引脚分配、变化幅度等,直到代码不工作了,再尝试把它弄好。在本书的例子中,我保持了一种十分特别的书写代码的风格,我极力主张你发展自己书写代码的风格,这种风格反映了你的思维方式和看待代码的方式。
做项目电路布线是非常简单、直观的,几乎不需要任何电子知识。第 12 章汇总了基本的电子器件知识,贯穿了我们讨论的编程方法,以及书中涉及的物理电路,回顾了编程与硬件之间的联系,包括电路是如何工作的、读图表及焊接方法等。如果你发现自己学第 12章之前的内容时比较辛苦,那么你可以先跳到第 12 章预习一下硬件知识。如果你对硬件已经有所了解,那么第 12 章可作为一个好的概要,回答一些你还不是很清楚答案的问题。可以把这些硬件知识看作一个简要的介绍,这些知识在我这几年的授课中发挥了比较重要的作用。
Arduino 1.0
在我编写这本书时,Arduino 的开发者们正在为创建更稳定、更高效的被叫作 Arduino1.0 的 Arduino 升级版开发软件而努力。 Arduino 1.0 的最终发布版本在本书出版时应该已经发行了。版本升级是非常重要的,因为要使事情做得更好,某些常规要有所突破才行。这意味着在阿尔法版本的 Arduino 软件下写的一些旧代码可能在 Arduino 1.0 版本上不能使用了。
相反,本书中的代码和 Arduino 开发环境的图片都是用 Arduino 1.0 Beta 发行版本做的(http://code.google.com/p/arduino/wike/Arduino1) , 因此本书中的 Arduino 软件界面可能与最终版本展示的界面有所不同,书中的一些代码也可能在旧版本的软件下不能工作,Arduino 1.0 软件的其他特征并没有完全在本书中展现,所以我没有写有关新特征的内容。在升级版本时还有一些关于硬件引脚升级的内容,但我们现在对这些具体内容还不太清楚,因此如果有异常问题发生,那么这可能要归结为 Arduino 1.0 软件的问题,从而查找在哪里发生了什么错误。
约定
在本书中我们使用了一些约定,包括使用定宽字体来标识例子代码,以及使用任何后面带有括号的字符串如 setup()或 loop()来标识调用函数。有时会从主句中分离出一个适合定宽字形的块。下面是一个多行注释的例子:
//this is a mulitline
//code example
? 注意 千万不要用比实际需要小的电阻,因为如果你向 LED 输入了太大的电流,则不但会造成 LED 的永久性损坏,也可能会损坏电路中的其他元件。
?下载代码
本书代码可以从 Apress 网站的代码资源下载页面下载,如果你需要发布本书中使用的例子代码,则请使用包括书名、作者、出版社、年份和 ISBN 的属性文件。