带你读《JavaScript机器人: 用Raspberry Pi、Arduino和BeagleBone构建NodeBots Make:JavaScript Robotics》之一:用Lo-tech材料建造机器人-阿里云开发者社区

开发者社区> 华章出版社> 正文

带你读《JavaScript机器人: 用Raspberry Pi、Arduino和BeagleBone构建NodeBots Make:JavaScript Robotics》之一:用Lo-tech材料建造机器人

简介: 本书将向你展示用Raspberry Pi、Arduino和BeagleBone构建NodeBots Make以及如何使用它来编写你所制作的东西。让使用JavaScript控制硬件变得简单而有趣。

机器人设计与制作系列
JavaScript机器人:
用Raspberry Pi、Arduino和BeagleBone构建NodeBots
Make:JavaScript Robotics
点击查看第二章
点击查看第三章
image.png

[美] Backstop Media 瑞克·沃尔德龙(Rick Waldron) 等著
王学昭 刘端阳 等译

|第1章|

用Lo-tech材料建造机器人

Andrew Fisher

当提到机器人时,你可能会想象无人机、自动驾驶汽车或类人机器人,如Atlas或Asimo。其中很多更规范的机器人至少花费数千美元,而且没有真正的上限(例如,Atlas的成本超过100万美元)。事实上,可以用一些便宜的电子元件与一些可以在家里找到的材料相结合,制造小而有趣的机器人。
NodeBots的一大优点是能够快速进行原型设计。JavaScript等易于使用的语言与Arduino等友好硬件的结合意味着你可以探索各种想法并了解其运作方式。使用机器人技术进行原型设计和尝试有助于快速学习和探索概念。
本章将使用名为SimpleBot(见图1-1)的基本机器人探索几个机器人概念。SimpleBot的第一个设计挑战来自于我的孩子,他们在某个晚上要求一起建造一个机器人。随着时间的推移,睡前仅有一小时的工作时间,这意味着只能使用手头的工具,没有激光切割机、CNC铣床或3D打印机。怀揣着真正的黑客精神,我们使用纸板、电缆扎带和橡皮筋完成了制作。

image.png

图1-1 完整版SimpleBot

图1-2显示了我们当晚制作的SimpleBot。在制作完成之后,我们爱上了使用纸板、电缆等材料进行原型设计,最近还使用了用于机器人的corflute(瓦楞塑料板)。这些材料价格低廉,易于使用剪刀或优质工艺刀操作。你不必使用激光切割机等工具,但如果有激光切割机,可更快更准确地切割这些材料。你可以在餐桌上切割这些材料,孩子们也可以轻松地参与其中。
在第一次努力之后, 我多次修缮了SimpleBot,现在用它做一些NodeBot事件的教学机器人。希望你已经相信用纸板等简单材料制造机器人是一个好主意。本章将涵盖:
构建基本的SimpleBot平台。
切断电源线,从计算机上取下我们的SimpleBot。

image.png

图1-2 首个SimpleBot

1.1 构建SimpleBot

在构建SimpleBot之前,请记住构建方法没有正确或错误之分。SimpleBot故意保持开放式设计,因此你可以按照想要的方式进行操作。一些人一边尽可能少地构建版本,一边自动化Nerf-Gun-Toting平台。SimpleBot的目的是发挥、探索和扩展,以加强你对机器人的了解——因此可以自定义。

1.1.1 材料单

SimpleBot项目分为两部分,每个部分都需要零件。表1-1中列出了本章的所有零件,文中的对应位置会再次列出每个阶段所需的零件。表1-2列出了无线版本所需的零件。

表1-1 SimpleBot 材料

image.png
image.png

表1-2 无线 SimpleBot 材料

image.png

1.1.2 构建步骤

