搜索
bottom↓
回复: 52

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

  [复制链接]

出0入0汤圆

发表于 2012-8-10 20:28:57 | 显示全部楼层 |阅读模式
本帖最后由 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[0] + " Pitch:"+values[1] + " Roll:"+values[2]);

              yaw1=(int)values[0];

         byte[] pwms = new byte[4];

             if(values[2]>=0)

             { pwms[0]=1;

               pwms[2]=1;

               if(values[1]>=0)

                {pwms[3]=(byte)(int)(30+30*(values[1]/90));

                pwms[1]=(byte)(int)(60-pwms[3]);}

               else

               {pwms[1]=(byte)(int)(30+30*((-values[1])/90));

                pwms[3]=(byte)(int)(60-pwms[1]);}

             }

             else

             {pwms[0]=2;

             pwms[2]=2;

             if(values[1]>=0)

                {pwms[1]=(byte)(int)((30+30*(values[1]/90)));

                pwms[3]=(byte)(int)(60-pwms[1]);}

               else

               {pwms[3]=(byte)(int)(30+30*((-values[1])/90));

                pwms[1]=(byte)(int)(60-pwms[3]);}

             }

            pwms[1]=(byte)(int)((float)power/100*pwms[1]);

             pwms[3]=(byte)(int)((float)power/100*pwms[3]);

              Stringmessage;

                byte[] msgBuffer = new byte[6];            

                try {

                  outStream= btSocket.getOutputStream();


                 } catch (IOException e) {

                    e.printStackTrace();

                 }                     

                 msgBuffer[0] = 0;//(byte)(yaw1 >> 0 & 0xff);;

                 msgBuffer[1] = pwms[0];

                 msgBuffer[2]=pwms[1];

                 msgBuffer[3]=pwms[2];

                 msgBuffer[4]=pwms[3];

                 msgBuffer[5]=(byte)0xff;


                 try {

                        outStream.write(msgBuffer);


                 } catch (IOException e){

                    e.printStackTrace();

                 }

蓝牙部分编程详见代码包

蓝牙串口采用透传9600波特率,通信协议

