蓝牙手机变身小车遥控器 (1)

上篇博客提到我企图把手机改造成小爱的遥控器,这几天终于有点眉目了。这个小车刚组装好的时候,我就接上电池试运行了一下,结果它在屋里一溜小跑,紧赶慢赶才没让它撞到东西。这就是决定做一个遥控器的原因。本着“变废为宝,物尽其能”的DIY精神,我打算利用现有的手机来改造。

说起变废为宝,老婆大人一定心情很惆怅。因为大多数情况下,我喜欢拆东西,在家里干的都是些“变宝为废”的事情。但这次绝对是废物利用。我的手机是HTC钻石2,这款手机的系统是Windows Mobile;优点是CPU强大,屏幕细腻;缺点是经常丢短信,漏电话。也就是说,这款手机作为一个手机,基本可以认为是废物点心。好,接下来开始我们的变废为宝之旅吧。

第一次做手机上的开发,这段时间真是颇费周折。下面是我尝试的几个方案,供大家参考:

最初我想用类似控制萝卜头的办法,使用蓝牙串口向PC发送数据,结果发现并不是所有蓝牙连接都具有虚拟端口的功能。可以查看蓝牙支持的功能,那个Serial Port就是乐高机器人用来通讯的。

HTC手机的蓝牙,不支持Serial Port通信

HTC手机的蓝牙,不支持Serial Port通信

第二个方案是改用手机的WIFI功能,在PC上搭建一个网页,通过URL Request的方式向PC发送数据,非常杯具的是WIFI可以向公网IP发数据,但是不能向局域网内的笔记本发数据。经验证,我放在博客主机上的测试页面可以收到数据,虽然最终也没有成功,不过也算是进了一步。

第三次尝试又用回蓝牙,发现在ActiveSync连接模式下,手机共享的是笔记本的网络资源,这样就可以向自身发送URL Request了。经测试,数据流可以走通。正在欢欣鼓舞的时候,发现一件更杯具的事情:不知道为什么,每发送五六条数据之后,手机就像死机了一样,必须休息几分钟之后才能继续发送。这要是用来当遥控器,小爱怕早就把电视撞烂了。

接下来的几天没有什么进展,非常郁闷,以至于我经常萌生一些邪念(例如把手机扔进马桶)。事实证明最痛苦的时候往往已经接近成功了。有一天我把URL Request换成Web Service做了一次尝试,神奇的发现手机调用Web Service居然又快又不会死机。接下来的事情只能用峰回路转来形容,Web Service再通过TCP/IP协议把数据转发到一个Socket端口,一个端口监听程序再把数据通过USB发给Arduino开发板。经过这么多热心的同志,终于把鸡毛信从手机送到电机了,看看数据流图(其中WebService服务器和笔记本逻辑上是独立的,物理上是同一台电脑):

手机遥控器的数据流图

手机遥控器的数据流图

不知道会不会被手机开发的业内人士们鄙视,不过我至少摸索了一条没人走过的曲折道路,整个流程一共需要写四个程序:
1,在手机上运行的小程序,我画了一个方向盘,用手指触摸的时候,会换算成电机速度发送给Web Service。
   开发环境是Windows Mobile 6.5,使用的语言是C#
2,Web Service程序,接受指令之后,通过TCP/IP的方式转发。使用的语言还是C#,服务器是IIS。
3,端口监听以及Arduino开发板通信的程序。一边通过监听Socket端口接受2发来的指令,一边把指令通过模拟的串口发送给Arduino开发板。使用的开发语言还是C#。
4,Aruino开发板程序,这部分是通过模拟的串口接受指令,转换成电机对应的占空比电流脉冲,从而控制小车的两个直流电机。开发环境是Arduino 0017,开发的语言怀疑是类Java(软件上面有一个咖啡杯的图标)

回头一看,发现自己真够啰嗦的,写了半天还没见到代码,赶紧给标题后面加了个“1”。先贴两个程序的截图吧,改天再把代码发上来。

手机上的程序截图

手机上的程序截图

端口监听及转发程序截图

端口监听及转发程序截图