1.切掉纸板上的模板。不需要苛求完美。做内孔时,使用刀、切割垫和尺子比使用剪刀更容易。使用轮子可以切除或保留中心孔,中心孔只是一个参照,标注中心位置,以便你可以通过它拧到伺服体。
你现在应该有一整套的碎片。最后有凸起的大块是底座,凸起是前面的。使用凸块推动较小矩形上的小孔,你可以将其用作保险杠以安装物体。
2.将车轮安装到伺服体。拿十字形伺服喇叭(你的伺服体中应该有一包不同的塑料配件),并将中心与车轮中心对齐。你可以使用一根电线或一根针在材料上戳小孔以标记要拧的点(见图1-3)。
将车轮牢固地拧到伺服喇叭上。如果你愿意,只需将它们黏上(但之后你就不能再使用伺服喇叭)——两种方式都可以。将车轮安装在伺服喇叭上后,将车轮中心和喇叭拧入伺服体的小齿轮。转动螺丝刀时,请轻轻握住所有零件,在这里会不小心剥离伺服体中的齿轮并导致它们滑动。为两个伺服体执行此操作,你将拥有两个轮子。

image.png

图1-3 使用伺服喇叭和一根电线标记螺钉点

轻轻旋转伺服体以确保其自由转动。如果你使用纸板或corflute,你的安装螺丝可能会有点长。螺丝不必完全穿过,但需确保在你转动它们时,它们在清除伺服体。
当你连接电缆扎带时,只需拧紧它们以便停止移动,但不要太紧以防撕裂纸板或 corflute。
3.将伺服体安装到机箱上,如图1-4所示。适当地将这些放在前面,以便重量平衡。你可以把它们放在任何地方,但请记住,如果你发现它倾斜了你可能需要平衡一端。安装伺服体,使带轮子的一侧最靠近机箱前部,并用两根电缆扎带将它们连接在安装孔上,以使它们保持在适当位置。使用两根电缆扎带,以便在开始行驶时伺服体不会扭曲。

image.png


图1-4 在底座上安装伺服体

4.将电池安装在车轮之间,如图1-5所示。同样,你可以使用扎带,但如果你想轻松充电,双面胶带或蓝丁胶也适用于此。随身携带修剪电缆扎带或者安装一切都有点困难。
5.为SimpleBot设计一个简单的“滑动”环以保持平衡。你可以通过将电缆扎带环绕在机箱中间的SimpleBot背面来完成此操作。从顶部做这个,以免扎带的触手被缠住。环的下侧应与车轮一半的高度大致相同,以便车身保持水平。这看起来“松散”,但不要担心,你可以在下一步用面包板确保牢固。

image.png


图1-5 在机箱上安装电池

6.添加面包板。将面包板安装在你放置防滑电缆扎带的位置,以便电路板保持滑动。电缆扎带可以沿着通道所在的电路板的长度向下延伸,你仍然可以在其上放置IC。
现在你已经完成了机械工作,是时候开始学习电子设备了。完整的接线图如图1-6所示,下面将对每个部分进行说明。
7.创建一个电池电源轨。面包板的背面给你提供至少7.4V的电压。面包板两侧同时接地。将Arduino Nano安装在一端并接地。如你所见,将Nano放置在主通道的另一侧,通过电缆扎带,并在一侧连接USB,以便插入,如图1-7所示。

image.png


图1-6 SimpleBot 线路图

image.png

图1-7 电压分配

8.为伺服体通电。伺服电机需要6V电压,因此电池电压过高,所以使用+6V稳压器为伺服电机平稳地输出6V电压。将6V电压放在面包板的另一个导轨上,以便安装伺服系统。
请注意,我们正在使用面包板从“后面”将电压从电池输入到调节器,然后从“前面”将电压从调节器送到另一个轨道。在本章后面调试电路时,这是一种很好的方法,可以使电路一目了然。
9.伺服电机可以连接到前电源轨,电压和接地都可以连接到每个电源轨。左伺服信号线连接到引脚9,右伺服信号线连接到Arduino上的引脚8,如图1-8所示。
放松一下,整理所有电线,确保没有任何东西遗落。现在你已经准备好开始处理代码了。
本书示例的所有源代码都可以在GitHub上找到。

image.png


图1-8 伺服电路

1.1.3 安装Node.js包

确保已安装Node.js。你只需要为Simple
Bot提供几个软件包,可以从终端shell安装:

1.1.4 使用基本程序测试构建

