iRobot Create 的乐趣
在 Linux 世界中,很少有东西直接与物理世界互动。虽然您可能拥有允许您与计算机交互的外围设备,但计算机无法与您互动。这很容易解决,方法是创建一个机器人来控制它。iRobot 以其 Roomba 吸尘器而闻名,它创建了一个名为 iRobot Create 的教育机器人,该机器人基于 Roomba,并且非常易于使用。Create 提供了一个简单的基础,只需很少的努力即可扩展。有些人甚至在机器人上安装了一台旧笔记本电脑以实现移动性,但这对于大多数情况来说是过度的。即使缺乏官方支持,在 Linux 机器和 Create 之间建立连接也不难。
与 Create 交互的最简单方法是通过串行链路,使用机器人随附的电缆。对于某些计算机,您可能需要 USB 转串口适配器;但是,它们很容易获得,价格低于 15 美元。连接将是 TTY 串行,例如 /dev/ttyS0,或者如果您使用 USB 适配器,则连接很可能会显示为 /dev/ttyUSB0。
为了通过串行电缆来回传递命令,最容易使用的工具是串口终端。有几种此类型的软件可用。在这里,我使用 gtkterm,一个 GUI 终端,但如果您更喜欢 CLI 工具,screen 和 minicom 都可以使用。安装并启动 gtkterm 后,您必须在“配置”→“端口”下设置正确的端口。该端口将是先前指定的设备,如果您不确定选择哪个号码,您可能必须全部尝试。速度应设置为 57600 (baud)。其他默认设置(无奇偶校验、8 位、1 停止位和无流量控制)都可以。我也喜欢打开“本地回显”,它也在“配置”下,让您看到您输入的内容。
要测试配置,请插入 Create 进行充电并将其连接到您的计算机。终端应开始每秒显示如下行
bat: min 0 sec 11 mV 16699 mA 566 deg-C 21
除非您计划将计算机安装到机器人本身,否则一旦机器人开始移动,串行电缆将变得笨重。为了解决这个问题,机器人需要无线化。虽然 802.11 Wi-Fi 在笔记本电脑上已经很普及,但在像 Create 这样的嵌入式系统上并不常见。另一个选择是蓝牙,它也变得越来越普及;但是,蓝牙模块通常很昂贵,Linux 支持时好时坏,而且范围很短。最近,Maxstream 的 XBee 无线电系列在这种类型的项目中越来越受欢迎。它们与蓝牙调制解调器非常相似,更适合这种类型的项目。
此项目的所有部件都可以在 SparkFun 购买,并在表 1 中列出。除了这些物品外,您还需要一些基本工具和用品,例如面包板、电线和烙铁。
表 1. SparkFun 物料清单
零件编号 | 描述 | 数量 | 单价 | |
---|---|---|---|---|
WRL-08664 | XBee 模块 | 2 | $24.95 | |
WRL-08687 | USB XBee 探索者 | 1 | $24.95 | |
BOB-08276 | XBee 分线板 | 1 | $2.95 | |
PRT-08272 | XBee 插座 | 2 | $1.00 | |
BOB-08745 | 电平转换器 | 1 | $1.95 | |
PRT-00116 | 公头针 | 1 | $2.50 | |
COM-00526 | 3.3V | 稳压器 | 1 | $1.95 |
COM-08375 | 0.1 uF 滤波电容器 | 1 | $0.25 | |
PRT-08287 | 公 DB-25 连接器 | 1 | $0.95 |
首先,您需要配置您的两个 XBee 模块。首先,将其中一个插入 USB XBee 探索者,并通过 USB 电缆将其连接到您的计算机(USB XBee 探索者只是一个接受 XBee 模块的串行转 USB 转换器板)。再次使用 gtkterm,将其设置为监听 USB 端口(很可能是 /dev/ttyUSB0),并将速度设置为 9600 波特。在终端中输入+++,模块应该回复OK.
模块现在已准备好进行配置。输入ATID3330,DH0,DL1,MY0,BD6,WR,CN,在每个逗号之后,模块将回复OK。移除这个 XBee,并插入另一个。再次,输入+++,并等待OK进入配置模式。但是,这次用以下命令配置它ATID3330,DH0,DL0,MY1,BD6,WR,CN。每个模块都配置为在网络 0x3330 上,并以 57600 波特的速度将数据直接发送到另一个模块。一个模块连接到计算机,另一个模块连接到 Create。这些模块是可互换的——任何一个都可以连接到计算机或 Create。
接下来,构建电路以将 XBee 与 Create 串行连接。此电路将 3.3 伏 XBee 连接到 5 伏 Create。首先,将两个插座焊接到 XBee 分线板上。最简单的方法是将插座放在 XBee 模块本身上,将其翻转过来,并将分线板放在顶部。
焊接插座后,移除模块并将四根电线焊接到 VCC、DOUT、DIN 和 GND。之后,在公 DB-25 连接器的引脚 1、2、8 和 21 上焊接另外四根电线。引脚应标记,尽管标记很淡。接下来,从公头针条上折断两个六针长度,并将它们焊接到电平转换器的每一侧。同样,如果您使用面包板作为夹具在焊接时保持引脚笔直,这是最容易的。最后,根据原理图(图 2)和/或面包板接线图(图 3)组装所有部件。完整的面包板如图 4 和图 5 所示。