对 “蓝牙手机变身小车遥控器 (1)” 的 37 条 评论

  1. dead_lee 说:

    不知道能否控制手機發送一些人耳聽不到的高頻或者低頻信號來控制它移動, 比如把你這個圓分成8份, 每份對應一個頻率.
    主要的目的是簡化整個結構, 以後你帶這這個玩意上馬路玩的時候, 應該不想背著筆記本吧

    • 多谢建议。
      音频的稳定性和可靠性比蓝牙差很多,控制不是那么方便。至于笔记本,按照我的计划,它会变成小爱的一部分。笔记本的显示屏会安装在小爱的胸口位置(确实是随身背着,不过是由可怜的小爱来背):)

  2. woang 说:

    我觉得能不能直接用WIFI来做呢???
    直接在本本上做个WEB页面,然后这台本本把连接共享出来,任何一个带WIFI的手机/电脑都可以通过这个页面的控制小车….

    • woang 说:

      这样的话,应该可以把WM部分的代码,以及蓝牙部分的代码去掉,而且各类手机/电脑都可以在同一环境下进行控制

    • 我的第二个尝试方案就是用WIFI
      当时我设想了很多好处,通用性肯定是一个优势,还有个好处是即使我在公司或者外地,也可以通过Web方式遥控小爱(配合将来的摄像头)
      事实上这个方案肯定是可行的,因为我在博客的服务器上做了个测试页面,可以收到遥控指令。

      之所以没选择有两个原因:
      1,在家里上网用ADSL+无线路由的方式,笔记本的IP地址是局域网的,WIFI和外网都无法连接。当然可以改用PPPoE直接拨号,不过家里的其他电脑就不方便上网了。
      2,假设笔记本获取了公网的IP,安全性就很重要了,必须加上严格的身份验证机制,否则的话小爱也许会被外部的人控制,变成家里的“卧底”

      所以我暂时还是用手机遥控吧 :)

      透露一下,其实手机遥控只是目前的备用方案,最终我会给小爱加上声控
      直接用语音下命令

      • woang 说:

        可以试试”花生壳”,这样可以得到一个域名,而且可以在路由上设置不同端口转到不同计算机上

        关于声控…我觉得,可以在你家到处装麦…嘿嘿…通过无线传到小爱上…

        • 嗯,用花生壳是个好办法,没试过,不知道这种动态域名解析速度如何
          比如重新拨ADSL以后,IP发生变化,多久以后域名解析能更新
          我猜想应该不会很快吧?

          关于控制,我还想加上人脸识别和手势识别
          哎呀,真是路漫漫啊。。。
          先专心把大架子搭起来再说 :)

          • 虾米1994 说:

            花生壳基本上都是在IP变化后的几秒内就能更欣赏吧

          • 忧郁飞花 说:

            电信现在有一个猫+无线路由的一体机,工作的时候是这样的:
            每台电脑先连接到这个一体机,有线或者无线都可以。连接完以后就是显示本地连接或者无线已连接上。
            接下去还不能用,每台电脑都要分别拨号以后才能上网。这样就是每台都需要拨号,但是用的却是同一个账号。。。还互不影响,分到的IP地址貌似还是不一样的。。

      • 幽鬼狼魂 说:

        我提示一下,你可以路由设置界面里做端口映射,你的内网机器就可以使用你的公网IP的端口号了。

  3. gad 说:

    进展不错,小爱都能走了.顶下.
    让小爱以后都背个本本.残忍了吧.
    她要一个脑袋,用本本会省事点吧.

  4. Tianyi 说:

    手机的WIFI功能,在国内不是禁用的吗?
    你用的什么手机啊

  5. dandan 说:

    请问在android上可否实现呢?

  6. android应该也可以,只要可以支持调用web service就可以
    web service是基于xml的,可以实现跨平台
    听说android可以用Eclipse开发

  7. ViewActive 说:

    前辈:
    我用的是htc p3700 系统是 多普达s900
    经试验,是可以通过蓝牙与PC通讯
    手机的设置方法是: 连接->蓝牙-> COM端口 ->新建发送端口 ->我选择的是COM9 (其他的没有全试验,4不行,跟GPS冲突)

    电脑是X200,内置蓝牙

  8. ydogg 说:

    第一步,第二步有点啰嗦?
    一般家里还有电脑,上面跑个SerProxy(见arduino网站,串口转TCP),
    不怕麻烦的话,自己写一个类似的也可。直接手机接wifi,走tcp连SerProxy控制即可。我就是这么干的。

    HTC手机都有加速度传感器,用重力感应做控制器,也很有趣。
    (关联SDK网上一搜便有,我试过,还能直接输出倾角信息,正好用来控制电机功率)

    • 多谢 :)

      有个问题,我的wifi好像隔一段时间不动,它就自动关闭了
      你的有这样的情况吗

      • 虾米1994 说:

        这个从WM的注册表里能改吧。。 老开着Wifi费电,所以长时间没有数据连接的话就断开吧。。

      • darkorigin 说:

        手机的WIFI功耗是个需要考虑的,蓝牙也是
        一般来说,很多安卓机器开WIFI,本来待机一天的,开WIFI待机时间至少缩短20%。 我说的还是在WIFI基本不用的情况下,持续流量状态。耗电更猛。

        其实,我觉得操纵还可以考虑更成熟的方案,比如用短信方式。 利用一个内嵌SIMM模块的板,通过读取短信内容解析后执行。

  9. 流浪的星星 说:

    好久没来了,持续关注中

  10. mkvtoavi 说:

    博主太有才了!崇拜中。。。。

  11. hgmas 说:

    背个电脑,残忍了点吧,其实可以考虑使用一款强大一些的嵌入式CPU的,有时间的话,深入研究下嵌入式还是蛮有趣的,呵呵
    关于通信方式,楼主可以考虑花生壳的DDNS,我现在用的就是,把DDNS用户名密码填入路由器,再在路由器里面做个端口映射就可以啦。服务器开个TCP端口,外部直接访问啊

  12. riabox 说:

    可以这样,手机用wifi连接家里无线路由,笔本也用wifi连接家里无线路由.

    笔记本写一个socket程序监听某端口.
    手机socket连接笔记本server端程序,发送命令。。。

    • 没错,这个方案可行,只有一个问题:
      当你想把小车带出门遛遛的时候,就没有wifi了 :D

      • darkorigin 说:

        路由其实不是问题,笔记本或者是安卓机器都具备软无线路由功能。
        不过用WIFI用在摇篮上,要考虑辐射控制,毕竟婴儿对于电磁辐射敏感度。。
        SO.还是少些为妙

  13. wood 说:

    你好 请问由机器通过蓝牙向手机反馈 发送数据这个可以实现吗?如果可以 手机上是不是得写个程序什么的?谢谢

    • 可以的,手机上必须有个接收程序才可以。目前这个四轴飞行器,我就是用Android的手机控制飞行器,飞行器的一些参数也可以通过蓝牙传回给手机做分析使用。最近私事比较多,还没有时间调四轴。等我把四轴调通了,会把这部分攻略都发出来。

    • darkorigin 说:

      用专业术语来说:蓝牙通讯应该属于全双工的,至少也是半双工
      说白了,常见的虚拟COM口方式的蓝牙,可以同时收发数据(全双工),即使不能全双工也能半双工(就是说可以类似对讲机,一方发完另一方发送)
      相互是不干扰的。

  14. pizzabad 说:

    按照你的“盗梦陀螺”攻略,已经把配件买了一半,板子还在路上。看果壳,无意进入了你的博客。其实还可以用另一个方法控制这玩意,在家里用vwmare或vbox虚拟机虚拟建立一个xendesktop虚拟桌面服务器,用主服务器虚拟一个xp系统或者其他的,然后用安卓手机安装xendesktop客户端(专门支持安卓),就可以直接登录这个虚拟系统,系统不占用手机的资源,把虚拟服务器投射到外网,这样可以进行外网控制,更主要的是他安全(目前为止还没有听说有可以入侵虚双层虚拟架构的方法,以后说不准),不用的时候远程关闭虚拟机,虚拟主机就用你的笔记本上,不过xendesktop虚拟主机需要支持cpu为酷睿i系列的电脑,还要在bois中开启VT-x选项,当然虚拟服务器系统还有其它的版本,用虚拟的系统控制你的小爱,也不用在手机上开发控制软件了(当然我还不会开发,自己也好好学学)。
    缺点,这样你就拔不掉笔记本控制小爱,因为他的大脑要求太高。。你可以考虑换掉笔记本,买一个二手服务器,当然cpu必须要支持tv-x虚拟化,我在淘宝上淘了淘,有一款服务器只要880,做你的小爱大脑。这样远程监控,放在家的时候还可以在平板电脑上用虚拟系统办公。
    希望你早点出安卓wifi控制的方法,蓝牙的点子我还在消化中。。。

发表评论

可以使用下列 XHTML 标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>