格式 如下 第一位起始位0 第二位左电机旋转方向位0x010x02 第三位左电机转速位(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,而且还有许多现成的算法。这对于已经有智能手机的智能小车玩家来说是相当划算的。




           

            

  



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-8-10 20:50:41 | 显示全部楼层
牛B。。。。。。。。。。

出0入0汤圆

发表于 2012-8-10 20:57:56 | 显示全部楼层
果断收藏,看起来很好玩啊

出0入0汤圆

发表于 2012-8-10 21:01:01 | 显示全部楼层
顶                     

出0入0汤圆

发表于 2012-8-10 21:20:19 | 显示全部楼层
不错 牛........................................

出0入0汤圆

发表于 2012-8-10 22:19:30 | 显示全部楼层
这个有点意思,

出0入0汤圆

发表于 2012-8-10 22:26:53 | 显示全部楼层
代码没有细看
是不是 要重力感应控制车子前进和后退左右的?
还有什么其他方式吗?

出0入0汤圆

 楼主| 发表于 2012-8-10 22:39:46 | 显示全部楼层
nds_shenzhen 发表于 2012-8-10 22:26
代码没有细看
是不是 要重力感应控制车子前进和后退左右的?
还有什么其他方式吗?

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

出0入0汤圆

发表于 2012-8-10 23:16:15 | 显示全部楼层
有点意思,这玩意冒失还可以玩一下,哈哈,会不会很复杂呢,楼主强悍啊,佩服佩服

出0入0汤圆

 楼主| 发表于 2012-8-10 23:24:12 | 显示全部楼层
本帖最后由 mikeyaomikeyao 于 2012-8-10 23:25 编辑
sanliu85 发表于 2012-8-10 23:16
有点意思,这玩意冒失还可以玩一下,哈哈,会不会很复杂呢,楼主强悍啊,佩服佩服 ...


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出100入0汤圆

发表于 2012-8-10 23:39:59 | 显示全部楼层
强帖 mark

出0入0汤圆

发表于 2012-8-11 00:17:35 来自手机 | 显示全部楼层
看着很帅啊……
来自:amoBBS 阿莫电子论坛 Android客户端

出0入0汤圆

发表于 2012-8-11 10:04:57 | 显示全部楼层
收藏!!!!

出0入0汤圆

发表于 2012-8-11 10:46:10 来自手机 | 显示全部楼层
楼主好点子,哈哈!这个可以好好玩下

出0入0汤圆

发表于 2012-8-11 13:45:04 | 显示全部楼层
好东东!!顶起!


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

出0入0汤圆

 楼主| 发表于 2012-8-11 16:16:59 | 显示全部楼层
duxingkei 发表于 2012-8-11 13:45
好东东!!顶起!

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

出0入0汤圆

发表于 2012-8-12 09:01:19 | 显示全部楼层
mikeyaomikeyao 发表于 2012-8-11 16:16
我也想做这个的,给我爸关电视用,还想加上判断人是否睡着的算法。不过我对操作强电一直很恐惧,怕搞错悲 ...

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

出0入0汤圆

发表于 2012-8-12 11:32:16 | 显示全部楼层
牛人啊,这一直是我想做而没有做的,楼主太棒了!

出0入0汤圆

 楼主| 发表于 2012-8-15 21:13:09 | 显示全部楼层
自顶一下

出65入0汤圆

发表于 2012-8-15 22:58:01 来自手机 | 显示全部楼层
好东西,十个字的限制啊~

出0入0汤圆

发表于 2012-8-16 17:11:52 | 显示全部楼层
人才啊             !

出0入0汤圆

发表于 2012-8-30 15:18:19 | 显示全部楼层
强大啊
要多多学习了

出0入4汤圆

发表于 2012-8-30 23:52:38 | 显示全部楼层
请问楼主,有关android开发环境配置的问题!如你所说,
材料:

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

出0入0汤圆

 楼主| 发表于 2012-8-31 06:42:56 | 显示全部楼层
本帖最后由 mikeyaomikeyao 于 2012-8-31 06:47 编辑
D.lovers 发表于 2012-8-30 23:52
请问楼主,有关android开发环境配置的问题!如你所说,
材料:


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

出0入0汤圆

发表于 2012-8-31 07:52:30 | 显示全部楼层
呵呵,这个有点意思哦

出0入4汤圆

发表于 2012-9-1 00:20:21 | 显示全部楼层
mikeyaomikeyao 发表于 2012-8-31 06:42
是的,涉及到无线和传感器的程序必须在真机调试,把你的平板的应用程序选项中的USB调试打开,然后插到电 ...

不需要安装SDK吗?

出0入0汤圆

发表于 2012-9-1 01:58:00 | 显示全部楼层
l厉害呀,学习!

出0入0汤圆

发表于 2012-9-1 11:42:53 | 显示全部楼层
好玩的东西,比较关注蓝牙串口模块,可以用来扩展出来很多,可以用手机来控制一些家电,比如风扇

出0入0汤圆

 楼主| 发表于 2012-9-1 14:04:35 | 显示全部楼层
D.lovers 发表于 2012-9-1 00:20
不需要安装SDK吗?

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

出0入4汤圆

发表于 2012-9-3 15:18:39 | 显示全部楼层
安装完需要很长的时间,最难搞的是要在网安装

出0入4汤圆

发表于 2012-9-4 19:56:44 | 显示全部楼层
mikeyaomikeyao 发表于 2012-9-1 14:04
需要,全套配置都要走完,搜索“配置android开发环境”然后照做

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

出0入0汤圆

 楼主| 发表于 2012-9-7 22:57:05 | 显示全部楼层
本帖最后由 mikeyaomikeyao 于 2012-9-7 23:00 编辑
D.lovers 发表于 2012-9-4 19:56
楼主,现在按照那些步骤都安装不了adt和sdk,好像网站被和谐啦,是不是翻墙就可以安装啦 ...


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

出0入0汤圆

发表于 2012-9-7 23:15:23 | 显示全部楼层
牛X                  

出0入4汤圆

发表于 2012-9-11 19:20:49 | 显示全部楼层
mikeyaomikeyao 发表于 2012-9-7 22:57
其中有一个在eclipse里头在网的是搞不完,这时到google的一个网站下载一个文件压缩包,然后解压得到plugi ...

谢谢回复!

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

出0入0汤圆

发表于 2012-9-12 13:02:07 | 显示全部楼层
牛人啊!特别是那个蒙牛牌的车体特别有喜感~

出0入0汤圆

发表于 2012-9-15 09:29:28 | 显示全部楼层
如果配上车模的美观应该很有前途的

出0入0汤圆

发表于 2012-9-16 12:48:37 | 显示全部楼层
很有创意啊。

出0入0汤圆

发表于 2012-10-25 23:21:22 | 显示全部楼层
我早就想做了,就是没时间呐

出0入0汤圆

发表于 2013-1-4 19:00:11 | 显示全部楼层
能不能把硬件电路部分讲下啊,我也想做个

出0入0汤圆

发表于 2013-1-5 16:48:52 | 显示全部楼层
tt轮子做的小车 有没有速度环  
电机电压多少    车子跑起来快步   

出0入0汤圆

 楼主| 发表于 2013-1-8 16:56:54 | 显示全部楼层
number007cool 发表于 2013-1-5 16:48
tt轮子做的小车 有没有速度环  
电机电压多少    车子跑起来快步

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

出0入0汤圆

 楼主| 发表于 2013-1-8 16:59:01 | 显示全部楼层
thee521 发表于 2013-1-4 19:00
能不能把硬件电路部分讲下啊,我也想做个

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

出0入0汤圆

发表于 2013-1-23 16:02:00 | 显示全部楼层
mikeyaomikeyao 发表于 2013-1-8 16:59
硬件电路方面,就是一个51单片机的子系统,用四个引脚来控制298N然后驱动电机,串口两个脚接蓝牙串口,5v ...

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

出0入0汤圆

发表于 2013-1-30 11:17:27 | 显示全部楼层
唉,牛逼死了。感觉好遥远

出0入0汤圆

发表于 2013-1-31 18:54:55 | 显示全部楼层
标记,这个要认真学习

出0入0汤圆

 楼主| 发表于 2013-2-14 16:29:45 | 显示全部楼层
thee521 发表于 2013-1-23 16:02
我有个问题想请教一下。我现在自己做了一个小车。还加了一个转向的舵机。然后用51单片机软件模拟PWM来控 ...

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

出0入0汤圆

发表于 2013-2-20 16:34:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-9-5 17:11:29 | 显示全部楼层
真牛逼。。。。。。。。

出0入0汤圆

发表于 2013-10-19 09:22:21 | 显示全部楼层
标记下 回头整一个

出0入0汤圆

发表于 2013-12-10 09:54:59 | 显示全部楼层
哎呀,楼主,下载链接失效了

出0入0汤圆

发表于 2013-12-13 09:04:31 | 显示全部楼层
顶一个!

出0入50汤圆

发表于 2013-12-13 20:48:39 | 显示全部楼层
收藏。。谢谢楼主分享

出45入88汤圆

发表于 2013-12-26 17:57:43 | 显示全部楼层
来晚了,下载链接已经失效
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 18:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表