查看文章 |
利用iPod touch控制乐高NXT机器人
2010-10-20 22:34
在编程方法课上,教授发给我们每个小组一套乐高机器人(LEGO MINDSTORM NXT),要求自行设计外形和程序以参加机器人相扑比赛。不过这些不是重点啊,因为比赛纯属娱乐,限制条件也太多。我感兴趣的是机器人本身有蓝牙接口,这意味着可以通过蓝牙遥控机器人。 这套机器人的控制器安装的是lejos固件,因此是用java语言编写。参考了说明(http://lejos.sourceforge.net/nxt/nxj/tutorial/index.htm, 有中文版本)后,发现机器人本身的蓝牙接口非常易用,因此比较容易实现接收端的控制。难的地方是发射端,因为我用的是iPod touch。当然,如果你用手机控制那就另当别论,因为手机上有很好的java虚拟环境,蓝牙编程也相当容易。但是iPhone和iPod touch的蓝牙被苹果严重封锁,自带的API只能实现iOS系统间的通信。如果真想完全控制蓝牙,则必须加入苹果的附件开发计划,当前对我来说当然不可能。 因此唯一的方法就是找黑客了。幸运的是我找到了btstack(http://code.google.com/p/btstack/)。这个库当前还在开发,不过对iPhone和touch的蓝牙已经支持得很不错了。源代码中也有一些示例,如iPhone WiiMote。我在其中找到了一个控制乐高机器人的演示,不过我无法运行,而且也找不到机器人端的程序,因此也没法参考。下面我就说明一下如何实现用iPod touch控制乐高机器人的。 前提:越狱你的iOS设备,我用的是iPod touch 4G, iOS4.1 1. 首先下载源代码: svn checkout http://btstack.googlecode.com/svn/trunk/ btstack-read-only 注意这是google的说明,但是我运行后得不到源代码,显示无法链接。后来发现必须把http改成https。 2. 编译库,这个就不多解释了,你会得到一个libBTstack.a。但是我发现这样得到的库不能实现真机运行,显示架构不对。因此我建议的方法是在cydia里搜索btstack安装,然后用其它工具浏览你的iOS设备目录/usr/local/lib,里面有一个libBTstack.dylib,把这个加入你的项目就可以了。头文件在源代码的include目录下,包括方法参照示例程序。 ![]() 3. 加入rfcomm.c和rfcomm.h。因为NXT使用的是SPP协议,但是当前的btstack并不支持这种协议。幸好作者写了一个rfcomm的演示。我们可以用rfcomm来模拟spp。注意这个rfcomm.c不能直接用,需要稍作修改。你可以参考我的示例程序,并注意修改rfcomm中的mac地址为你的NXT的地址。 4. 下面我就简要说一下原理: 先用bt.open()打开iPod touch的蓝牙接口; bt_register_packet_handler(packet_handler_x) 注册包的回调函数; bt_send_cmd(&btstack_set_power_mode,HCI_POWER_ON) 打开HCI; 这个时候iPod touch就会搜索NXT了,搜索到以后通过回调函数通知主程序; 此时需要先发送两字节。我也不知道为什么,因为NXT端会忽略前两字节(或者说这两字节有其它用处?)。对这两个字节的内容好像也没有什么限制,只是最好不要取零。像这样是可以的: uint8_t data[2]={0xff,0xff}; _bt_rfcomm_send_uih_data(source_cid, 1, RFCOMM_CHANNEL_ID, data, 2); 这以后NXT就会响应iPod touch发送的数据了。 5. 至于怎么控制就全看各位的了。我这里有示例程序,控制两个马达和一个铲子,马达是左B右A, 铲子是C。可以先试试看。 备注:想真机调试程序又不想付钱的,看这里:http://azacode.wordpress.com/2010/06/06/debug-iphone-apps-on-jailbroken-iphone-3g-with-xcode-3-2-2-another-safe-keeping/ ![]() ![]() 源文件在这里: www.comp.nus.edu.sg/~xiangyun/documents/NXT/NXT-Remote.zip 我录制了一段演示视频。因为百度不允许外链视频,请点击下面的链接观看: www.comp.nus.edu.sg/~xiangyun/documents/NXT/NXT-Remote.MP4 |
最近读者:




