发 帖  
原厂入驻New
[文章]

基于51单片机的蓝牙小车手机端遥控的简单实现

2016-1-25 16:39:19  12639 单片机 蓝牙 安卓 android
分享
7
本帖最后由 lpstudy 于 2016-1-25 16:45 编辑

此帖子为昨天发的帖子https://bbs.elecfans.com/jishu_544143_1_1.html的后续版本,昨天已经实现了小车前进,后退,拐弯,获取小车信息,获取帮助等功能了。

昨天的程序有一个明显的问题,手机端按下前进按键后,小车会前进一段时间(命令可配置,上一篇文章中初始化配置为1000ms)。如果把时间调的很短,例如100ms,那么我们的手机端按键必须以小于100ms的间隔进行连续按键,才可以推动小车连续前进,而事实上,我们是达不到那么快的频率触发按键的。 这主要原因是我使用的蓝牙串口调试助手并没有带有按住按键,连续发送命令的功能。 它没有,我可以写呀。

今天花了一个上午,找到了一份android自带的蓝牙聊天源代码,其工程名字为bluetoothChat。 阅读了一下它的代码,然后加上我想要的按钮功能,给按钮加上按住连续命令的功能。当前我设置的是按住不丢以50ms的间隔连续发送命令。小车端设置的每一次按键的执行时间延迟为130ms。原来小车端使用100ms,手机端按住前进按键,小车的轮子运行10几秒大约有一两次停顿(按道理不应该,应为50ms远小于100ms了,但是估计由于蓝牙发送的,接收处理中间有一些突然的阻塞,导致问题),于是调整为新的130ms,这样手机端按住按键的时候,小车可以连续驱动,没有发现一点停顿。

今天主要说说手机端的代码(单片机端的代码就将100ms修改为130ms,其他没有作任何改动)
手机端使用的蓝牙demo工程: BluetoothChat
关于蓝牙搜索周边连接的代码,我一点没动
关于蓝牙通信的那一块代码,我一点没有动
主要修改了界面代码,以及按钮时间代码

界面代码中删除了旧的聊天的列表适配器,加入了新的按钮,新的EditText
给按钮增加了事件,同时需要完成按住按钮连续自动发送命令的功能
简单的界面如下:
手机端3.png
5个按钮用来控制小车的运转,下面的信息按钮用来向小车发送获取信息命令,小车将当前的状态反馈回来,并显示到“收到的数据”那个EditText中。 帮助按钮用来向小车发送帮助命令,小车返回其支持的命令列表,避免以后忘记了命令操作。下面的send按钮中也可以手动发送命令,而不是通过按钮发送,也就是说按钮发送的是定死的命令,下面的send可以发送任意的字符串。

关于连续发送命令的代码,使用的网上的一个代码,自己做了封装,此函数需要传递按钮的id,标题,以及要发送的消息
它就可以在用户按下按键不丢的时候,以每隔50ms的间隔发送message到小车端的蓝牙。
public void bindMutiplePressedButtonWithMessage(int buttonId, String title, final String message) {
            Button frontButton = (Button) finDVIewById(buttonId);
            frontButton.setText(title);


            frontButton.setOnTouchListener(new OnTouchListener(){
                    boolean longClicked = true;
            @Override  
            public boolean onTouch(View v, MotionEvent event)  
            {  
                   if(event.getAction() == MotionEvent.ACTION_DOWN) {  
                       longClicked = true;  
                       Thread t = new Thread(){  
                           @Override  
                           public void run(){  
                               super.run();  
                               while(longClicked)  
                               {  
                                   // Send the name of the connected device back to the UI Activity
                                   Message msg = mHandler.obtainMessage(BluetoothChat.MESSAGE_TOSEND);
                                   msg.obj = message;
                                       mHandler.sendMessage(msg);
                                   try{  
                                       Thread.sleep(50);  
                                   }catch(InterruptedException e){  
                                       e.printStackTrace();  
                                   }  
                               }  
                           }  
                       };  
                       t.start();  

                   } else if(event.getAction() == MotionEvent.ACTION_UP) {  
                       longClicked = false;  
                   }  
                return true;   

            }
        });  
        }


具体源代码见附件
蓝牙小车手机端可操作.zip (117.63 KB, 下载次数: 468 )



手机端2.png
手机端1.png
suluoyazzk 2016-1-25 22:00:30
楼主,您好,请问您会不会手机通过wifi控制
回复

举报

lpstudy 2016-1-26 21:11:19


suluoyazzk 发表于 2016-1-25 22:00
楼主,您好,请问您会不会手机通过wifi控制