你的Arduino需要Firmata(参见“Ar-duino”),所以要做的第一件事是在构建更复杂的东西以控制SimpleBot之前测试所有东西。下面的代码通过USB连接到Arduino,然后向前运行伺服体3秒,停止3秒,向后运行3秒,最后在退出前停止。
将SimpleBot连接到计算机并运行例1-1中所示的脚本,并将替换为Arduino所连接的串行端口。
如果这一切都有效,太好了!你的SimpleBot正常工作。

1.1.5 故障排除——接线

如果你的SimpleBot没有按照描述工作,请不要担心,是时候进行一些调试了:
两个伺服都没转
检查线路。
每个伺服电机应连接到电池的电源轨、红色端、棕色(或黑色)端、接地端。左侧伺服电机的信号线应连接到Arduino上的引脚8,右侧伺服电机的信号线连接到Arduino上的引脚9。
根据接线图,确保电池接地连接到Arduino接地,你需要跨电源的公共接地。
其中一个伺服没有运转
检查你的接线,特别注意确保你的伺服电机信号线连接到Arduino上的正确引脚。
例1-1 servo-test.js(伺服电机测试代码)
image.png
image.png
SimpleBot当场旋转
这是由伺服电机在不同方向上旋转而不是代码错误引起的。你可以解开伺服电机并将其翻转,这将使所有其他代码示例运行。否则,只需修改代码即可将违规伺服的命令从servo.ccw()更改为servo.cw(),反之亦然。

1.1.6 一个简单的驱动程序

现在SimpleBot正常工作,你可以创建一个简单的程序来驱动它。作为一个起点,让我们从键盘输入,以便向前和向后驱动SimpleBot,向左或向右旋转,并停止它。例1-2中显示的代码是如何使用键盘控制进行驱动的一个非常基本的示例。
例1-2 simplebot.js(驱动示例)
image.png
image.png
image.png
①使用命令行的串行连接服务连接到电路板。
②设置一个等待键盘按键的事件。
③检查按下的键,然后根据你想要去的方向接合电机。
将SimpleBot连接到计算机并运行脚本:
image.png
你现在应该可以使用键盘上的箭头键在桌子或地板上驾驶SimpleBot,然后按空格键停止。

1.1.7 故障排除——伺服电机

以下是一些提示,以防你遇到困难:
一个或两个伺服电机不运转
有关跟踪布线问题,请参阅1.1.5节。
你敲击空格键让机器人停下来,但它继续移动一点点
这是因为连续旋转伺服系统会攻击普通伺服系统,同时每个伺服系统的制造略有不同。有些伺服系统在后面有一个“调音罐”,可以转动,以便在你将其设置为停止时停止。
如果没有这些,那么你可以在代码中设置停止点。
在CR伺服系统中,停止位置定义为中心(回想一下,普通伺服系统工作的弧度通常为180°),该位置通常为90°。设置一个低于此值的值将使伺服电机朝一个方向旋转,高于此值将朝另一个方向旋转。
在停止代码中,将伺服电机设置为移动到90°位置。因此,你可能需要稍微调整停止点,将停止代码更改为:
image.png
没有“正确”的数字,且每个伺服电机都会略有不同,所以几分钟的修补就能让你找出伺服电机所需的数字。
驱动因素
SimpleBot驱动系统基于一种名为差动驱动的方法,其中每个车轮由连接在其上的伺服电机独立控制。这是两轮机器人非常常见的设计,因为两个轮子既可以控制前后运动,也可以控制整个方向。最基本的形式使得机器人非常易于控制。

  • 为了前进,我们将两个车轮向前旋转。
  • 为了倒退,我们将两个轮子反向旋转。
  • 为了向左转,我们向后停止或旋转左轮并向前驱动右轮。
  • 为了向右转,我们向后停止或旋转右轮并向前驱动左轮。

这种设计的最大含义是,当你想要改变方向时,你的机器人通常会在现场旋转。可以(而不是在现场)转动弧形(通过相对于另一个减慢一个轮子),但是这会导致代码复杂。
将这种差速驱动设计与汽车驱动方式进行对比:两个轮子(或四个,如果车辆具有全轮驱动)由单个电机通过轴旋转以产生驱动,然后两个轮子按不同角度定向改变方向。
不同的驱动系统各有优缺点,但差动驱动是一个很好的切入点。

