mikeyaomikeyao 发表于 2012-8-10 20:28:57

利用android手机空间姿态控制的遥控小车

本帖最后由 mikeyaomikeyao 于 2012-8-10 22:32 编辑

无聊的暑假,于是钻技术
之前用别人的蓝牙串口上位机做过一个用按钮控制的蓝牙小车见http://www.amobbs.com/thread-5484645-1-1.html
感觉用android手机的比51强百倍的cortex A8处理器的性能只发一个按钮指令实在可惜,于是自己写上位机程序,将通过蓝牙串口发送指令改为pwm的高电位值和电机旋转方向,在手机上取得手机的空间位置姿态yaw pitch 和roll然后把手机做成遥控车的手柄,利用空间位置来决定车的前进方向,转换成pwm信息再通过蓝牙串口发到小车。主要思路将传感和算法尽量放到手机上实现,其实用这个平台把手机装到车上利用手机超强的处理能力和齐全的传感器可以实现很多其他算法,先上视频http://v.youku.com/v_show/id_XNDM3NjQwNTU2.html
看过感兴趣的可以接下来读后面枯燥的文字。
材料:
编程环境eclipse加上android 的开发adt
上位机环境:htc G10 android系统版本2.3.7,处理器cortex A8架构1GHz,内存768MB
下位机环境:89c52单片机开发板
            BLK-MD-BC04-B蓝牙串口透传
            L298N两路电机驱动板
            两个螃蟹王国减速电机+车轮
            蒙牛酸奶盒一只、
             万向轮一只
            面包板一块
         杜邦线
            刀锋航模锂电11.1v 3s2200mah(动力电)
            配套电显(保护锂电之用)
            四节电池盒(信号电)
            
程序说明
手机和飞机中 Yaw Pitch Roll的说明

                              
当手机是这样放置时, Yaw PitchRoll与上图方向相同。