I have not played with the microchip for years.  I didn't use wifi for control.
But in my opinion, it should be the same with bluetooth because they both use the serial port for communication.  Maybe the difficult part is to develop a wifi proram in android cellphone. Neverthelss, you can try it like me, to use a simple demo program and modify the source code for our use.
回复

举报

happyxiaohui007 2016-1-29 22:46:36
学写了,非常感谢
回复

举报

千若流沙 2016-4-12 21:51:06
借鉴了,谢谢楼主啊
回复

举报

王大锤 2016-5-12 21:55:06
你好,你做的那个蓝牙小车的手机控制端是不是只有HC05的蓝牙模块才可以使用,谢谢
回复

举报

lp***dy 2016-5-18 09:48:29


朴学者11111111 发表于 2016-5-12 21:55
你好,你做的那个蓝牙小车的手机控制端是不是只有HC05的蓝牙模块才可以使用,谢谢



个人认为只需要修改代码中的蓝牙对应的引脚就OK了。其他应该都差不多
回复

举报

一切****在即 2016-5-18 15:00:40
个人认为只需要修改代码中的蓝牙对应的引脚就OK了。其他应该都差不多
回复

举报

君问****期_ 2016-5-19 11:55:43
只有右轮能动啊
回复

举报

lpstudy 2016-5-25 11:59:11



第一条:
这个需要注意你的小车的车轮控制引脚与单片机I/O口的连接关系。
我为了方便将相应的I/O口定义了一下,你需要修改这些定义以适配你自己的单片机I/O口。
第二条:
下载Hex进入到小车内部,小车是不自动运转的。 我的c语言主程序是一个死循环,不断检测是否接收到串口命令。根据不同的命令执行不同的操作。 这个串口命令是通过蓝牙模块传递的。 手机安装蓝牙APK程序,然后手机和单片机的蓝牙模块连接, 手机按相应的按钮,单片机的蓝牙模块接收到手机发送的指令,然后发送到单片机串口,继而引起单片机串口中断。 单片机内部代码根据中断设置不同的指令,主main函数不断循环,发现有指令设置则执行相应的指令。
回复

举报

一只风筝 2016-5-25 13:51:09


lpstudy 发表于 2016-1-26 21:11
I have not played with the microchip for years.  I didn't use wifi for control.
But in my opinion, it should be the same with bluetooth because they both use the serial port for communication.  Maybe the difficult part is to develop a wifi proram in android cellphone. Neverthelss, you can try it l ...



thanks,i  try to use wifi for control.
回复

举报

黎明 2016-5-28 23:32:41
很好!很不错!
回复

举报

风的轨迹 2016-8-28 20:01:23
哈哈,先看下,一会再来评价
回复

举报

zb1992113 2016-9-17 16:54:15
感谢楼主楼护照
回复

举报

风马少年 2016-10-24 19:46:29
使用这个蓝牙控制软件在给单片机烧录的代码里控制代码该如何填写?楼主可有PWM控制的方法?
回复

举报

Boosxxx 2017-3-1 15:13:28


lpstudy 发表于 2016-1-26 21:11
I have not played with the microchip for years.  I didn't use wifi for control.
But in my opinion, it should be the same with bluetooth because they both use the serial port for communication.  Maybe the difficult part is to develop a wifi proram in android cellphone. Neverthelss, you can try it l ...



你这 b装的  哎呦
回复

举报

lpstudy 2017-3-2 09:43:31


风马少年 发表于 2016-10-24 19:46
使用这个蓝牙控制软件在给单片机烧录的代码里控制代码该如何填写?楼主可有PWM控制的方法?



手机蓝牙仅仅将命令发送给单片机, 单片机收到命令以后,执行命令。
例如我的里面F命令就是前进的意思。单片机收到字符F,就会启动轮子前进。
PWM的控制很简单呀,一个使能引脚,一个轮子的两个电平,一高一低就会转动,可正转动,可反转。
回复

举报

lpstudy 2017-3-2 09:44:33


Boosxxx 发表于 2017-3-1 15:13
你这 b装的  哎呦



哈哈,并没有装逼之意。 分享是美德,只希望能给大家一些帮助。
回复

举报

郭诚 2017-3-12 19:22:27
楼主我的蓝牙模块是HC06   我也是两个L298N模块控制四个轮子,两个驱动的IN口都接得P2口   EN都接的最小系统的5V  但是我下载你的程序用你的软件 最终控制不了小车动作  我是不是需要更改程序里面一些代码呢
回复

举报

郭诚 2017-3-12 19:23:37
我是刚刚开始自学单片机  还没学到程序这一块  但是小车已经照着你的帖子都安装接线完成了   希望楼主能帮忙看一下
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
12下一页
发文章
关闭

站长推荐 上一条 /8 下一条

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