winston 发表于 2011-12-23 19:00:35

发个新鲜的:扫地机器人也发微博

“主人,我已完成卧室的吸尘工作,正在前往客厅。” 如果你看到有人发了这么一条微博,不要直接YY成女仆什么的,也许那是谁家的扫地机器人。互联网上,没人知道你是一个机器人...


http://img1.guokr.com/gkimage/d9/7j/m3/d97jm3.png


DIYer:matchlighter
制作时间:一星期
制作难度:★★★★★
GEEK指数:★★★★☆



我想要看看能不能远程操控我的Roomba ( iRobot 公司生产的自动清洁机器人),而当我不在家的时候让它通过推特报告状态。而且我希望能让这东西脱离计算机自行工作。我想出了下面这个方案,效果还不错。

双向电梯[*]1   材料和工具[*]2   Roomba 的串行接口[*]3   制作连接电缆[*]4   连接 Arduino[*]5   完整的代码[*]6   编程[*]6.1   编程1:通讯[*]6.2   编程 2:网络控制[*]6.3   编程 3:发推特[*]7   排错[*]8   总结[*]9   DIYer签到处


1   材料和工具http://img1.guokr.com/gkimage/lh/nu/k2/lhnuk2.png材料:○ 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*



http://img1.guokr.com/gkimage/yk/j6/ho/ykj6ho.png工具:● 烙铁
● 小剪刀
● 简易夹持爪,用来固定小物件
● 热熔胶枪
● 万用表



前提:[*]为了完成这篇教程,我现在假设你已经具备了基础的电子学、Arduino 和 Arduino 编程知识。[*]我只测试过 500 系列的 Roomba。但是,这方案应该可以应用在更新的型号上,不过比较旧的型号能不能适用就不太确定了。


2   Roomba 的串行接口http://img1.guokr.com/gkimage/dm/8c/xc/dm8cxc.png[*]所有的 500 系列 Roomba 都有串口。我们要利用这个串口来控制Roomba并获取 Roomba 的传感器数据。这个串口只不过是一个 7 引脚的位于中央的 Mini-DIN 插口。一般在本地的电子器件商店里花几块钱就能买到这些东西。

http://img1.guokr.com/gkimage/hd/47/i7/hd47i7.pnghttp://img1.guokr.com/gkimage/fb/wy/gh/fbwygh.pnghttp://img1.guokr.com/gkimage/ot/dv/0o/otdv0o.png[*]要使用串口时:把外壳拆下来,轻轻地把顶盖的后端拉开来,让后面的两个夹子松开。现在,用一把一字螺丝刀轻轻地把顶盖其余的部分也撬开来。插口就位于控制按钮的下面。

http://img1.guokr.com/gkimage/8u/ow/1o/8uow1o.png[*]你如果想要不把顶盖拆掉使用串口的话,可以在顶盖上钻一个孔。


3   制作连接电缆http://img1.guokr.com/gkimage/mu/x9/9c/mux99c.png[*]要和串口连接,最简单的方法就是通过一只 8 针的mini DIN 插头、一些排针,以及一小段 Cat5 电缆,来制作一根短电缆。

http://img1.guokr.com/gkimage/by/eq/hf/byeqhf.png[*]你可以使用 7 引脚的mini DIN插头替代 8 引脚插头,只要它中央是塑料的插头,而不是位于底部,即中央引脚没有连接在任何东西上面。从每一根单独的线头上剥掉一部分绝缘层。

http://img1.guokr.com/gkimage/mq/s2/d2/mqs2d2.png[*]如果你没有可以剥皮的剥线钳,那么可以绕着绝缘层轻轻地转动小剪刀,然后把它拉下来。

http://img1.guokr.com/gkimage/nf/4x/gq/nf4xgq.png[*]将这些线头焊接在迷你 DIN 插口上的小接头上是需要一点技巧的。用夹持爪把线头和迷你 DIN 插头固定住。你也可以在线头上包上一层折叠纸,避免被夹持爪夹出痕迹。从里到外逐步焊接。如果你正确地将线头焊在了接头上,那么就可以用吸锡器把接头外部多余的焊锡清理掉了。

http://img1.guokr.com/gkimage/p4/c1/sk/p4c1sk.png[*]把接头和每根线头的连接方式用一张图表记下来。

http://img1.guokr.com/gkimage/j9/pb/fy/j9pbfy.png[*]用万用表检查引脚之间是否存在短路。

http://img1.guokr.com/gkimage/h6/bq/qc/h6bqqc.png[*]这些针脚可能会略微弯到外面一点。将针脚插入 Roomba 的DIN座,重新将它们排列好。

http://img1.guokr.com/gkimage/fy/m4/wv/fym4wv.png[*]在每根线头之间滴上些热熔胶,让它们不会弯到一起发生短路。

http://img1.guokr.com/gkimage/1o/jo/dk/1ojodk.png[*]在所有的线头周围包上一层胶带,避免和外壳发生短路。重新把迷你 DIN 插头组装起来,但是在确认了一切运行正常之前,不要把迷你 DIN 的外壳装在引脚上面。这样一来,如果需要修改的话,会方便一些。

http://img1.guokr.com/gkimage/sw/ch/l9/swchl9.png[*]把线头的另一端包好。

http://img1.guokr.com/gkimage/ea/yf/sg/eayfsg.png[*]6 号和 7 号引脚(见下图)都接地;将它们连在同一个引脚上。1 号和 2 号引脚都接在正极上。

