用Android控制Arduino小车
本文发表于《中国信息技术教育》杂志,作者:温州中学谢作如,南京师范大学刘正云用Arduino做一辆小车,原本是一个入门的项目,很多人都做过。但是,这辆小车如果能用Android手机或者平板来控制,无疑就有趣多了。在MIT的App Inventor帮助下,编写Android系统上的App程序,也能够以搭积木的形式完成。同样,Arduino方面的代码,也能够采用一款图形化的编程插件——ArduBlock来编写。用Android控制Arduino小车,就成为一个技术门槛很低,却非常具有挑战性的综合性任务了。
一、项目描述
本项目指设计一辆能够通过Android手机控制的小车,小车控制板采用开源硬件Arduino。通过手机屏幕或者手机的重力传感器,能控制小车的前进、后退、左转、右转、原地转等各种功能。本项目的难度设计为小学生都能完成,所以小车的程序我们选择用ArduBlock编写,手机的程序由App Inventor编写。
因为Arduino机器人的形式很多,如智能灯、机械臂,人形机器人等等,所以这个项目具有一定的可扩展性,还可以实现更多的功能。
二、通讯分析
Android手机和Arduino小车的通讯方式很多,但是蓝牙方式无疑是最简单、最方便的选择,因为蓝牙已经成为Android手机的标配。App Inventor中有蓝牙的编程模块,能实现通过蓝牙来读取和发送数据。大部分的Arduino控制板,都预设了蓝牙模块的接口,而蓝牙模块的价格也相对低廉,淘宝上随处可买。
手机控制小车的程序设计分为手机程序和小车程序,即上位机与下位机两个部分。手机(上位机)部分通过手机自带的蓝牙发送控制命令,如前进、后退、左右转等。小车(下位机)部分则根据蓝牙模块(串口)收到的命令,做出相应的动作。具体的通讯过程如图1所示。
图1 手机和小车通讯示意图
在这个项目中,设计手机和小车的通讯数据格式是关键,即手机发送的数据分别代表什么命令。考虑到我们使用的ArduBlock教育版只能获取串口数据中的数字,所以我们设计了下面的通讯协议,分别定义了数据和命令对应关系,如表1。
表1 通讯协议表
三、Arduino小车搭建和程序设计
(一)硬件搭建
我们选择了DFrobot公司的RoMeo V1和MiniQ小车底盘,这是我们设计的开源课程《Arduino创意机器人》中使用的机器人套件,如图2。《Arduino创意机器人》课程是国内第一个完全开源的STEM课程,所有的教学资源,如微视频、电子教材、教学设计等都能在网上下载,关于小车的搭建步骤详见我们的课程资源,这里不再叙述。
图2 Arduino小车
《Arduino创意机器人》课程资源下载地址:http://pan.baidu.com/s/1qWFJ0EK
一般而言,蓝牙模块有四条线需要和Arduino连接,分别为5V、GND、TX和RX。5V和GND要和Arduino上的5V和GND一一对应,但是RX接在Arduino的TX上,TX要接在Arduino的RX上。因为我们选择的蓝牙模块也DFrobot公司的,小车使用的控制板为RoMeo V1,上面已经集成了蓝牙模块接口,插上就可以直接使用,不用另外接线,如图3。
图3 插上蓝牙模块的Arduino小车
RoMeo V1上使用的模块为DF-BluetoothV3蓝牙串口模块 。
(二)程序编写
小车的程序比较简单,先将串口读取到的数值负值给变量a,再使用“如果”模块进行判断即可。这里的数值“1”、“2”、“3”、“4”、“9”分别根据通讯协议(数据和命令对应表)来设置小车的动作,具体代码见图4。
注意:
1.如果电机M1和M2为150时小车没有前进,反而转弯了,只要调整电机的接线即可。
2.如果用Arduino下载程序出现错误,请先把蓝牙模块取下,等下载成功后再插入。
图4 ArduBlock代码
(三)小车通讯测试
给小车下载程序后,应先做通讯协议方面的测试。这里的测试分为两步:
第一步:使用串口监视器测试。
先用Arduino的串口监视器,通过USB串口给小车发送1、2、3、4、9的数字,看小车是否能做出相应的动作。别忘了要把小车的轮子悬空哦!
第二步:使用手机蓝牙串口工具测试。
如果你的电脑有蓝牙适配器,可以试着连接Arduino的蓝牙模块,然后通过串口监视器发送数据,如果成功,就说明蓝牙模块工作正常。当然也可以直接跳过这一步,直接用手机的蓝牙连接,用“蓝牙串口助手”发送数据来测试。
一般来说,如果第一步测试通过而第二步没有成功,请检查蓝牙模块的波特率。ArduBlock使用的串口波特率是9600,蓝牙模块的波特率也要设置为9600才能正常通讯(DFRobot的蓝牙模块默认波特率就是9600)。蓝牙模块的波特率可以通过AT命令来设置,请查阅技术文档或者询问蓝牙产品的技术人员。总之,蓝牙的波特率要和代码中一致才可以正常通讯。
注意:如果使用DFRobot的V7扩展板,一定要记着把板子上的小开关扳到“RUN”一档!
四、Android程序设计
(一)App界面设计
App Inventor分为在线版和离线版两种,二者在使用上没有什么区别。如果网络够快,就用在线版吧。不过如果是大班教学,应该要自己搭建一个离线版的服务器。
控制Arduino小车的App软件在编写上并不难。我们在界面设计上并没有花多大功夫,主要还是侧重于其功能实现,如图5。
图5App的界面设计和控件
App中添加的控件如下:
Button(上、下、左、右箭头以及stop按键):按键,按下后通过蓝牙发送相应的数字;
ListPicker(Select Device):按下它,会访问到一个列表,用来存储蓝牙信息;
HorizontalArrangement/VerticalArrangement:用于排版,使页面整齐美观;
BluetoothClient:蓝牙连接客户端控件,主要用于配对蓝牙,连接以及通信;
Notifier:警示窗口,当软件运行出现意外时,会提示相关信息,以避免程序崩溃。
(二)App功能实现
1.连接蓝牙
点击Select Device时,应该出现选择蓝牙设备的界面,如图6。
图6 蓝牙设备列表
选择ListPicker1控件的BeforePicking事件,编写如下代码,如图7。
图7 App代码
需要说明的是,图6中列出的是手机已经配对过的蓝牙设备。如果还没有配对,请先使用手机系统自带的蓝牙管理器来配对设备。
为了使App操作更加简洁,我们可以让选择设备后,手机就开始连接蓝牙,连接蓝牙的代码要写在ListPicker1控件的AfterPicking事件中,如图8。
图8 App代码
2.发送数据
App主要通过上下左右四个箭头控制小车前进、后退、左右转,通过stop键让小车停止,代码分别如图9。
图9 App代码
这样一来,按下不同的按钮,手机就会通过蓝牙发送不同的数据。虽然上述的代码并不是很完善,但是已经基本具备了上位机的功能。赶紧编译程序,安装到手机上试试吧。
四、拓展应用
这个手机控制小车的项目还是比较简单的,最大的不足是无法动态调速。当然,我们可以设计一个摇杆来发送更加复杂的数据给Arduino小车:如1200表示前进200,2100表示后退100等等。只要设计好通讯协议,编写代码并不困难。图10是我设计的一个用摇杆控制小车速度和方向的App界面。
图10 App界面
因为Android手机上有重力加速度传感器(AccelerometerSensor)和方向传感器(OrientationSensor)。如果利用这两个传感器来控制小车的方向和速度,项目的可玩性就更强了。当然,我们要设计的通讯协议也要复杂起来了。
五、总结
在这个项目的基础上,我们还可以实现很多其他的功能,比如解决单独使用语音模块控制小车声音干扰的问题,制作出无线控制的语音识别模块,或者是直接调用Google的语音库,制作出手机语音控制的机器人小车......不要小看图形化编程软件,App Inventor和ArduBlock已经足够强大了,赶紧动手吧!
写的好详细哦,但是图片都在哪里...是呗滤掉了吗? 来支持下小云,哈哈~ 能有个视频就好了 有视频可以分享吗
页:
[1]