JavaScript机器人编程指南(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-08 16:58:38

点击下载

作者:美 Kassandra Perch 珀芝

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

JavaScript机器人编程指南

JavaScript机器人编程指南试读:

前言

大家好!欢迎阅读本书。在这本书里,你会学到怎样使用Johnny-Five以JavaScript语言来为Arduino和其他机器人技术平台编写代码。我们会介绍Johnny-Five的基础、输入/输出设备和运动设备,比如舵机和电机。最后,我们会探索怎样将你的机器人连接到互联网上,以及怎样将Johnny-Five代码跨平台迁移。本书内容

第1章,开始学习JS机器人技术,会帮助你开始搭建Arduino Uno并探索NodeBots的世界。

第2章,使用Johnny-Five,介绍了Johnny-Five的基础,包括Read-Eval-Print-Loop(REPL),以及我们会构建第一个自己的项目。

第3章,使用数字和PWM输出引脚,介绍了基本输出设备,使用了数字和PWM引脚。

第4章,使用特殊输出设备,介绍了使用一个或多个引脚的专门的输出设备。

第5章,使用输入设备和传感器,介绍了使用模拟和GPIO引脚的输入设备。

第6章,让机器人动起来,介绍了Johnny-Five中基本的舵机和电机的使用。

第7章,通过Animation库进行高级的移动,介绍了Animation库以及怎样为你的NodeBots创建高级移动方案。

第8章,高级模块——SPI、I2C 和其他设备,介绍了 SPI、I2C 和其他高级组件在Johnny-Five中的使用。

第9章,让NodeBots与世界相连接,介绍了怎样将你的NodeBots连接到互联网,以及将Johnny-Five代码用于非Arduino平台。这本书需要的知识和物品

在开始这本书之前,你会需要如下知识和物品。

对JavaScript和Node.JS的基本编程知识

一个拥有USB接口的电脑,并支持node-serialport,运行着Node.JS 4.x

一个Arduino Uno或其他Johnny-Five支持的开发板(参见http://johnny-five.io/ platform-support)和一根用于开发板的USB连接线

Light-Emitting Diodes(LEDs)——需要准备足够的数量,可以满足所有的例子,并为出错留些空间

一个Piezo组件

一个字符型LCD(带有I2C接口的更好)

一个可用于面包板的按钮组件

一个可用于面包板的可旋转电位器

一个光敏二极管

一个普通温度传感器

3个5V玩具舵机

一个5V玩具电机

一个ADXL3345I2C加速器

一个SparkFun的LED矩阵包——产品号DEV-11861

一个游戏手柄——RetroLink N64控制器或者一个DualShock3(可选)一个Particle Photon微控制器目标读者

如果你之前接触过Arduino或者你是电路学的新人,想学习用JavaScript来写脚本,这本书就很适合你。对于JavaScript和Node.js的基本知识会让你更好地从本书中获益。格式约定

这本书中,你会发现不同的文本样式,表示了不同类型的信息。下面是这些样式的例子和解释。

代码文本、数据库表名称、文件夹名称、文件名称、文件扩展名、路径名、伪URL、用户输入和Twitter账号会以如下形式显示:“例如,LED对象的on()和off()函数会开启和关闭LED灯。”

代码段会以如下形式显示。 var myPin = new five.Pin(11); myPin.on('high', function(){ console.log('pin 11 set to high!'); });

当我们希望让你注意到代码段中的某一部分时,会用粗体显示。 var myPin = new five.Pin(11); myPin.on('high', function(){ console.log('pin 11 set to high!'); });

任何命令行输入或输出都如下显示。> node LED-repl.js

新的用语和重要的文字会用粗体显示。你会在屏幕中看到的文字,比如在菜单或对话框中,如下显示:“现在,我们会构建一些项目来示范怎样使用更多的高级传感器:一个光电管和一个温度传感器。”

警告和重要的提示会出现在这样的框中。

提示和窍门会这样表示。读者反馈

我们十分欢迎读者反馈。让我们知道你对这本书的想法,喜欢的和不喜欢的地方。读者反馈对我们十分重要,它能帮助我们发现更多能帮助你获益的方面。

普通的反馈请给feedback@packtpub.com发邮件,并在标题中注明书的名称。

如果有个主题是你很擅长并乐于撰写或参与撰写一本书的,请参考www.packtpub.com/ authors的作者指南。购买者支持

现在你是Packt书籍的读者了,我们可以帮助你从购买中获益更多。下载样例代码

你可以使用你的账号从http://www.packtpub.com上下载你购买的所有Packt发布的书籍的样例代码。如果你从别处购买的这本书,你可以访问http://www.packtpub.com/support并且注册来获得邮件发送的文件。下载书中的彩色图片

我们还提供一个PDF文件,包含书中所有的截图和示意图的彩色图片版。彩色图片会帮助你更好地理解输出的改变。你可以从https://www.packtpub.com/sites/default/ files/downloads/ 3347OS_ColoredImages.pdf下载到该文件。勘误表

虽然,我们已经很认真地保证内容的准确度了,但错误可能还是不可避免的。如果你发现了我们书中的错误,也许是文字或代码的错误,如果能告之我们,我们会很感谢的。这样,你不仅可以帮助其他读者阅读到正确的内容,还可以让我们改进本书之后的版本。如果你找到任何错误,请通过http://www.packtpub.com/submit-errata告诉我们,选择书名,然后单击Errata Submission Form链接,输入错误的细节。一旦错误被确认了,你的提交会被接受,这个错误会更新到网站上或添加到任何已有的勘误表中。

想查看以前提交的错误,请访问https://www.packtpub.com/books/content/support并且在搜索框里输入书的名称。Errata部分会显示出需要的信息。侵权盗版

网络上有版权的资料的侵权一直是所有媒体关注的问题。在Packt,我们很重视版权和许可的保护。如果你在网上看到任何形式的非法拷贝,请立即告诉我们链接或网站名称,我们会采取措施。

请将有嫌疑的内容链接发送到copyright@packtpub.com。

你的帮助保护了我们的作者,也让我们能够有能力带给你更多有价值的内容。问题

如果你有任何关于本书的问题,你可以通过questions@packtpub.com联系我们,我们会以最大努力去纠正问题。第1章 开始学习JS机器人技术

欢迎来到JavaScript机器人的世界!让我们探索一下用Arduino和Johnny-Five来编写机器人程序有多么简单吧。

在这一章中,我们会做如下事情:

探索JS机器人技术、NodeBots和Johnny-Five;

搭建开发环境;

使板载LED灯闪烁。1.1 理解JS机器人技术、NodeBots和Johnny-Five

JavaScript是近几年才开始成为机器人技术语言的,这要从Chris Williams编写的一个NPM模块node-serialport开始说起。这个模块允许Node.JS通过串行连接与设备通信,这包括老式计算机的典型串行连接或USB和蓝牙连接这些我们常用的连接类型。那么NodeBot到底是什么?我们又是怎样将它们和Johnny-Five组合使用的呢?1.2 NodeBot是什么,基本词汇还有哪些

一个NodeBot指的是任何一块可以用JavaScript和/或Node.JS来控制的硬件。这里包含了大量的项目,有无数方法来实现一个NodeBot。在这本书中,我们会使用Johnny-Five库,这是Rick Waldron创建的一个开源项目。

写给刚刚接触机器人技术的读者:一个微控制器是一个包含处理器、内存和输入/输出插口的小计算机。这是我们项目的大脑,我们的项目会与之通信或直接加载在其之上。微控制器会以各种形态和大小出现,并有着各种各样的功能。

我们会在项目中使用一个微控制器。你应该使用哪种微控制器呢?很幸运,我们使用Johnny-Five意味着我们的选择范围很广,并且都可以使用本书中的代码!

到底Johnny-Five是什么?好用在哪里呢?1.3 Johnny-Five和NodeBot的革新

Johnny-Five(http://johnny-five.io)是一个开源的Node.JS机器人技术库。它由Rick Waldron创建并且有由贡献者和支持者组成的活跃社区。在基于Node.JS 4.x写这本书时,这个模块可以很好地工作在Windows、Mac和Linux计算机系统上。

Johnny-Five构建于node-serialport之上,并且让我们可以通过编写JavaScript应用来以不同类型的连接与不同的微控制器通信。对于某些微处理器,比如Arduino-compatible开发板,Johnny-Five使用了串行连接。而对于一些新的开发板,Johnny-Five通过一个网络服务模拟了串行连接!

Johnny-Five对多种开发板类型的支持是通过它的包装器系统实现的。一旦安装了核心系统,你就可以为特定的微控制器安装一个包装器,并且API保持不变。这是一个很强大的功能,你可以在不同的平台间轻松地移植代码,无需改动。1.4 如何使用这本书

我们会使用Arduino Uno开发板来实现这本书里的示例。你可以在网上买到这些开发板,比如Adafruit(www.adafruit.com)、SparkFun(www.sparkfun.com)等。你还可以使用Arduino Uno兼容的开发板。例如SainSmart售卖的Uno-like开发板用于我们的示例也没有问题。在这一章里,你会需要这个开发板和一根配套的USB数据线。

在之后的章节里,我们会使用其他的模块,每一章都会列出一张该章节项目需要的材料清单表。1.5 搭建开发环境

现在我们已经了解了基本概念,接下来要开始为第一个项目搭建环境了。写这本书的时候,这里使用到的所有软件都可以用于Windows、Mac和Linux桌面系统。1.5.1 安装Node.JS

如果你还没有安装Node.JS,可以在nodejs.org上下载一个安装器。这个安装器还会安装NPM或Node Package Manager,可以用来管理我们使用的其他软件。

在你的机器上运行安装器,这里可能会需要重启。然后,打开命令行应用,运行如下命令。node --version

这行命令的输出值应该是4.x.x,其中,x为整数。1.5.2 设置项目并安装Johnny-Five

在你的命令行应用中,为你的项目创建一个文件夹并且改变路径到这个文件夹:mkdir my-robotics-projectcd my-robotics-project

接下来开始安装Johnny-Five:npm install johnny-five

你应该会看到一个等待图示和一些输出。如果在输出行的最后没有ERR NOT OK的消息,就表示安装Johnny-Five成功了。

在Mac机器上,你可能需要先安装XCode开发者命令行工具。1.5.3 连接微控制器并且安装Firmata

首先,你应该准备好Arduino IDE。当然我们还是使用JavaScript,但是,我们需要确保开发板上运行着供Johnny-Five正常通信的专门的sketch(Arduino开发里对程序的称呼)。

你可以从Arduino网站(http://www.arduino.cc/en/Main/Software)获得安装器。在这本书中假设你使用的是1.6.4版本,但1.4左右的版本也应该可以正常工作。

下载好软件后运行它。然后我们要确定串行连接工作正常。

如果你使用的不是Arduino开发板,这一步并不是必要的。但应该会有其他的步骤。你的开发板的包装器插件应该会注明的。

将USB数据线插入开发板和计算机。开发板上的一些LED灯会亮起来,这是正常现象。然后,在Arduino IDE的Tools菜单下,将鼠标指针悬停在Ports子菜单上,你会看到类似图1.1所示的端口列表。图1.1

你应该会在表中至少看到一条内容匹配如下格式:/dev/cu.usbmodem*****。也许有Arduino Uno后缀,也许没有。找到了就单击它,这个就是你需要用于Firmata安装的端口。看到它说明你的开发板可以与计算机进行通信,并且也可以开始安装Firmata了。

想要在你的开发板安装Firmata,如图1.2所示,进入File | Examples | Firmata | StandardFirmata菜单。图1.2

一旦你打开了sketch,你会看到如图1.3所示的一个IDE窗口。图1.3

一旦sketch启动了,单击Upload按钮(看上去像个向右的箭头)就可将Firmata上传到你的开发板上。等到上传结束,可以关闭Arduino IDE,之后就可以开始用JavaScript工作了。

一个名叫Suz Hinton(@noopkat)的程序员正在开发一个叫AVRGirl的node项目,很快这个项目会使我们不再需要这一步。用户可以在www.github.com/noopkat/avrgirl上了解到更多细节!  1.6 Hello,World!——让板载LED灯闪烁

现在我们已经搭建好开发环境了,可以通过写JavaScript来使用我们的Arduino开发板了。我们会从Arduino微控制器上的LED灯闪烁开始。1.6.1 编写Johnny-Five脚本

使用你喜爱的IDE,在你的项目目录中创建一个hello-world.js文件。然后,复制粘贴或键入如下代码。 var five = require("johnny-five"); var board = new five.Board(); board.on("ready", function() { var led = new five.Led(13); led.blink(500); });

我们会在第2章中介绍更多这段代码的细节,简单介绍就是:我们在Johnny-Five模块里引入这段代码并用它创建一个新的开发板对象。当这个开发板准备好后,我们会在引脚13(这个引脚已经被连接到Arduino Uno开发板的板载LED灯上)创建一个LED对象。然后我们编程让这个LED灯每半秒闪烁一次。1.6.2 运行脚本

想要运行脚本,先打开命令行应用,进入项目目录,运行如下命令。node hello-world.js

应该会看到如图1.4所示的输出。图1.4

应该看到Arduino Uno开发板上有一个LED灯在闪烁。图1.5展示了板载LED灯的位置。图1.5

如果一切正常并且LED灯在闪烁,恭喜你!你已经可以开始用Arduino和Johnny-Five构建机器人和应用了!

如果在这里遇到了问题,可以去Johnny-Five网站(www.johnny-five.io)寻求解决方法。1.7 小结

在这一章里,我们学习了JS机器人技术和理解了什么是NodeBot 。我们了解了在这本书中需要用到的硬件模块,并且学习了怎样搭建开发环境。最后,我们了解了怎样使板载LED灯闪烁。在下一章里,我们会更深入地了解Johnny-Five为什么这么强大,并且开始编写和构建一些更加复杂的项目。第2章 使用Johnny-Five

在这一章里,我们会开始使用Johnny-Five来构建我们的机器人项目。我们会了解为什么Johnny-Five是一个适合入门机器人技术的很棒的库,并且会构建我们的第一个机器人。我们会学习怎样实时地通过命令行操控机器人,这在其他平台上并不容易实现。本章结束的时候,你会对涉及的软件有全面的了解,这对于构建更复杂的硬件会有很大的帮助。

本章包括以下内容:

Johnny-Five项目的工作原理;

理解Johnny-Five中的事件;

接通一个LED灯并使其闪烁;

使用REPL(Read-Eval-Print-Loop)。2.1 本章需要用到的模块

这一章里你所需要的就是一个微控制器(例子中还是使用的Arduino Uno)和一些LED灯,我们只会连通一个LED灯,但你可能需要多准备一些,以防被烧坏。2.2 Johnny-Five项目的工作原理

在这一节里,我们会看一下Johnny-Five项目的内部细节,这样就可以去构建更复杂的应用。2.2.1 对象、函数和事件

Johnny-Five项目使用了基于事件的结构来工作,请记住这 3 个概念:对象、函数和事件。

对象有助于程序性地表示我们的物理电子模块,通常使用new关键字来构建。Johnny-Five中的一些对象的例子包括表示Johnny-Five库的five对象、表示微处理器的Board对象和程序性地表示LED灯的LED对象。  var led = new five.Led(11);

函数是供我们创建的对象使用的,通常表示机器人可以进行的行为。例如LED对象会有一个on()函数和一个off()函数,用于开关LED灯:  led.on();  led.off();  led.blink();  led.stop();

事件会在对象上触发,表示我们程序中的观察点。例如,当开发板准备好从Johnny-Five接收指令时,Board对象会触发了一个ready事件。

我们还可以给一个引脚设置事件来跟踪LED事件:  var myPin = new five.Pin(11);  myPin.on('high', function(){   console.log('pin 11 set to high!');  });

我们在每一个Johnny-Five项目中都会使用到这3个概念,所以早一些标准化我们的词汇库比较好!2.2.2 了解LED灯闪烁脚本

在上一章里,我们写了一小段脚本来开关一个板载LED灯。让我们看看代码细节并概括一下我们使用的对象、函数和事件。  var five = require("johnny-five");

这一行代码将johnny-five引入项目,这样我们就可以使用它了。  var board = new five.Board();

这一行代码创建了我们的board对象。注意,如果没有传递参数,Johnny-Five会假设你使用Arduino并猜测串行端口。  board.on("ready", function() {   var led = new five.Led(13);   led.blink(500);  });

这里我们在board对象上设置了一个监听器,用来监听ready事件。当开发板准备好时,事件处理器就会在引脚13初始化一个Led对象并通过调用blink方法来让LED灯闪烁。

这就是大多数Johnny-Five函数的基本格式:创建一个Board对象,创建监听器来处理ready事件,然后在ready事件处理器里创建模块对象并调用它们的方法。我们还可以为模块对象添加监听器和处理器,之后的几章里会继续讨论这部分内容。2.3 理解Johnny-Five事件

Johnny-Five中的事件是很重要的概念,也是一个新的概念,特别是当你习惯于底层编程语言时。它跟中断的概念很像,但是绝对已经偏离了传统的机器人编程范例中的时间循环。当你可以在Johnny-Five里创建计时器和循环时,强烈推荐使用基于事件的程序方式来实现,当然这也需要一些练习。为什么要基于事件

这个问题经常被问起:“为什么基于事件?为什么不像之前的方法一样基于循环或基于中断?”

原因很大程度与机器人工作的方式和我们对机器人编程的思考方式有关。当你思考你希望机器人做什么事情时,你很少会这样想“每X秒我都要检察一下A再启动任务B”,而你通常会想“当Y发生的时候,我要启动事件C”。

Johnny-Five的基于事件系统通过在事件上放置监听器和处理器很好地支持了这种思路,而不是需要用户每隔X秒去检查条件是否满足。这让新接触机器人编程的人很容易理解。

理解事件对于理解Johnny-Five十分重要,因为每个Johnny-Five脚本会在一开始初始化一个Board对象然后等待它的ready事件。就像基于浏览器的JavaScript应用中DOM的ready事件一样,它会通知你可以开始发送指令了。2.4 连接一个外部LED灯

对于第一个硬件项目,我们会给Arduino连入一个LED灯。LED灯或叫作发光二极管(Light Emitting Diode),是一个在电流经过时会发光的模块。它有不同的颜色和尺寸,基本上是对机器人技术爱好者来说最易于使用和多样性的模块了。搭建硬件

首先,取一个LED灯。我们需要找到它的正负接线,对于这个模块,很明显,正接线比负接线长。如图2.1所示。图2.1 确定LED灯的正负接线

想要把LED灯连到Arduino上,先将正接线接到引脚11,然后将负接线接到标有GND的引脚上,如图2.2所示。图2.2 连接LED灯

基于兴趣,你还可以使用一个面包板,如图2.3所示。图2.3 使用面包板连接LED灯

现在我们已经连好LED灯了,接下来准备让它闪烁。下面的脚本看上去一定很熟悉。  var five = require("johnny-five");  var board = new five.Board();  board.on("ready", function() {   var led = new five.Led(11);   led.blink(500);  });

因为这是和上一章基本一样的脚本,我们只是改变了引脚数字去对应新安装的LED灯。

保存并运行脚本。你会看到开发板上的LED灯在闪烁。

当你运行脚本时,你会注意到一个提示,甚至可以在其中输入!这就是REPL,我们会开始使用它来实时操作LED灯!2.5 使用Read-Eval-Print-Loop(REPL)

读取、求值、输出、循环(Read-Eval-Print-Loop)或英文缩写REPL是一个与很多脚本语言相关的概念,但是对于库来说很新,对于机器人技术来说更新。想一想在典型的Arduino程序里是怎样改变一个状态的:你会修改源代码,在开发板上重新加载它,并等待它执行。

然而,基于Johnny-Five的工作方式,我们可以在代码执行时修改我们机器人的代码。这是因为我们使用了Firmata,这个开发板就是一个精简型客户端,会回应node项目的指令,所以如果我们让Node项目发出不同的指令,就可以实时改变机器人的工作方式。

Johnny-Five项目里是通过向REPL注入模块来实现的,然后就可以使用它们了。2.5.1 使模块对于REPL可用

接下来会修改上一节的脚本来操作LED灯。我们会使用到this.repl.inject()方法。当用在board.on('ready')处理器里时,this关键字是对应的全局语境,所以我们可以从项目中通过this.repl来访问REPL。inject方法接受一个对象,对象中所有的键表示你可以从REPL中访问的模块名称,对应的值表示你想访问的模块。

所以我们会传递以下对象到inject方法中。然后我们可以通过myLed名称来访问LED灯模块。  {   myLed: led   }

我们的新的代码如下所示。  var five = require("johnny-five");  var board = new five.Board();  board.on("ready", function() {   var led = new five.Led(11);   this.repl.inject({    myLed: led  });    led.blink(500);  });

在LED-repl.js中保存这段代码。现在我们不仅有之前写好的代码(引脚11的LED灯会闪烁),还可以在代码中通过REPL访问LED灯。现在来运行一下试试吧。2.5.2 使用REPL

首先,保证LED灯还是连在引脚11上,将开发板连到电脑上。然后,在命令行中,在.js文件所在的文件夹里运行如下命令。> node LED-repl.js

你会看到一个启动队列,并跟着一个提示,如图2.4所示。连到引脚11的LED灯也会开始闪烁。图2.4 Johnny-Five REPL提示的控制台搭建

这(包括Repl初始化输出)表示你可以开始使用REPL了。试着输入myLed并按回车。你会看到LED对象的内容,如图2.5所示。图2.5 REPL中myLed对象的输出

你可以看到LED对象上一些方法和属性的名字。接下来,我们会使用REPL来停止LED灯的闪烁。在REPL中输入myLed.stop()并按回车。这个.stop()方法也会返回LED对象,输出会如图2.6所示。

这个方法会很快地返回值,并且LED灯停止闪烁。

请注意LED灯没有必要关闭,它还是开启着的。

Johnny-Five对象方法的一个很酷的地方是它是链式的,如果你想让LED灯停止闪烁后就保持关闭状态,可以使用myLed.stop().off(),如图2.7所示。图2.6 myLed.stop()的输出图2.7 在REPL里使用链式函数调用

REPL里还有以下很多LED的方法供用户调用。

.on()和.off()

.blink()

.pulse()

.toggle()

.strobe()

.fadeIn()和.fadeOut()

试试它们,看你的myLed对象会发生什么变化!2.6 小结

在这一章里,我们学习了怎样连接LED灯并使用REPL来实时调整机器人的状态。我们理解了当在复杂的硬件上工作时都有哪些软件参与进来。还通过探索REPL和事件结构了解了Johnny-Five在机器人技术事件上的优势。

在下一章里,我们会探索引脚(包括模拟和PWM引脚)并且了解更多关于怎样设置LED灯的亮度值。第3章 使用数字和PWM输出引脚

在这一章里,我们会探索微控制器里的引脚:它们是怎样工作的,怎样通过Johnny-Five来操控它们,怎样通过代码使它们展现不同的行为。我们还是会构建两个项目:一个是用不同的LED灯来深入探索Led API;另一个是用Piezo组件来演奏一些音乐。

这一章会包括以下内容:

GPIO引脚的工作原理;

使用多引脚和多LED灯;

使用一个PWM输出和一个Piezo组件。3.1 本章需要用到的模块

第一个项目里,你会需要微控制器、一些面包板连接线、一个半片面包板和 5 个LED灯。

第二个项目里,你会需要微控制器、一些面包板连接线、一个半片面包板和一个Piezo组件。3.2 GPIO引脚的工作原理

如果我们回顾上一个项目,可以从代码中观察到我们向Johnny-Five的Led对象写入了值,改变了LED灯的状态和亮度。这是怎么实现的呢?当然底层的细节已经超出了这本书的范围,我们只会深入一些来讲一下工作原理,这会用到GPIO(General-Purpose Input/Output通用输入/输出)引脚的概念。

一个GPIO引脚是一个提供电流或从电路中读取电流的引脚。在上一个项目中,我们使用它来为LED灯提供了不同等级的电量。这些引脚可以由用户来定义,决定是用于输入(读取电流)还是输出(提供电流)。现在我们会关注在输出引脚上,这类引脚有两种主要类型:数字和脉宽调制(PWM)。3.2.1 数字输出引脚

数字输出引脚只能给电路提供两种电流:1和0,HI和LOW,或ON和OFF。这表示如果连接一个LED灯到数字引脚上,就只能开关它。

所以,在我们的例子里,当运行pulse()方法时,LED灯会显示不同等级的亮度。这意味着使用的是PWM引脚。3.2.2 PWM输出引脚

PWM引脚可以传送不同等级的电量到电路中。其方法就是通过将引脚设置成HIGH,然后在一定的时间内快速地设置成LOW的方式来模拟不同等级的电量。

从编程角度来说,你可以将PWM引脚设置成0到255之间的任意值(包括0和255)。这个值决定了这个引脚设置到HIGH的频繁程度。例如,值0表示PWM引脚被设置到HIGH的频率是0%。值85是255的1/3,表示引脚被设置到HIGH的频率是1/3的时间——这会模拟出1/3的电量,在LED灯例子中,也就是1/3的亮度。

我们的第一个例子会使用一个PWM引脚来展示LED灯不同等级的亮度,但其实PWM引脚还有无数种用法,就像我们将在这一章看到的,还可以用来制造音乐!3.2.3 怎样区别数字引脚和PWM引脚

怎样辨别微控制器上的哪些引脚是PWM引脚?这确实取决于你使用的微控制器。若是此书中使用的Arduino Uno,PWM引脚用~,或称作波浪符来标记。也就是说,在一个Uno上,PWM引脚为3、5、6、9、10和11,如图3.1所示。

下面,我们会通过连接一些LED灯和使用Led API来探索这些引脚的区别。图3.1 辨认Arduino Uno上的PWM引脚3.2.4 用于多个LED灯的多个引脚

在接下来的项目中,我们会使用Led对象API并测试一些不同的方法。这是Johnny-Five的优势之一 ——抽象。如果你理解LED灯的概念,可以不用多想底层的引脚或工作时序,直接使用Johnny-Five LED对象。下面让我们看一下将要在项目里用到的方法。

on()和off():控制LED灯的开和关。在抽象中,这两个方法将LED灯连接的引脚分别设置成HIGH和LOW。我们会在REPL中使用它们。

blink(time):在给定的时间间隔中使LED灯闪烁。strobe()和blink()互为别名方法,功能是一样的。

pulse(time):控制LED灯渐亮的开启和渐暗的关闭。这需要LED灯连接到PWM引脚上。time参数用于设置脉冲时间值,如500表示LED灯会在500ms的时间里渐亮开启,再在500ms的时间里渐暗关闭,表示一个1s的脉冲。

fade(brightness, ms):控制LED灯在ms(毫秒)里从当前的亮度渐变到指定的亮度。

stop():停止LED灯的任何循环行为。注意这并不意味着关闭LED灯。它只是停止了进行中的循环行为,如果这时LED灯就是开启的,那还是保持不变。

记住大多数Johnny-Five对象的方法都是可以链式调用的,你可以一个接一个地使用它们。  myLed1.stop().off()

这段代码会停止LED灯所有的循序事件并关闭它。

现在我们了解了将要使用的方法,开始给下面的项目接线吧。3.2.5 为项目搭建好硬件

准备好你的材料并参考图3.2。图3.2 多LED灯项目的连线图

注意这些LED灯被接入引脚2、4、6和9 ——两个是数字引脚,两个是PWM引脚。我们会通过一个实验来分辨它们到底是数字引脚还是PWM引脚。3.2.6 开始为项目写脚本

开始写脚本,将其命名为leds-gpio.js,以下为我们的目标。

创建Board对象并添加一个处理器到开发板的ready事件上。

为每一个LED灯创建Led对象。

分别使引脚2和引脚9对应的LED灯以myLed2和myLed9对REPL可用。

设置引脚4对应的LED灯每500ms闪烁一次。

设置引脚6对应的LED灯每500ms渐变闪烁一次。

你的代码大概应该是这样的:  var five = require("johnny-five");  var board = new five.Board();  board.on("ready", function() {   var myLed2 = new five.Led(2);   var myLed4 = new five.Led(4);   var myLed6 = new five.Led(6);   var myLed9 = new five.Led(9);   this.repl.inject({    myLed2: myLed2,    myLed9: myLed9  });    myLed4.blink(500);   myLed6.pulse(500);  });

现在,让我们运行脚本并试一下新的Led对象。3.2.7 了解更多Johnny-Five的LED对象

当你运行脚本时,引脚4和6的LED灯会开始相应的闪烁和渐亮渐暗。首先,我们看一下当运行pulse()时发生了什么,这个方法需要一个PWM引脚,而LED灯对应的引脚2是一个数字引脚。在REPL里运行如下脚本。  myLed2.pulse(500);

你会因为程序崩溃得到REPL错误提示,如图3.3所示。图3.3 当数字引脚使用PWM方法时报的错误

这是因为Johnny-Five监视着你的项目并保证没有在数字引脚上使用PWM方法。这也展示了Johnny-Five的另一个优点,维护者做了很多事情清晰地展示大部分的错误消息,这在与机器人代码打交道的过程中很重要。

重启代码,运行如下脚本。  myLed2.on().isOn

这会在REPL中返回true值,如图3.4所示。图3.4 属性isOn

这指向了Led对象的一个属性。isOn会告诉你LED灯是否开启着(值不是0)或关闭着(值为0)。你的LED灯还有些其他属性,如图3.5所示。图3.5 其他LED属性

继续在myLed2和myLed9上尝试这些属性和方法吧。

现在我们已经学会了使用一个简单的Johnny-Five模块 ——LED灯,再来看看另一个更有趣的模块API,并通过Piezo对象演奏些音乐吧。3.3 使用PWM引脚和Piezo元素

Piezo元素很有意思,你可以轻松地通过它们为Johnny-Five项目添加音乐。我们会创建一个小项目并尝试用一些Johnny-Five工具来在这些有趣的小模块上演奏音乐。3.3.1 搭建硬件

连接一个Piezo很容易,你只需先找到+极和-极。通常,+极标记在Piezo的塑料外壳顶端,并且接线长一些(跟LED灯很像),较长的接线表示+极。最后,一些Piezo蜂鸣器还会将接线标记成红色(+极)和黑色(-极)。

一旦你找到了+极,连接到引脚3,再连接-极到GND,如图3.6所示。图3.6 Piezo连接图示3.3.2 编写脚本

这个脚本比起之前的复杂一些,我们需要创建一个Piezo元件,该元件只需要一个引脚。然而,一段音乐还是比开关LED灯复杂多了。幸运的是,Johnny-Five Piezo API的play()方法会接收一个对象。这个对象有例如拍子、节奏和歌曲这样的属性,我们会使用这些来演奏旋律。

有很多方法可以表示play()方法中的歌曲。一种方式(我们这里会使用的)是音符的字符串,如下所示。C D F D A - A A A A G G G G - - C D F D G - G G G G F F F F - -

当使用这个方式时,我们假设是中八度,-符号代表空音符,表示这里没有演奏。

对于拍子,我们会使用1/4拍,对于节奏,会从100bpm(每分钟节拍数)开始。代码会显示如下。  var five = require("johnny-five"),   board = new five.Board();  board.on("ready", function() {   var piezo = new five.Piezo(3);   board.repl.inject({    piezo: piezo   });    piezo.play({    song: "C D F D A - A A A A G G G G - - C D F D G -     G G G G F F F F - -",    beats: 1 / 4,    tempo: 20   }); });

保存到一个叫piezo.js的文件中并在命令行中运行:node piezo.js

你就会听到一段轻快的小曲从Arduino开发板中传出!3.3.3 引脚的作用

Piezo需要PWM引脚的原因是Piezo对象在通过引脚3向Piezo发送不同大小的电量,这样才能发出不同的音符。Johnny-Five库使我们可以将音符展示成我们方便理解的形式,而不是去计算出每个音符要发送多少电量。3.3.4 探索Piezo API

你可以继续探索Piezo API,包括尝试用其他方式来撰写旋律,这样可以更好地控制你的八度音阶。访问Johnny-Five网站可以获得更多的细节和实例。

挑战:使用REPL,找到一种方式让Piezo停止演奏歌曲。

提示:piezo.off()方法。3.4 小结

在这一章里,我们了解了GPIO引脚的工作方式,以及它们是怎样通过调整引脚值来为Johnny-Five对象打下基础的。

接下来,我们会看一下怎样处理使用模拟输入引脚的Johnny-Five项目的输入。第4章 使用特殊输出设备

现在我们知道输出引脚(数字和PWM)是怎么工作的了,再来看一下特殊输出设备。这些设备均使用多个引脚,原因有很多:有些使用了广泛熟知的协议,有些是有专利的,有些只是需要很多引脚来输出大量数据。我们会看一下一些广泛熟知的协议并且用这样的设备构造一个项目,这个设备是一个字符型LCD,让人联想到计算器。

这一章包括以下内容:

需要多个引脚的输出;

检查与Johnny-Five的兼容性;

获得文档、接线图等;

项目——字符型LCD显示。4.1 本章需要用到的模块

在这一章的项目里,你需要一个开发板、一根USB数据线和一个字符型LCD显示。一个面包板及其连接线也会派上用场的。

我们会了解一下怎样使用字符型LCD,包括有I2C接口的和没有I2C接口的。一个有I2C接口的例子可以在这里找到:http://www.amazon.com/SainSmart-Serial-Module-Display-Arduino/dp/B00813HBEQ。一个快速确认I2C兼容字符型LCD的方式是查看预先焊在转接板上的文字,如图4.1所示。它只用了4个引脚,分别标记为:VCC、GND、SDA和SCL。图4.1 I2C字符型LCD转接板示例

一个没有I2C接口的字符型LCD的例子在这里:https://www.adafruit.com/products/181。主要的直观区别是,比起I2C接口使用的4个引脚,这种LCD会使用更多的引脚,如图4.2所示。

注意这可能也需要通过焊接组装!

注意如果你使用的开发板不是Arduino,在购买字符型LCD前请阅读检查兼容性,你需要先确定你的开发板是I2C兼容的。写这本书的时候,这里用的所有的Arduino开发板都是在Johnny-Five内兼容I2C的。图4.2 一个不支持I2C接口的字符型LCD4.2 需要多引脚的输出

输出设备的类型很多,有些只需要一个输出引脚输出数据,比如我们之前几章用的LED灯和Piezo元素。但是,可供我们使用的输出设备数量庞大,其中很多都是需要更复杂的指令而不是仅仅一个输出引脚就足够。

这些设备以不同的方式工作,而这些已经超出了这本书的范畴,我们只会去了解一些常用的类型。在这一章里,我们只是了解一下I2C,因为对于项目要用的设备来说,这是很常用的格式。内置集成电路(I2C)

I2C,或称为内置集成电路,是可以共享相同的两个数据引脚组合的输出设备。两个数据引脚通常称为SCL(Serial Clock Line,串行时钟线)和SDA(Serial Data Line,串行数据线),SCL负责处理工作时序,SDA负责发送数据。你可以将多个设备连接到一对数字输出引脚的原因是,为了从I2C设备收发一个消息,你需要知道它的地址,这是每个消息都有的一个十六进制字节前缀,用来决定消息是发给哪个设备的。

I2C也经常被用于有很多数据要发送的输入设备,比如下一章会看到的加速器和磁力计。4.3 检查与Johnny-Five的兼容性

在线找到很多不同的设备很容易,但是怎么知道它们是否与Johnny-Five相兼容呢?并且它们是否可以工作在你自己的开发板的Johnny-Five上呢?

幸运的是,Johnny-Five网站www.johnny-five.io可以直接告诉你,你只需要按照一定的步骤来找到你寻找的设备类型。

首先,先看一下这个网站www.johnny-five.io。这里有很多菜单项,就现在来说,我们只需要看Platform Support项,如图4.3所示。图4.3 johnny-five.io网站导航

一旦进入Platform Support页面,就可以寻找你使用的开发板。如果你使用的是Arduino Uno,你的搜索会很快,因为它就在页面顶部,如图4.4所示。图4.4 Platform Support页面Arduino Uno的入口

你可以看到,这里有个表格显示了每种开发板条目的兼容性信息。如果你没有使用Arduino Uno,在购买或尝试使用I2C字符型LCD之前先快速检查一下开发板的I2C兼容性。4.4 获取文档、接线图等

在构建你自己的Johnny-Five项目时,一个很好的技能是找到你要使用的模块的 代码和接线图。幸运的是,www.johnny-five.io网站和项目提供了全面的高质量文档!

我们来看一下网站上的LCD文档,为构建项目做准备,如图4.5所示。

1.在网站的导航栏单击API项。

2.然后,你会看到左侧(如果你使用的是电脑)或上方(如果你使用的是平板或手机)有模块列表。

3.找到并单击列表中的LCD项。图4.5 API文档页面

一旦进入LCD页面,你会看到很多不同的LCD模块、LCD API的内容和底部一些例子链接。在Johnny-Five上每个模块都会有这样一个页面,所以很容易上手。

让我们来看看下一个项目里会用到的LCD API吧。

基于你使用的LCD类型的不同,构造函数接受多个不同的参数。当构建项目时,我会介绍引脚参数的细节,但是行和列是我们现在就可以了解的。不管你是从包装上读还是根据字符间隔的数量来估算都可以,算一算你的LCD有多少行和列吧。

还有个背光引脚选项,大部分LCD有背光,有一些还有RGB背光。如果没有背光,就不用初始化这个参数;如果有单色的背光,你就需要设置这个选项。

如果LCD有一个RGB背光,你需要查看LED副标题下的Led.RGB类并自己初始化它,我们会在项目里看一下实际的代码,但是最好先看一下RGB LED API确定一下。

一旦你熟悉了在Johnny-Five网站上搜索信息,就能方便地找到你的项目相关的丰富信息。还有就是,整个网站是开源的,可以在GitHub上找到(https://github.com/bocoup/johnny-five.io),所以你可以提出问题和提交自己的样例代码。4.5 项目——字符型LCD显示

在接下来的项目里,我们要将字符型LCD连接到Arduino Uno开发板上,并且使用Johnny-Five在上面打印一些信息。我会使用一个I2C显示,但也会介绍非I2C版本的接线图和代码。接线——I2C LCD

首先,我们会描述一下怎样连接I2C LCD。注意接线图会看上去有些不同,因为在I2C转接板的图形软件中没有模块出现。下面的附图会解释你的疑问。

你要在LCD元件的背面找到标记为SCL和SDA的引脚,这些引脚需要连接到Arduino Uno的两个引脚上,通常不是所有的元件都会清晰地标注出来。这些引脚靠近USB插口和重置按钮。如果USB插口面向左侧,这两个引脚通常在顶部一排引脚的左边,其中左边的是SCL,右边的是SDA。新型的开发板中,引脚侧面会标记出来。

这些都找好后,将VCC连接到5 V,GND连接到GND。如果存在LED灯引脚,就连接到3v3。如图4.6和图4.7所示。图4.6 I2C LCD的连接图图4.7 I2C转接板接线的照片——连接常规LCD

在给非I2C LCD接线时,要用到六个数据引脚和一些接地引脚和电源引脚。这些引脚是rs、en、d4、d5、d6和d7,在LCD上为引脚4、6、11、12、13和14。我们会把它们连接到Uno上的引脚8、9、4、5、6和7上。

引脚2和15都是连接到主电源上的,引脚2给LCD供电,引脚15给转接板LED灯供电。引脚1和16接地匹配引脚2和15。引脚3连接到一个电位器上,关于电位器我们下一章会有更多的介绍。现在只需要知道它像一个小的可以转动的把手。你的LCD上应该已经有一个了,现在按照如图4.8所示连接起来,左手侧连到电源,右手侧接地,中间连到LCD的引脚3(注意:顺序不能反过来)。这个电位器控制对比度,并且内置于I2C LCD中。图4.8 为非I2C LCD接线

请注意,在图4.8中,Arduino Uno被旋转了。请小心地接线。

想要检查接线是否正确,可以把Arduino接入你的电脑。打开背光,你应该会看到LCD上的块状字符。需要的话可以调整电位器后再观察块状字符。4.6 代码

现在我们已经将LCD连接好了,接下来会写一些代码。我们会先在代码中做一些初始化工作,还会在REPL中开启LCD,尝试一下实时操作。4.6.1 I2C版本

I2C版本的LCD代码如下。  var five = require("johnny-five");  var board = new five.Board();  board.on("ready", function() {   // Controller: PCF8574A (Generic I2C)   // Locate the controller chip model number on the chip itself.   var l = new five.LCD({    controller: "PCF8574A",   });   this.repl.inject({    lcd: l   })    l.useChar("heart");   l.cursor(0, 0).print("hello :heart:");   l.blink();  });4.6.2 非I2C版本

非I2C版本的LCD代码如下。  var five = require("johnny-five");  var board = new five.Board();  board.on("ready", function() {   var l = new five.LCD({    pins: [8, 9, 10, 11, 12, 13]   });   this.repl.inject({    lcd: l   })    l.useChar("heart");   l.cursor(0, 0).print("hello :heart:");   l.blink();  });

记住,如果你的LCD有I2C转接板就要使用I2C版本,否则,使用非I2C版本。它们的区别就是控制器:I2C LCD需要一个转接板上列出的控制器,而非I2C需要一个引脚数组去控制LCD。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载