关于android中的传感器前辈已有详细介绍见:http://blog.csdn.net/a345017062/article/details/6459643
我这里利用了pitch来控制左右,roll来控制前进方向的前后。用了一个进度条来控制马力,主要代码:
private SensorEventListener mySensorEventListener = newSensorEventListener(){
      @Override
      public voidonAccuracyChanged(Sensor sensor, int accuracy) {//重写onAccuracyChanged方法,在此为空实现
      }
      @Override
      public voidonSensorChanged(SensorEvent event) {
            if(event.sensor.getType() == Sensor.TYPE_ORIENTATION){//判断是否为加速度传感器变化产生的数据
                float [] values = event.values;   //获得捕获的数据
                myText.setText("Yaw:" +values + " Pitch:"+values + " Roll:"+values);
            yaw1=(int)values;
         byte[] pwms = new byte;
             if(values>=0)
             { pwms=1;
               pwms=1;
               if(values>=0)
                {pwms=(byte)(int)(30+30*(values/90));
                pwms=(byte)(int)(60-pwms);}
               else
               {pwms=(byte)(int)(30+30*((-values)/90));
                pwms=(byte)(int)(60-pwms);}
             }
             else
             {pwms=2;
             pwms=2;
             if(values>=0)
                {pwms=(byte)(int)((30+30*(values/90)));
                pwms=(byte)(int)(60-pwms);}
               else
               {pwms=(byte)(int)(30+30*((-values)/90));
                pwms=(byte)(int)(60-pwms);}
             }
            pwms=(byte)(int)((float)power/100*pwms);
             pwms=(byte)(int)((float)power/100*pwms);
            Stringmessage;
                byte[] msgBuffer = new byte;            
                try {
                  outStream= btSocket.getOutputStream();

               } catch (IOException e) {
                  e.printStackTrace();
               }                     
               msgBuffer = 0;//(byte)(yaw1 >> 0 & 0xff);;
               msgBuffer = pwms;
               msgBuffer=pwms;
               msgBuffer=pwms;
               msgBuffer=pwms;
               msgBuffer=(byte)0xff;

               try {
                        outStream.write(msgBuffer);

               } catch (IOException e){
                  e.printStackTrace();
               }
蓝牙部分编程详见代码包
蓝牙串口采用透传9600波特率,通信协议
格式 如下 第一位起始位0 第二位左电机旋转方向位0x01或0x02 第三位左电机转速位(60为最大) 第四位右电机转向 第五位右电机转速位 第六位结束位0xff。例如 0x00 0x020x21 0x02 0x21 0xff代表以0x21的速度向前进。
下位机是典型的pwm调速程序在51上跑,大家应该都熟悉,详见代码包。
最后实现的还不错,不过对于串口协议的设计在解析上有一定的不合理,主要是图简单,有时会出错,但是因为发送每当手机移动时就会不停进行所以总体影响不大。
上位机http://kuai.xunlei.com/d/QHCLWVCODILO(需用配置好的android开发环境打开)
C51keil工程http://kuai.xunlei.com/d/QBEBREENMWIE
其实这种控制策略对于智能小车的启示不在于遥控,而在于智能,把智能手机绑在车上,就拥有了一个资源超强的处理平台,以及加速度计磁罗盘陀螺仪光强计等等传感器,还有800万象素的摄像头,各种视频硬件编解码器,wifi蓝牙连接,GPS,而且还有许多现成的算法。这对于已经有智能手机的智能小车玩家来说是相当划算的。



         
            



zhikai_wu 发表于 2012-8-10 20:50:41

牛B。。。。。。。。。。

jamie_zheng 发表于 2012-8-10 20:57:56

果断收藏,看起来很好玩啊{:biggrin:}

chenxujiaoyang 发表于 2012-8-10 21:01:01

顶                     

shangxf 发表于 2012-8-10 21:20:19

不错 牛........................................

kongzi 发表于 2012-8-10 22:19:30

这个有点意思,

nds_shenzhen 发表于 2012-8-10 22:26:53

代码没有细看
是不是 要重力感应控制车子前进和后退左右的?
还有什么其他方式吗?

mikeyaomikeyao 发表于 2012-8-10 22:39:46

nds_shenzhen 发表于 2012-8-10 22:26 static/image/common/back.gif
代码没有细看
是不是 要重力感应控制车子前进和后退左右的?
还有什么其他方式吗?


这里我也不知道是不是重力感应,反正是根据手机给出的姿态角来控制的,我还有按钮和虚拟摇杆的程序,但是都没有完善,最后写完这个因为很酷

sanliu85 发表于 2012-8-10 23:16:15

有点意思,这玩意冒失还可以玩一下,哈哈,会不会很复杂呢,楼主强悍啊,佩服佩服

mikeyaomikeyao 发表于 2012-8-10 23:24:12

本帖最后由 mikeyaomikeyao 于 2012-8-10 23:25 编辑

sanliu85 发表于 2012-8-10 23:16 static/image/common/back.gif
有点意思,这玩意冒失还可以玩一下,哈哈,会不会很复杂呢,楼主强悍啊,佩服佩服 ...

不复杂的,如果你只想玩,我的源码包的bin文件夹里头有apk安装文件可以装了就玩,而且android 开发环境的配置没有任何门槛,借助google一上午即可搞定,至于开发,如果从0开始写要有java的基础,如果移植改别人的源码基本上会C就可以
,这是我的第二个app,第一个是helloworld{:titter:} 这是打包好的apk

dong889 发表于 2012-8-10 23:39:59

强帖 mark

ShawnLinson 发表于 2012-8-11 00:17:35

看着很帅啊……
来自:amoBBS 阿莫电子论坛 Android客户端

l09046162 发表于 2012-8-11 10:04:57

收藏!!!!

Soul.art 发表于 2012-8-11 10:46:10

楼主好点子,哈哈!这个可以好好玩下

duxingkei 发表于 2012-8-11 13:45:04

好东东!!顶起!


我之前也想把蓝牙串口与手机的内部传感器结合起来,然后可以遥控很多的东东咯,比如家电,手机遥控电视机等等!
可惜没时间,只做了个简单的手机蓝牙遥控器控制插座-排插。

mikeyaomikeyao 发表于 2012-8-11 16:16:59

duxingkei 发表于 2012-8-11 13:45 static/image/common/back.gif
好东东!!顶起!



我也想做这个的,给我爸关电视用,还想加上判断人是否睡着的算法。不过我对操作强电一直很恐惧,怕搞错悲剧掉,不知你的排插如何用弱点控制强电的?

duxingkei 发表于 2012-8-12 09:01:19

mikeyaomikeyao 发表于 2012-8-11 16:16 static/image/common/back.gif
我也想做这个的,给我爸关电视用,还想加上判断人是否睡着的算法。不过我对操作强电一直很恐惧,怕搞错悲 ...

就是继电器啊,从而每一路插座都单独控制
控制电视的话用蓝牙串口收到手机的指令后转化为红外编码发送给电视机就可以了,难点在于红外载波发送,用单片机就可以实现;还需要解码原有的液晶电视遥控编码!

Gavin_Lee 发表于 2012-8-12 11:32:16

牛人啊,这一直是我想做而没有做的,楼主太棒了!

mikeyaomikeyao 发表于 2012-8-15 21:13:09

自顶一下

luweixuan 发表于 2012-8-15 22:58:01

好东西,十个字的限制啊~

ht3allenht 发表于 2012-8-16 17:11:52

人才啊             !

ggg123 发表于 2012-8-30 15:18:19

强大啊
要多多学习了

D.lovers 发表于 2012-8-30 23:52:38

请问楼主,有关android开发环境配置的问题!如你所说,
材料:

编程环境eclipse加上android 的开发adt,如果调试真机的话,也就是我有个android2.3的平板,也就是说就要安装eclipse和adt就可以在平板上调试软件?

mikeyaomikeyao 发表于 2012-8-31 06:42:56

本帖最后由 mikeyaomikeyao 于 2012-8-31 06:47 编辑

D.lovers 发表于 2012-8-30 23:52 static/image/common/back.gif
请问楼主,有关android开发环境配置的问题!如你所说,
材料:



是的,涉及到无线和传感器的程序必须在真机调试,把你的平板的应用程序选项中的USB调试打开,然后插到电脑上,在eclipse中对项目右键选择run as android application,然后就自动在机器上打开程序调试了。,当然要安装手机驱动程序,可以通过手机助手一类的东西安装,而且你的开发环境要确认已经可以启动虚拟机调试,如果这一切都不能用,你可以把APK发布出来拷到机器上调试的。

bbsview 发表于 2012-8-31 07:52:30

呵呵,这个有点意思哦

D.lovers 发表于 2012-9-1 00:20:21

mikeyaomikeyao 发表于 2012-8-31 06:42 static/image/common/back.gif
是的,涉及到无线和传感器的程序必须在真机调试,把你的平板的应用程序选项中的USB调试打开,然后插到电 ...

不需要安装SDK吗?

FutureDeveloper 发表于 2012-9-1 01:58:00

l厉害呀,学习!

john_8 发表于 2012-9-1 11:42:53

好玩的东西,比较关注蓝牙串口模块,可以用来扩展出来很多,可以用手机来控制一些家电,比如风扇

mikeyaomikeyao 发表于 2012-9-1 14:04:35

D.lovers 发表于 2012-9-1 00:20 static/image/common/back.gif
不需要安装SDK吗?

需要,全套配置都要走完,搜索“配置android开发环境”然后照做

D.lovers 发表于 2012-9-3 15:18:39

安装完需要很长的时间,最难搞的是要在网安装

D.lovers 发表于 2012-9-4 19:56:44

mikeyaomikeyao 发表于 2012-9-1 14:04 static/image/common/back.gif
需要,全套配置都要走完,搜索“配置android开发环境”然后照做

楼主,现在按照那些步骤都安装不了adt和sdk,好像网站被和谐啦,是不是翻墙就可以安装啦

mikeyaomikeyao 发表于 2012-9-7 22:57:05

本帖最后由 mikeyaomikeyao 于 2012-9-7 23:00 编辑

D.lovers 发表于 2012-9-4 19:56 static/image/common/back.gif
楼主,现在按照那些步骤都安装不了adt和sdk,好像网站被和谐啦,是不是翻墙就可以安装啦 ...

其中有一个在eclipse里头在网的是搞不完,这时到google的一个网站下载一个文件压缩包,然后解压得到plugin和feature两个文件,放到eclipse的对应文件夹里头即可,具体我再找一下。就是说有一种指南是带那个离线包地址的,我真的找不到了。反正肯定是有办法的,不行爬墙搞应该也可以(我在网爬墙好像也没搞定)。

kexiao 发表于 2012-9-7 23:15:23

牛X                  

D.lovers 发表于 2012-9-11 19:20:49

mikeyaomikeyao 发表于 2012-9-7 22:57 static/image/common/back.gif
其中有一个在eclipse里头在网的是搞不完,这时到google的一个网站下载一个文件压缩包,然后解压得到plugi ...

谢谢回复!

现在正在忙着学习python编程!有空找资料弄弄!

kxhlp 发表于 2012-9-12 13:02:07

牛人啊!特别是那个蒙牛牌的车体特别有喜感~

jasonchang 发表于 2012-9-15 09:29:28

如果配上车模的美观应该很有前途的

yufanl123 发表于 2012-9-16 12:48:37

很有创意啊。

betbet 发表于 2012-10-25 23:21:22

我早就想做了,就是没时间呐{:hug:}

thee521 发表于 2013-1-4 19:00:11

能不能把硬件电路部分讲下啊,我也想做个

number007cool 发表于 2013-1-5 16:48:52

tt轮子做的小车 有没有速度环
电机电压多少    车子跑起来快步   

mikeyaomikeyao 发表于 2013-1-8 16:56:54

number007cool 发表于 2013-1-5 16:48 static/image/common/back.gif
tt轮子做的小车 有没有速度环
电机电压多少    车子跑起来快步

没有速度环路,两个轮子的不对称性是用程序来修正的,使用航模的11v锂电时候跑的比较快

mikeyaomikeyao 发表于 2013-1-8 16:59:01

thee521 发表于 2013-1-4 19:00 static/image/common/back.gif
能不能把硬件电路部分讲下啊,我也想做个

硬件电路方面,就是一个51单片机的子系统,用四个引脚来控制298N然后驱动电机,串口两个脚接蓝牙串口,5v电源供单片机,11v电源供298N

thee521 发表于 2013-1-23 16:02:00

mikeyaomikeyao 发表于 2013-1-8 16:59 static/image/common/back.gif
硬件电路方面,就是一个51单片机的子系统,用四个引脚来控制298N然后驱动电机,串口两个脚接蓝牙串口,5v ...

我有个问题想请教一下。我现在自己做了一个小车。还加了一个转向的舵机。然后用51单片机软件模拟PWM来控制舵机,在电脑上用串口发送命令成功了,可连上蓝牙串口模块,我写的手机软件也能连接蓝牙模块成功。可舵机只听见很轻微的响一下,根本纹丝不动。我很郁闷。。怎么回事呢。 我在单片机的串口中断里switch定义好的字符的ascii码。然后上位机发送单个的字符。比如“L”,“R”等

我惯的女人 发表于 2013-1-30 11:17:27

唉,牛逼死了。感觉好遥远

bushiniu 发表于 2013-1-31 18:54:55

标记,这个要认真学习

mikeyaomikeyao 发表于 2013-2-14 16:29:45

thee521 发表于 2013-1-23 16:02 static/image/common/back.gif
我有个问题想请教一下。我现在自己做了一个小车。还加了一个转向的舵机。然后用51单片机软件模拟PWM来控 ...

是不是接收到的字符没有保存的原因,单片机应该写一些小车行进状态参数,然后根据接收到的命令改变状态参数,然后定时执行状态参数,这样命令才能被持续执行

lxliang09 发表于 2013-2-20 16:34:34

mark{:hug:}

iversonY 发表于 2013-9-5 17:11:29

真牛逼。。。。。。。。

-阿发- 发表于 2013-10-19 09:22:21

标记下 回头整一个

pplus 发表于 2013-12-10 09:54:59

哎呀,楼主,下载链接失效了

dengchengmi 发表于 2013-12-13 09:04:31

顶一个!

752438771 发表于 2013-12-13 20:48:39

收藏。。谢谢楼主分享

Edesigner. 发表于 2013-12-26 17:57:43

来晚了,下载链接已经失效
页: [1]
查看完整版本: 利用android手机空间姿态控制的遥控小车