1.2 切断电源线

SimpleBot已经可以围绕着桌子运动了,但是也遇到了一个很大的局限,即连接SimpleBot与计算机的USB线的长度有限。很显然,我们可以通过使用长一点的线来解决这个问题,然而,任何超过3米长的线路都会出现信号问题,同时还可能存在线路缠结的可能性,并且还要考虑机器人拖拽的重量。
切断电源线是一种较好的解决方式,这样可以让SimpleBot脱离USB线的束缚,能够自由运动。

1.2.1 构建无线SimpleBot

在构建无线SimpleBot过程中,由于一切都使用一个电池,我们将使用一个带有旁路滤波器的单个电池来缓和由伺服电机产生的电压峰值。这里还会使用WiFi,这是因为WiFi比蓝牙可使用范围稍广泛一些,而且只要有WiFi的地方,都可以使用,没有地域限制。
在这个电路中使用的WiFi模块价格低廉,大约12美元,电路显露出设计者的智慧。该模块作为WiFi到串行的连接器工作,所以通过网络发送到WiFi模块的内容都会被复制到串行线路,反之亦然。这也意味着我们的Arduino设置几乎可以与之前相同,但是却可以通过该模块进行无线连接,而且达到这样的效果只需要花费12美元以及对代码进行一次更改。
材料清单
这一阶段所需的材料如下:

  • 50V 0.1μF 陶瓷电容器
  • 公对公跳线
  • 公对母跳线
  • USR WiFi232-T模块

1.2.2 连接

开始之前,先从USB上拔下Arduino,这样可以防止在构建电路时发生故障。
无线的种类是什么?
在该项目中,我们已经选择了WiFi,但是也有许多其他可以使用的无线电类型,例如蓝牙和433MHz串口。每个无线电类型都有其优势、弱势以及权衡。关键是要考虑其频率、功率和成本。
较高的频率可以提供更高的比特率,但是可以轻松地被障碍物阻挡。更大的功率可以让信号“更响亮”,所以信号可以传播得更远,但是会更快地耗尽电池。经验法则就是在比特率、范围和成本中选择两个来考虑。
1.首先要做的是在Arduino接地和VIN上添加去耦电容,这是因为它会由电池供电。同时还要为每个伺服体的电源和接地添加电容,如图1-9所示。

image.png


图1-9 WiFi布线图

2.无线模块使用2mm间距接头,因此也无法直接插入面包板中。使用公对母跳线将该模块连接到面包板上。然后按照图1-10的内容添加WiFi模块,具体连接内容也可以参照表1-3。

表1-3 WiFi模块连接


image.png

image.png


图1-10 添加无线模块

3.再三检查你的接线,因为这些模块没有反向或者过流保护,所以电压过高或电流从负极向正极流经WiFi模块时会将其烧毁。
这些模块是用于连接外部天线的,所以如果不使用外部天线,那么作用范围将大大缩小。使用蓝色胶块或热胶能够让天线轻松地连接到底座上。
4.将电源线上的跳线连接到Arduino上的VIN引脚。这会为Arduino提供7.4V电压,确保其正常运行。
现在开始设置软件方面。

1.2.3 控制SimpleBot