http://img1.guokr.com/gkimage/8u/mn/3i/8umn3i.png[*]这些引脚上的电压都是不同的。当插在电源插座上时,大约为 20V,否则就是电池的电压(大约 14V)。将它们都连接在同一个插头上。将剩下的线头连接到它们相应的插头上。


4   连接 Arduinohttp://img1.guokr.com/gkimage/r2/rv/kt/r2rvkt.png[*]将 WiFly 扩展板安装在 Arduino 上。

http://img1.guokr.com/gkimage/oj/02/vt/oj02vt.png[*]用电缆将迷你 DIN 插头连接在 Roomba 上,将排针插在面包板上。

http://img1.guokr.com/gkimage/js/o2/gd/jso2gd.png[*]参考你自己绘制的接线图表,进行本教程接下来的接线步骤。[*]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 之间的电缆!


5   完整的代码http://img1.guokr.com/gkimage/68/yu/9d/68yu9d.png[*]点击下载 本项目所使用的完整代码 。其中可能存在一点 bug,所以欢迎你在评论中提出改进的建议。[*]为了让它运作起来,你将需要将“TWITTER oAUTH KEY”替换成在“编程 3:发推”中所得到的 oAuth 密钥。接着我们只需要在 Credential.h 文件中设定好路由的密码和 SSID 就行了。现在,Arduino 应该就能够访问你的网络和推特帐号了。这段代码附上了详细的注释,所以你应该能够轻松修改其中的一些参数,其中包括 Roomba 在特定的事件发生时会发出什么样的信息。[*]如果你遇到了任何困难,那么就向下滚动到排错步骤,寻找帮助,也欢迎你直接和我联系。


6   编程6.1   编程1:通讯[*]和 Roomba 通讯实际上非常简单。Roomba 的串口使用 iRobot 的开放接口(OI)协议来和其他设备进行通讯(例如 Arduino)。OI 不仅可以提供对 Roomba 的电机和 LED 的控制,而且可以用Arduino来直接命令Roomba做清洁工作。要知道,给 Arduino 重写清洁程序毫无疑问要花掉几个小时。[*]不过,我们实际上会使用 Mike McCauley 编写的丰富的库 ,来和 Roomba 通过 OI 进行通讯。太谢谢你了,Mike!Mike 的库提供了 Roomba 的每一条基础 OI 命令。[*]在这里可以找到有关 iRobot的OI完整细节 。


6.2   编程 2:网络控制

http://img1.guokr.com/gkimage/rf/1p/q5/rf1pq5.png[*]在这一方面,我们可以在大多数情况下按照 WiFly 网络服务器的样例代码进行编写。样例代码给了我们所有需要的信息,唯独少了从网页浏览器读取请求。不过,这功能添加起来很容易。我们所需要做的只是用样例代码一个比特一个比特地读取请求,然后将它们排列成字符串。很简单吧?[*]困难的地方在于正确配置路由器。首先,我们需要告诉路由器,让它给 WiFly 扩展板一个静态的 IP 地址。不幸的是,由于所有的路由器都各不相同,我无法告诉你实际该怎么做。你需要查阅你的路由手册,了解如何指派手动的 IP 地址,除非你并不介意给别人留下控制你的 Roomba 的机会。这基本上是在局域网上控制,而不是因特网上。然而,如果你很清楚相关的安全风险(或者知道如何设置认证系统),那么大多数路由器都可以配置成指向 Arduino 网页服务器。同样,你需要查阅路由手册,了解该如何做。你也许可以用谷歌搜索相关教程。[*]要通过局域网控制 Roomba,你只要在浏览器的地址栏里输入给 WiFly 指派的 IP 地址,瞧,这不就得了!如果你确实将它连上了互联网,那么就可以在任何地方输入路由器的 IPv4 地址来访问它了,你可以 在这里找到自己的IP地址 。


6.3   编程 3:发推特http://img1.guokr.com/gkimage/rh/eq/h3/rheqh3.png[*]这一部分代码稍微比我一开始预想地更难一点。大部分给 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 位数。虽然它会重置,但我们也不需要担心会出现重复的推,因为完全相同的可能性微乎其微。



7   排错[*]在这一小部分中,我列出了我遇到的一些问题和解决方法。[*]WiFly 无法连接在 Credentials.h 文件中确认你的 SSID 和路由器密码; 如果你使用的是 WEP,那么试试将它改为 WPA/PSK+WPA2/PSK。[*]推特无法更新确认你的 oAuth 密钥是否正确(参见编程 3:发推); 检查你的焊点。[*]网页控制页面无法显示正确地信息检查你的焊点。[*]无法访问网页控制页面确认你使用的 IP 地址是正确的(参见编程 2:网络控制)。[*]如果上面这些解决方法都帮不了你,欢迎你直接和我联系。


8   总结我希望你喜欢我的教程,希望你能觉得它对你很有帮助!如果有任何问题或建议,请留言。欢迎你提出反馈信息。


9   DIYer签到处

资料来源
编辑:小蜂
果壳DIY站QQ群:132647923(加入时请报上你在果壳的个人主页地址,以防广告ID)果壳DIY站微博: http://t.sina.com.cn/guokrdiy
页: [1]
查看完整版本: 发个新鲜的:扫地机器人也发微博