图 2. XBee/Create 接口的原理图
将 DB-25 连接器插入 Create 的扩展端口,如果存在,则移除命令模块。将另一个 XBee 插入您的计算机,设置 gtkterm 以 57600 波特的速度与其通信。与之前一样,插入 Create 进行充电,如果运气好的话,您将在终端上看到一些输出,并且 USB 探索者上的 RX 指示灯应闪烁。如果没有,请检查您的连接和配置。
即使您没有决定使用无线方式,您仍然可以以完全相同的方式控制 Create。Create 和大多数 Roomba 都实现了 iRobot Open Interface 协议,简称 OI。在计算机端,让我们使用 Python 通过 iRobot 在 Python 中的 OI 实现与 Create 通信。这使您可以在更高的层次上工作,而不必担心操作码等。您将需要 pySerial 和 openinterface.py(请参阅“资源”)。openinterface.py 中存在一个小错误,可能会使其难以在 Linux 上使用。解决此问题的最简单方法是在与文件相同的目录中运行此 sed 命令
$ sed -ie "803s/ - 1//" openinterface.py
或者,您可以手动删除- 1从第 803 行手动删除。
该库易于使用——例如,要以全速驱动 Create 向前,请执行以下操作
import openinterface as oi PORT = "/dev/ttyUSB0" # change to your serial port bot = oi.CreateBot(com_port=PORT,mode="full") bot.drive_straight(500) # drive forward, full speed
为了访问传感器数据,您需要请求它。如果您使用bot.stream_sensors(),Create 将每 15 毫秒自动更新每个参数中指定的传感器。要停止,请执行bot.stop_streaming_sensors()。虽然您可以手动指定要流式传输哪些传感器,但通常最简单的方法是流式传输所有传感器。
驾驶也很简单。bot.drive()接受两个参数:速度和转弯半径。速度是介于 500 和 -500 之间的整数,指定车轮的平均速度,单位为毫米/秒,负值对应于向后行驶。转弯半径是介于 200 和 -200 之间的数字,指定转弯半径,单位为毫米。正值向左转,负值向右转。还有一些特殊的方法可用于直线行驶和原地转弯。
以下代码使用传感器数据来驾驶和避开障碍物
bot.stream_sensors(6) # packet 6 -- all sensors while True: # loop forever if bot.sensors["bump-left?"]: # is it pressed? bot.drive(-500, 10) # spin to maneuverer bot.wait(5) # spin for 5 cycles elif bot.sensors["bump-right?"]: # other direction bot.drive(500, 10) bot.wait(5) else: bot.drive_straight(500) # otherwise, go forward bot.wait() # prevents excess cycling
您也可以非常轻松地访问 Create 的歌曲播放功能,并且可以将歌曲存储在 17 个可用的歌曲槽中。使用bot.define_song()来存储歌曲。第一个参数是歌曲将存储的歌曲槽,您稍后也使用此值来播放歌曲。其余参数是音符,由音高和长度的元组表示。长度以秒的 64 分之一为单位测量。调用bot.play_song()来播放歌曲。我不是音乐天才,所以希望你能写出更好的曲调
bot.define_song(1, # index of song ("G1", 16), # note tuples ("G2", 16), # note, duration ("G3", 64), # 64 = 1 second ("G9", 16)) # up to 100 notes # ...snip... bot.play_song(1)
要使用操纵杆和 Python 无线控制 Create,我们可以使用 pygame(pygame 操纵杆 API 的完整详细信息超出了本文的范围;请查看文档以获取更多信息)
import pygame from pygame import locals pygame.init() js = pygame.joystick.Joystick(0) # create joystick js.init() import openinterface as oi PORT = "/dev/ttyUSB0" # change to your serial port bot = oi.CreateBot(com_port=PORT,mode="full") while True: if js.getAxis(0) > 0: turn = 1 - js.getAxis(0) else: turn = -(1 + js.getAxis(0)) bot.drive(js.getAxis(1)*500, turn*200) bot.wait()
此代码允许您使用操纵杆(自动检测)来对 Create 进行原始控制。必须操纵 x 轴值,以便在空档位置时,机器人直线移动且不旋转。
接下来该怎么做?这取决于您。在硬件方面,您可以将额外的硬件连接到 Create,并通过其数字输入和输出进行控制(有关引脚排列,请参阅 OI 规范)。但是,仅凭基础和一些软件,仍然有大量的可能性。例如,您可以将 Create 变成一个让人想起 Clocky 的闹钟,Clocky 是一个在房间里跑来跑去迫使您起床将其关闭的闹钟。或者,如果您更喜欢数学,则可以使用“距离”和“角度”传感器来绘制房间地图。
资源
SparkFun 电子产品: www.sparkfun.com
iRobot 开放接口规范: www.irobot.com/filelibrary/pdfs/hrd/create/Create%20Open%20Interface_v2.pdf
pySerial: pyserial.wiki.sourceforge.net/pySerial
openinterface.py: createforums.irobot.com/irobotcreate/attachments/irobotcreate/Create_Support/792/2/openinterface.py
pygame: www.pygame.org
Zach Banks 是一位在硬件和软件之间徘徊的实验者。他很高兴接受评论和问题,邮箱是 zjbanks@gmail.com。