让我们分阶段介绍无线部分的内容。在移除电线时,操作更加复杂,所以在进行下一步前,应确保每个部分都是工作的。如果过程中出现了错误,返回去再试一次。
测试、配置模块
如果提供3.3V电压,那么WiFi模块会充上电。在默认情况下,它会处于接入点模式。大约等待10~15秒,然后你应该可以在计算机上可用的网络中,发现“USR-WIFI232-T”标识。连接到该网络,一旦连接成功,你可以通过尝试两件事情确认WiFi模块是否全部正常工作。
该模块的IP地址是10.10.100.254,它有一个DHCP服务器,所以一旦连接上它就会为你制定一些东西。测试IP地址10.10.100.254,如果得到如例1-3中显示的响应内容,那么进入下一步。
例1-3 检查与模块的连接
image.png
image.png
如果没有得到响应,那么诊断一下网络端口,并确保你没有使用静态IP或覆盖DHCP的其他配置。
现在打开Web浏览器,输入IP地址“10.10.100.254”。在默认情况下,用户名和密码都是“admin”。在该界面中,你可以修改模块本身的常用设置。尝试将其设置为在STA + A模式下运行,这意味着它可以作为WiFi站(连接到你的WiFi网络)运行,但如果你需要,它也可以作为接入点运行(例如将SimpleBot带到公园时)。
如果你曾经配置过WiFi路由器,那么一切都会非常熟悉。提供网络连接详细信息,获取要连接的模块。现在你应该能看到所有的连接信息。
如果由于某种原因无法使用这些方法进入无线模块,那么请尝试直接连接串口。你需要一些像FTDI或其他串行ttl USB线的东西。使用115200波特率的串行控制台进行连接。WIFI232-T用户指南提供了更多有关使用AT命令的信息。
设置Arduino
因为WiFi模块可以以更高的波特率工作,Arduino也应该以这个速度工作。想要更改该设置,请打开StandardFirmata程序,然后对像这样的命令行执行“查找”:
image.png
将其替换为以115200波特率连接:
image.png
编译程序并将其上传到Arduino上。
stk_500同步错误?
因为你正在使用Arduino硬件串口,如果需要闪存Arduino,你需要移除连接到WiFi模块的RX线和TX线,这样可以通过USB与Arduino通信。如果收到了stk_500同步错误,这可能是因为你忘了拔掉串行线。
测试网络
下一步是在尝试从Johnny-Five和应用程序发送信息之前确保进行通信。WIFI232模块公开TCP端口8899,从串行连接发送或者接收的任何内容均通过TCP端口发送。消息像这样传递:
image.png
如果使用Telnet连接到模块,你应该能够看到来自Arduino的任何串行消息。虽然大多数Firmata数据都是编码的,但是当一个消息以明文形式发送时,它将Firmata程序的名称作为启动的一部分发送给接收者。
在我的网络上,模块正在使用IP:10.1.1.12,因此telnet在端口8899上使用telnet 10.0.1.12 8899。
在默认情况下,Windows通常不会安装Telnet客户端。你需要进入控制面板的“添加/删除Windows组件”部分并进行安装。
这给出了以下响应:
image.png
现在一切都是连接状态。点击Arduino上的重置按钮,程序重新开始运行。你应该会看到指示灯引脚13 LED闪烁序列,并在几秒钟内完成以下内容:
image.png
成功了!你刚刚没有使用任何电线,却收到了来自Firmata的消息。退出Telnet(按Ctrl +],然后输入“quit”)。现在已经准备好进入期待已久的下一步了。
无线控制SimpleBot
现在你已经通过网络传输了Firmata消息,需要做的就是让Johnny-Five读取和写入消息。问题是Johnny-Five假设你有一个连接好的串行设备,例如“/dev/ttyUSB0”或“/dev/tty.USBSerial”。相反,你有一个网络套接字。一种选择是为Johnny-Five编写一个IO接口,但是简单的套接字是做不到的,而且它不像你正在编写一个新的消息传递协议那样,无须通过电线,只需通过WiFi的神奇功能发送消息。接下来,请按照此处描述的步骤进行操作(Mac/ Linux系统使用socat,Windows系统使用VSPE)。
Mac/Linux系统的计算机使用socat工具
socat在两个独立的数据通道之间创建中继。了解到这点之后,你可以使用伪终端来创建一个“虚拟”串行终端。之后Johnny-Five和我们的应用程序就可以使用“虚拟”串行终端。你应该能够从发行版的软件包管理器中安装适合Linux系统的socat。在Mac OS X上,可以使用Homebrew。
在看起来像串行端口的伪终端之间进行中继,并将它连接到用于与WIFI232模块通信的TCP套接字上。在我的网络上,WiFi模块是10.0.1.12,你的会有所不同,所以只需将IP更换一下。以下是它的工作原理:
image.png
要创建此路由,请使用此命令(记住要将10.0.1.12替换为你的WiFi模块的正确IP地址):
image.png
image.png
-d开关是一个调试参数,因此,如果你不需要详细信息,可以删除它,如果出现某些内容不起作用的情况,那么最多可以使用四次。
该命令告诉socat创建一个伪终端(pty)。不要阻塞它(非阻塞nonblock,你可以从其他进程使用它)并将其链接到$HOME/dev/ttyV0(在这种情况下将它放在/home/ajfisher/dev/ttyV0上,但是可以把它放在想要放置的任何地方)。然后,socat使用端口8899将该终端连接到IP为10.0.1.12的TCP连接上。一旦运行socat,创建另一个终端窗口并使用屏幕连接到虚拟串行连接上:
image.png
再次重置Arduino,然后你将看到Firmata程序名称。如果一切正常,那么现在已准备好使用无线控制SimpleBot。需要进行的操作就是将虚拟串行连接传递给你之前编写的程序,然后离开。此时,它将像以前一样工作,但是SimpleBot现在是无线的:
image.png
Windows系统的计算机使用VSPE工具
在Windows上,使用名为虚拟串行端口模拟器(VSPE)的软件。该软件允许你定义COM端口,然后为其他端点(例如网络服务)创建映射。
最后,消息应该像这样发送:
image.png
image.png
下载并安装该软件,打开后创建两个设备。
从“New Devices”(新设备)中创建第一个设备作为“Connector”(连接器)并将其设置为COM10,这将为Windows创建一个可以通信的COM端口,并将消息传递给Node.js应用程序:

  • TCP客户端
  • 主机:10.0.1.12(或任何你的WIFI232 IP地址)
  • 端口:8899
  • 第二个设备是一个“桥型”连接器,它可以在两个数据流之间进行桥接。
  • 串行端口
  • 端口:COM10 (直接输入,因为该端口是虚拟的,不会出现在下拉列表中)
  • 速度:115200

