DIYer: |
matchlighter |
制作时间: |
一星期 |
制作难度: |
★★★★★ |
GEEK指数: |
★★★★☆ |
我想要看看能不能远程操控我的Roomba ( iRobot 公司生产的自动清洁机器人),而当我不在家的时候让它通过推特报告状态。而且我希望能让这东西脱离计算机自行工作。我想出了下面这个方案,效果还不错。
材料:
○ 1 只小信号用的低功率PNP 晶体管(我用的是 2N2907A,也可能标号为 NTE159)
○ 1 只8 针的mini DIN 公头
○ 1 只7805 5V 稳压块
○ 1 块免焊接面包电路板
○ 1 块Arduino 电路板
○ 1 块Sparkfun WiFly Arduino 扩展板
○ 1排5个或者更多的排针
○ 一小段 Cat5 电缆,类似的也行(Cat5 是 24 AWG 线径的)
○ 最后一样,当然并不是最不重要的一样,那就是一台 Roomba*
工具:
● 烙铁
● 小剪刀
● 简易夹持爪,用来固定小物件
● 热熔胶枪
● 万用表
前提:
- 为了完成这篇教程,我现在假设你已经具备了基础的电子学、Arduino 和 Arduino 编程知识。
- 我只测试过 500 系列的 Roomba。但是,这方案应该可以应用在更新的型号上,不过比较旧的型号能不能适用就不太确定了。
- 所有的 500 系列 Roomba 都有串口。我们要利用这个串口来控制Roomba并获取 Roomba 的传感器数据。这个串口只不过是一个 7 引脚的位于中央的 Mini-DIN 插口。一般在本地的电子器件商店里花几块钱就能买到这些东西。
- 要使用串口时:把外壳拆下来,轻轻地把顶盖的后端拉开来,让后面的两个夹子松开。现在,用一把一字螺丝刀轻轻地把顶盖其余的部分也撬开来。插口就位于控制按钮的下面。
- 你如果想要不把顶盖拆掉使用串口的话,可以在顶盖上钻一个孔。
- 要和串口连接,最简单的方法就是通过一只 8 针的mini DIN 插头、一些排针,以及一小段 Cat5 电缆,来制作一根短电缆。
- 你可以使用 7 引脚的mini DIN插头替代 8 引脚插头,只要它中央是塑料的插头,而不是位于底部,即中央引脚没有连接在任何东西上面。从每一根单独的线头上剥掉一部分绝缘层。
- 如果你没有可以剥皮的剥线钳,那么可以绕着绝缘层轻轻地转动小剪刀,然后把它拉下来。
- 将这些线头焊接在迷你 DIN 插口上的小接头上是需要一点技巧的。用夹持爪把线头和迷你 DIN
插头固定住。你也可以在线头上包上一层折叠纸,避免被夹持爪夹出痕迹。从里到外逐步焊接。如果你正确地将线头焊在了接头上,那么就可以用吸锡器把接头外部
多余的焊锡清理掉了。
- 这些针脚可能会略微弯到外面一点。将针脚插入 Roomba 的DIN座,重新将它们排列好。
- 在每根线头之间滴上些热熔胶,让它们不会弯到一起发生短路。
- 在所有的线头周围包上一层胶带,避免和外壳发生短路。重新把迷你 DIN 插头组装起来,但是在确认了一切运行正常之前,不要把迷你 DIN 的外壳装在引脚上面。这样一来,如果需要修改的话,会方便一些。
- 6 号和 7 号引脚(见下图)都接地;将它们连在同一个引脚上。1 号和 2 号引脚都接在正极上。
- 这些引脚上的电压都是不同的。当插在电源插座上时,大约为 20V,否则就是电池的电压(大约 14V)。将它们都连接在同一个插头上。将剩下的线头连接到它们相应的插头上。
- 将 WiFly 扩展板安装在 Arduino 上。
- 用电缆将迷你 DIN 插头连接在 Roomba 上,将排针插在面包板上。
- 参考你自己绘制的接线图表,进行本教程接下来的接线步骤。
- Mike McCauley 在为 Arduino 编写 Roomba 库时提示我们,必须使用 PNP 晶体管才能从 Roomba 触发
Arduino 的 RX 引脚。用一根跳线把 Roomba 电缆上的 TX
引脚接在晶体管的基极引脚上。把晶体管的集电极引脚接地,而发射极引脚接在 Arduino 的 RX 上。
- 将 Arduino 的 TX 引脚连接在 Roomba 电缆的 RX 引脚上。将电缆的接地引脚连接在 Arduino 的接地端。
- 接下来我们接要解决一个小问题。在充电的时候,Roomba 的电源输出最高可达 20V。虽然 Arduino
的稳压器可以承受这样的电压,但是 WiFly 3.3V
的稳压器却经受不住。我们将需要在试验电路板上加上自己的稳压电路。要制作稳压电路,我们使用了一个 7805 稳压块,将电压降低到 5V。将
7805 的接地端接地,Vin(输入电压)引脚接在 Roomba 的电源上,而Vout(输出电压)接在 Arduino 的 5V 引脚上。
- 当你将插头连接在 Roomba 上时,Arduino 的电源 LED 灯应该会亮起来。
- 要记住,在给 Arduino 重新编程之前,先断开它和 Roomba 之间的电缆!
- 点击下载 本项目所使用的完整代码 。其中可能存在一点 bug,所以欢迎你在评论中提出改进的建议。
- 为了让它运作起来,你将需要将“TWITTER oAUTH KEY”替换成在“编程 3:发推”中所得到的 oAuth
密钥。接着我们只需要在 Credential.h 文件中设定好路由的密码和 SSID 就行了。现在,Arduino
应该就能够访问你的网络和推特帐号了。这段代码附上了详细的注释,所以你应该能够轻松修改其中的一些参数,其中包括 Roomba
在特定的事件发生时会发出什么样的信息。
- 如果你遇到了任何困难,那么就向下滚动到排错步骤,寻找帮助,也欢迎你直接和我联系。
- 和 Roomba 通讯实际上非常简单。Roomba 的串口使用 iRobot 的开放接口(OI)协议来和其他设备进行通讯(例如
Arduino)。OI 不仅可以提供对 Roomba 的电机和 LED
的控制,而且可以用Arduino来直接命令Roomba做清洁工作。要知道,给 Arduino 重写清洁程序毫无疑问要花掉几个小时。
- 不过,我们实际上会使用 Mike McCauley 编写的丰富的库 ,来和 Roomba 通过 OI 进行通讯。太谢谢你了,Mike!Mike 的库提供了 Roomba 的每一条基础 OI 命令。
- 在这里可以找到有关 iRobot的OI完整细节 。
- 在这一方面,我们可以在大多数情况下按照 WiFly
网络服务器的样例代码进行编写。样例代码给了我们所有需要的信息,唯独少了从网页浏览器读取请求。不过,这功能添加起来很容易。我们所需要做的只是用样例
代码一个比特一个比特地读取请求,然后将它们排列成字符串。很简单吧?
- 困难的地方在于正确配置路由器。首先,我们需要告诉路由器,让它给 WiFly 扩展板一个静态的 IP
地址。不幸的是,由于所有的路由器都各不相同,我无法告诉你实际该怎么做。你需要查阅你的路由手册,了解如何指派手动的 IP
地址,除非你并不介意给别人留下控制你的 Roomba
的机会。这基本上是在局域网上控制,而不是因特网上。然而,如果你很清楚相关的安全风险(或者知道如何设置认证系统),那么大多数路由器都可以配置成指向
Arduino 网页服务器。同样,你需要查阅路由手册,了解该如何做。你也许可以用谷歌搜索相关教程。
- 要通过局域网控制 Roomba,你只要在浏览器的地址栏里输入给 WiFly 指派的 IP 地址,瞧,这不就得了!如果你确实将它连上了互联网,那么就可以在任何地方输入路由器的 IPv4 地址来访问它了,你可以 在这里找到自己的IP地址 。
- 这一部分代码稍微比我一开始预想地更难一点。大部分给 Arduino 添加推特功能的教程都需要计算机进行实际的发推步骤。我不希望在获取 Roomba 的更新信息时必须让我的计算机开着。不过,我们可以使用 另一个非常棒的库 (由 @NeoCat 制作),让 Arduino
不需要计算机的协助也能发推。这个库是专门给以太网扩展板设计的。不过,幸运的是,Sparkfun 的 WiFly
扩展板库只需要很小的代码改动,就可以轻易替代 Ethernet(以太网)扩展板的库了。要想更新 Twitter 库,我们只需将
Twitter.h 头文件中 Ethernet 库的 #include 指向替换掉就行了。
- 我们可能还需要删除 EthernetDNS 库的 #include 指向,因为 WiFly 库提供了自己的 DNS 查询功能。我们还需要删除 Twitter.cpp 文件中的一些有关 EthernetDNS 库的代码。
- 现在,我们就得到了一个 Twitter 库,它和 WiFly 扩展板完全兼容。为了开始使用这个库,我们要允许它访问推特账户。你只要 点击这里 ,然后点击“Get a token to post a message using
OAuth”就行了。一旦我们确定它能够访问了,我们就会看到一个叫做 oAuth
密钥的页面。现在,我们只需要将这串密钥记在我们的草稿本上,到时候作为新的 Twitter 类的一个参数。现在,我们就可以开始通过 Arduino
发推了!
- 不过,在这里我们会遇到另一个问题:我们无法发送之前发送过的推。所以,Roomba 只能告诉你它完成过一次的事情。下面有一些解决方法:
- 给我们的硬件添加一个实时时钟(RTC),在每一条推中加上一条时间戳。这个方法成本较高,不过发的推看起来好看一些。
- 或者,读取 Roomba 的一些传感器参数,生成一个随机的数字。这个方法成本没那么高,不过发出的推看起来的效果和使用 RTC 的时间戳一样棒。
- 或者,我们还可以利用 Arduino 的 millis() 函数给推添加标签。这是最可靠且最简单的方法。不过,相比 RTC 时间戳的方法,看起来就不怎么样了。
- 在本教程中,我们将使用最后一种方法,因为它最简单,成本最低。millis()
函数会返回程序启动之后经过的毫秒数。我们不需要担心这个数字会变得太大,因为它经过 50 天就会重置为零。这个数字最大的值为
4.32×10^9,也就是个 10 位数。虽然它会重置,但我们也不需要担心会出现重复的推,因为完全相同的可能性微乎其微。
- 在这一小部分中,我列出了我遇到的一些问题和解决方法。
- WiFly 无法连接
在 Credentials.h 文件中确认你的 SSID 和路由器密码;
如果你使用的是 WEP,那么试试将它改为 WPA/PSK+WPA2/PSK。
- 推特无法更新
确认你的 oAuth 密钥是否正确(参见编程 3:发推);
检查你的焊点。
- 网页控制页面无法显示正确地信息
检查你的焊点。
- 无法访问网页控制页面
确认你使用的 IP 地址是正确的(参见编程 2:网络控制)。
- 如果上面这些解决方法都帮不了你,欢迎你直接和我联系。
我希望你喜欢我的教程,希望你能觉得它对你很有帮助!
如果有任何问题或建议,请留言。欢迎你提出反馈信息。
全文阅读>>
推荐小组: 设计 插画 网站技术
关注我们: 关注新浪微博 豆瓣小组 人人网 腾讯微博 RSS
Starming 星光社 版本:0.06 email:[email protected] 关于我们 小组 论坛 杂志 精选 鄂ICP备11004199