文章编号:1671—4598(2015)04—1175—04中图分类号:TP311 文献标识码:A 基于安卓手机的无线重力感应控制智能小车 林明标,莫金海 (桂林电子科技大学机电工程学院,广西桂林541004) 摘要:无线智能小车不仅在侦查、防爆、防辐射等特殊危险环境中应用广泛,在玩具行业也有很大的应用前景;安卓智能终端在全 球拥有很大的市场占有率,通过对安卓手机的重力感应器、蓝牙和小车蓝牙模块HC06、电机驱动模块L298N、单片机等硬件平台进行 详细设计和分析,实现了一种新型无线控制智能小车的方法,与传统的遥控器相比,设计的软硬件更为方便和灵活,软件经过不同手机 测试,界面和功能都具有良好的适用性和准确性,体验感也较强,具有一定的实用性。 关键词:安卓手机;HC06;AT89S52;L298N WirelessAccelerometerSensorControlSmartCarBasedonAndroidMobile Lin Mingbiao,MoJinhai (GuilinUniversityofElectronicTechnology,Guilin 541004,China) Abstract:Wirelesssmartcaris notonlyhavebeenwidelyusedin specialdangerousenvironmentsuchas investigation.explosion— proof,radiationprotectionetc,butalsoit hasbroadapplicationprospectinthetoyindustry.Androidintelligentterminalhasalargemarket shareinthewholeworld.Thepapertakesextensivedesignandanalysis throughhardwareplatformwhichincludingaccelerometersensorof Androidmobile.B1uetoothandgluetoothmodule—HC06,motordrivemodule--L298NandSCM;thearticlerealizesanewmethodofwire一 1esscontrolsmartcar.Comparedwiththetraditionalremotecontroller,thedesignofhardwareandsoftwareiS moreconvenientandflexible; theinterfaceandfunctionofthesoftwarehasgoodapplicabilityandaccuracythroughtesting ondifferentmobile phone,aswellashasgood feeling ofexperience,ithascertainpracticality. Keywords:Androidmobile;HC06;AT89S52;I,298N 引言传统的遥控玩具一般都是一种玩具对应一个遥控器,同一 个厂家不同的玩具也没有通用的遥控器;如今安装有谷歌公司 安卓系统的智能手机在全球拥有广泛的市场比例,从低端到高 端一般都自带集成有重力感应器(也称加速度感应器)和蓝 牙,加上安卓系统本身的开源性,为广大的开发人员提供了极 大的便捷;文章正是利用安卓智能手机的重力感应器和蓝牙硬 件开发出兼容性较强的应用程序,只要安卓手机安装了该 APP再连接上小车上的蓝牙模块就可以实现对小车的实时 控制。 1设计总体方案 软件是用Java编程语言实现的,在集成开发软件Eclipse 中开发,安卓软件的开发还需要安装安卓的ADT包,如果需 要用到安卓的模拟器则需要再下载相关文件,鉴于模拟器启动 慢,这里直接采用USB数据线连接真机调试,效果更佳;控 制软件主要是对安卓手机硬件进行编程,包括重力感应器和蓝 牙,先取得重力感应器反映手机相对于水平位置的xyz数据, 把这些数据处理以后通过手机蓝牙发送给小车上的蓝牙模块 HC06进行通信,另一种控制方法是用按钮代替重力感应器处 收稿日期:2014一07一01;修回日期:2014—08—22。 作者简介:林明标(1988一),男,福建龙岩人,工学硕士,主要从事嵌 入式系统应用方向的研究; 莫金海(1963一),男,广西自治区人,高级工程师,博士,主要从事电 力电子及工业自动化等方向的研究。 理后的控制指令直接通过蓝牙发送出去;下位机硬件部分以单 片机为核心,HC06蓝牙模块接收到数据以后通过单片机的串 行口输入。根据控制信号的意图决定驱动模块L298N的控制 信号,进而控制4个电机的转动方向,系统总体设计如图l 所示。 AT89S52单片机 图1系统总体设计框图 2硬件设计 2.1单片机最小系统及外围电路 虽然安卓手机端需要处理大量重力感应器的数据,但是这 些数据经过处理以后发送给HC06蓝牙模块的数据量并不大, 因此用单片机处理绰绰有余,设计采用的是ATMEL公司的 AT89S52芯片,AT89S52是一种低功耗、高性能CMOS8位 微控制器,具有8K系统可编程Flash存储器[【-。最小系统复 位电路如图2单片机最小系统及外围电路所示,时钟信号采用 的是内部振荡的方式,晶振选用12MHz,单片机RXD、TXD 分别接HC06蓝牙转串口模块的TXD、RXD引脚,注意交叉 连接确保通信正常,P0口低四位与电机驱动模块L298N的 INT0、INT2、INT3、INT4连接,用于单片机接收到HC06 蓝牙模块的控制信号后给电机驱动模块逻辑电平以控制各个电 万方数据 i176计算机测量与控制 第23卷 机的转向。 4个电机往同一方向转动,左右转弯时其中一边不转,另外一 cl 侧的电机往同方向转即可,具体逻辑功能如表1所示。 3。出上也 ’xTALl P0.0/AI)0 22 pINl izI旱盏十 P0.1/ADl 豳IN2PO.2/AD2 XTAL2 PO.3/AD3 PO.4/AB4PO.5/AD5 PO.6/^D6整RST PO.7/AD7 32 P2.O/A821 VI’c 29两两P2,3/ADIl C330 ALE PZ.4/矗D12 3l丽P2.5/ADl3 P3.1TXDll .4一P3.4/TO15 单片机最小系统及外围电路图2.2电源模块 硬件需要供电的模块包括,单片机、驱动模块、蓝牙模 块,另外4个电机如果在驱动模块板内取电,电机转速不足, 驱动模块L298N有两输入电压能为电机提过独立供电。设计 的电源是用5节3.7V的可充电锂电池组合解决的,其中2节 电池串联后经过7805稳压输出5V电压,作为蓝牙模块、单 片机和驱动模块芯片供电,再用其余的3节电池串联与驱动模 块的VCC相连接,即为电机提供的独立驱动电压。 2.3驱动模块 L298N是SGS公司的产品,内部包含4通道逻辑驱动电 路r2]。是一种二相和四相电机的专用驱动器,接收标准TTL 逻辑电平信号,可驱动46V、2A以下的电机,内部电路如图 3所示。 INIVSS{- D1 D2 D3 D4 —N2VS N4N3 00UTUT2l R1 一UMIS酬A D5D6 D7 .D8 GNDISEICB I。298N电路图VCC电压范围为+2.5~46V。输出电流可达2.5A,可 驱动电感性负载;当用三节电池11.1v作为VCC时电机转速 适当,ENA和ENB接高电平5V,INI~IN4接单片机Po口 的低四位,用于接收逻辑电平控制信号,OUTl~OUT4接两 组电机,左右4个电机,同一侧的连在一块,当前进的时候, 1.298N逻辑功能表IN4IN3IN2INl Po口应置值 电机状态 小车状态 0x0A反转 后退 0x04左电机正转右电机停止 右转 0x01左电机停止右电机正转 左转 0x00左、右电机停止 停止 2.4蓝牙模块 蓝牙模块HC06是一个从机模块,用到4个引脚,VCC、 GND、RXD和TXD,VCC谈5V,RXD和TXD分别和单片 机的串口引脚交叉相连,模块默认波特率9600波特,该模块 支持用串口软件发送AT+波特率进行修改,不建议使用 115200以上的波特率,信号的干扰会使系统变得不稳定,单 片机编程时可根据此波特率和晶振振荡频率算出时间常数;模 块上电以后指示灯会不断闪烁等待别的蓝牙连接,待连接上之 后指示灯变为常亮。 3软件设计 3.1单片机软件设计 单片机软件设计流程如图4所示,单片机初始化的时候需 要根据蓝牙模块的波特率算出初值,各端口初始化之后,程序 不断检测串口,当接收到的字符分别是Q、H、Z、Y、T时分 别将P0口的置值Ox05、0xOA、0x04、0x01、Ox00,驱动模块 接收到Po口的值后驱动电机使小车实现各种动作。 单片机程序流程图图5安卓上位机流程图 3.2手机上位机软件设计 3.2.1 安卓系统和重力感应技术 Android是基于I,inux2.6系统为核心的开源手机操作系 统],允许第三方软件自由加人。有利于开发人员理解平台框 架,降低移动终端设备的价格,同时也便于软件的开发、升级 和维护1。 设计采用的Android版本是4.0.3编译,重力感应在手机 游戏方面应用广泛,如今应用在实体玩具中将会有更大的吸引 力;重力感应技术是利用压电效应的原理来工作的。所谓压电 万方数据 1177效应是指:对于不存在对称中心的异极晶体,加在晶体上的外 力除了使晶体发生变形以外,还将改变晶体的极化状态,在晶 体的内部建立电场.这种由机械力作用使介质极化的现象就称 为“压电效应”L5。。 3.2.2 界面设计和手机蓝牙编程 为了方便控制,上位机界面以简洁为主为了方便控制,上 位机界面以简洁为主,小车所有的动作由软件上的按钮触发, 首先布局5个button按钮,用于控制小车运动状态.除此之 外,需要再加一个切换重力感应控制的按钮;上位机需要用到 蓝牙传送数据,因此需要一个按钮用于连接小车蓝牙;布置3 个textview用于显示重力感应器的xyz数据方便观察,这样 基本完成主要界面的设计。 上位机软件流程如图5所示,使用蓝牙设备进行通信.需 要完成4个步骤:蓝牙设置、蓝牙配对(可见和不可见)、蓝 牙连接和数据传输。蓝牙设置是指在蓝牙通信之前要确定设备 是否有蓝牙,如果不支持蓝牙则不能被使用,安卓开发中所有 涉及蓝牙的活动都要请求BluetoothAdapter来实现,调用其静 态方法getDefaultAdapter(),若返回null则表示设备不支持 蓝牙,确认有蓝牙后再调用isEnabled()方法来检查蓝牙当 前是否可用,呼叫startActivityForResuh()与ACTl0N— REQUEST—ENABLE的动作意图,以对话框的形式询问是 否打开蓝牙,代码实现如下: if(myBlueto。thAdapter一:null){ Toast.makeText(this,”本地设备不支持蓝牙!. Toast.LENGTH—LONG).show(); finish(); return;) elseif(!myBluetoothAdapter.isEnabled())( IntentenableBtIntent—newIntent(Bluetooth Adapter.ACTION—REQUEST—ENABI。E); startActivityFor Result(enableBtIntent.REQ UEST—ENABI。E—BT);} 蓝牙搜索和配对的目的主要是获得远程蓝牙设备的MAC 地址,设计并没有采用这一步,而是待HC06蓝牙模块上电以 后用手机先扫描周围可用的蓝牙设备,记录下HC06的MAC 地址,用字符串变量存储: privateStringCheBtAddress一”98:D3:31:B0:A D:E3”; MAC地址作为硬件的唯一地址.当按下界面上的“开 始”按钮时手机蓝牙便利用connect()方法直接连接到该 MAC地址的蓝牙设备,如果之前并没有实现配对,连接的时 候会自动重新配对,输入HC06模块的默认密码1234即可, 示例代码如下: CheBtDevice—myBluetoothAdapter.getRemote Device(CheBtAddress): try{ BluetoothSocket—CheBtDevice.createRfco mmSocketToServiceRecord(MY— UUlD); BluetoothSock— e1.connect ();Toast.makeText(getApplicationContext 成连接Hc一06”,Toast.LENGTH—IX)NG).show();即使配对以后也不能进行数据传送,只有连接成功以后才 可以,连接过程中还需要建立通信信道,必须用到蓝牙串口服 务的通用唯一识别码UUID,其值为“00001i01—0000—1000 —8000—00805F9834FB”,当客户端试图连接本设备,它将携 带一个UUID用来唯一标识它要连接的服务,UUID必须匹 配,连接才会被接受。 安卓软件里应用中使用蓝牙功能,需要有权限,因此要 在AndroidManifest.xml文件中声明蓝牙允许使用权限: 。 3.2.3重力感应器编程 通过对力敏感的传感器,感受手机重心的变化,用xyz 轴线加速度的数值反应出来,当手机水平正面放置时,水平方 向即为X轴,水平垂直于X轴为y轴,z轴垂直于XY平面; 当手机平放屏幕朝上时,xyz的值为(0,0,10),当X轴朝 向天空时,xyz的值位(10,0,0),Y轴朝地时,xyz的值 为(0,一lO。o),其他位置类推。 重力感应器的编程主要分为以下几个步骤:获取传感器管 理对象、得到传感器对象、注册传感器对象和传感器事件监 听。和蓝牙开发类似,安卓系统提供了SensorManager类来管 理重力感应传感器对象,Sensor类的对象是调用getDefauh— Sensor()方法获得的,利用registerListener(SensorEven— tI。istenerlistener,Sensorsensor,intrateUs)方法注册,第一 个参数是注册的监听器实例,第二个参数是指传感器对象,第 3个参数有几个选择,分别是SensorManager.SENSOR—DE— LAY—FASTEST、SensorManager. SENSOR—DELAY—GAME和SensorManager. SEN SOR—DEI.AY—NOMAL表示接收的频度,在监听程序中处 理相关数据和控制指令的发送。主要实现代码如下: mysensorManager=SensorManager)getSystemService(SEN SOR—SERVICE);//得到对象 mysensor mysensorManager.getDefaultSensor Sensor.TYPE ACCEI。EROMETER);//得到传感器 mysensorManager. registerI,istener mySensorEventI。istener,mysensor,SensorManager.SENSOR—DEI。AY—FASTEST);//注 册监听 3.2.4数据处理和指令发送 重力感应器的数据即使是接收频度最慢的情况下xyz的数 据变化还是极快的,在重力感应控制模式下指令发送频率不允 许太快,否则单片机还未处理好串口指令下一个指令又已经到 来。反复如此,小车并不能做动作,解决的办法是定时发送数 据,调用currentTimeMillis()方法获取当前的时间,与上次 取得时间比较,间隔达到200ms才发送控制指令,主要实现 代码如下: longcurrentUpdateTime System.currentTimeMimeMillis(): longtimeInterval—currentUpdateTime——lastUpd ateTime; if(timeInterval