保存配置并按“play”(播放)按钮运行全部内容。
现在应该能够像以前一样运行SimpleBot应用程序了:
image.png

1.2.4 疑难解答

这里最常见的问题与导致重置的功率或范围有关。
如果没有足够的功率或没有使用去耦电容,那么当你对电机进行大的方向更改时,Arduino或WiFi模块可能会复位。检查电路,确保放入电容器,并检查电池组的电量。
如果你遇到持续的重置问题,那么可能是从伺服电机中汲取了过多电流。如果电流特别重负荷(高扭矩),那么可能会让Arduino降低电压。你可能需要一个为类似遥控模型车设计的更高容量的电池。
如果你让机器人走出了WiFi网络覆盖的范围,那么可能会出现乱码,同时SimpleBot会停止响应。正因为如此,你要开始考虑更长的天线和其他无线电类型,以使WiFi辐射范围更广。

1.3 进一步探索

在本章中,你拿了一些纸板,然后用它们制作了一个机器人。只需要一个由废料和廉价材料制成的基本机器人,你就可以探索一系列主题:

  • 差分驱动器
  • 编程控制系统
  • 远程控制

现在你已经拥有了自己的SimpleBot,你可以带着它探索许多有趣的事情,学习更多的机器人概念。以下是可以尝试的一些内容:

  • 增加自主权和避免碰撞功能。
  • 添加运行Node.js的树莓派来执行机器人上的所有进程和逻辑,使其更加自动化。
  • 使用拴在手机上的树莓派,制作一个可以在任何地方驱动的远程网络控制机器人。
  • 使用反射传感器让SimpleBot跟随线条运动。
  • 添加编码器轮,以便你可以测量行程/速度,并让机器人更精确地转动。
  • 添加光传感器并对SimpleBot进行编程以接近光线或远离光线。
  • 对SimpleBot进行编程,使得你收到推特消息或有人给你发送电子邮件时,它旋转并点亮LED。
  • 使用更多的轮子甚至全向轮探索SimpleBot的不同驱动机制,让它可以在不旋转的情况下改变方向!

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:

华章出版社

官方博客
官网链接