基于安卓重力感应控制的智能小车设计 作者:高闻灿 指导教师:张涛 摘要:机器人在近几年越来越流行,而传统死板的控制方式已经逐渐不能满足要求。本文借助智能手机,提出了一种便捷、高效、通用性强的控制方式---基于安卓手机的多功能控制智能小车。系统由硬件和软件两部分构成,本文通过硬件和软件的全方位解析,详解介绍了通过安卓手机重力感应控制小车、模拟摇杆控制小车和坐标式指令控制小车的具体实现方案。 关键词:重力控制; 智能小车; 安卓手机 A design of smart-car that controlled with Android phone’s accelerometer Student: Gao Wencan Adviser: Zhang Tao Abstract:The robotics have become more and more popular recent year, but the tradition control mode of it can no longer meet the demand because its rigidity and inadequate interchangeability. This paper proposes a Convenient, efficient and universal control mode based on Android phone to control the smartcar. The system consists of hardware and software systems. This paper analyses the systematic solutions from both hardware and software,and explain the how to build the system and control it in the way of accelerometer controls, analog controls and coordinate frame contrlos. Keywords: Accelerometer controls; Smartcar; Android phone; 智能小车,也叫作轮式机器人,我国的相关研究起步较晚,近几年发展较为迅速 [1] 。随着智能设备的普及和物联网的进步,人们已经不满足于现目前对于机器人和智能小车的控制方式,人们更倾向于利用现在的智能设备和互联网来实现对智能小车的多样化控制。利用智能手机的应用支持平台,可以让小车控制的通用性、互换性和人机交互更加强劲和友好。同时,无线通信技术的发展为远程和无线控制机器人以及智能小车提供了可能,可以通过 WIFI、蓝牙等非常成熟的技术手段来传递信号 [2] ,摆脱限制和束缚,随时随地的实现控制。 1 系统方案设计 在整个项目系统中,硬件作为基础设备,作为小车的框架、动力和控制核心。系统主要由智能车和手机端的软件两个部分组成,其中手机选择安卓系统的智能手机,在样机中使用了魅族 MX4 手机作为控制端,实现人机交互;智能车则以一片单片机为控制核心,电机、电机驱动和轮子构成移动机构,以充电电池作为动力源实现执行各种动作。 图 1 系统设计方案 安卓手机作为人机交互界面和控制端,本设计利用Google公司的App Inventor开发组件对软件进行编程,实现利用手机内置陀螺仪、蓝牙等硬件实现与智能车之间的通讯和控制。 智能小车本身也主要分为硬件和软件两部分。小车硬件主要由:单片机处理器、电机、电机驱动、电源、蓝牙模块几部分构成。 2 系统硬件设计 2.1 主控芯片 智能车系统最重要的环节是准确的接收来自手机控制端的命令,并根据命令去执行不同的动作。设计中使用了 Arduino 平台作为主控芯片,具有丰富的 I/O接口,内置 A/D 转换器,能够高效、可靠的完成控制任务。它是一款基于开放源代码的 USB 接口 Simple I/O 接口板(包括 12 通道数字 GPIO,4 通道 PWM 输出,6-8 通道 10bitADC 输入通道),并且具有使用类似Java,C语言的IDE集成开发环境 [3] 。下表是Arduino的控制板的相关参数。 表 1 Arduiono 板子参数说明表 项目 参数 核心处理器 ATmega328 工作电压 5V 输入电压(推荐) 7~12V 数字 I/O 脚口 14(其中 6 个提供 PWM 输出) 模拟输入脚口 6 I/O 直流电流 40mA 3.3V 输出脚电流 40mA 3.3V 脚直流电流 50mA 工作时钟 16MHz 2.2 无线通讯设计 手机对小车的控制需要摆脱有线的束缚,这就要求手机与智能车可以通过有效、可靠的无线通讯连接起来。市场上基本所有智能机都内置的无线 WIFI 和蓝牙两种方式。所以只需要在智能车上安装 WIFI 模块或者蓝牙模块,与智能手机互联通讯,即可实现远程的控制。蓝牙模块相对于 WIFI 模块来说,在近距离一对一通讯中更加稳定有效, 同时蓝牙具有体积小、功耗低、通过调频技术可消除其他无线设备的干扰建立临时性的对等连接速度快等优点 [4] 。本设计选用HC-06 串口蓝牙模块来实现小车与手机之间的通讯。 HC-06 是一个蓝牙串口模块,有 4 个引脚,分别是:VCC、GND、TX、RX。Arduino 与 HC-06 之间可以通过串口连接,由 Arduino 的 3.3V 输出引脚直接给蓝牙模块供电。整个蓝牙模块封装后,与单片机之间通讯完全遵守串口通讯协议。Arduino 只要监测串口数据,即可得到智能手机发送过来的指令,实现无线通讯。 图 2 HC-06 蓝牙模块 2.3 电机驱动 Arduino 控制板是无法对电机直接驱动,所以在硬件中需要电机驱动实现对电机的控制。本设计所使用的电机驱动是 L298 模块,它是 SGS 公司的产品,其中 15 市场上容易简单买的到一般是 15 脚的Multiwatt 封装的 L298N,内部包含了 4 通道逻辑驱动电路,可以便捷、轻松的驱动 2 路电机 [5] 。考虑到对小车模型的要求并不高,本设计使用一块驱动模块,电机两两并联的方式实现四路电机驱动。 2.4 小车硬件电路连接 在各部分硬件准备好后,需要对小车进行电路连接和组装并试验其可行性。小车由一块 7.4V 锂电池进行供电,L298N 板子上自带 5V 输出口,可以直接为Arduino 供电,具体电路图如图 3 所示。 图 3 小车电路图 3 系统软件设计 对机器人、智能车的控制方式有多种多样,但是不同产品之间的通用性和互换性比较差,当控制器出现了问题后想要找到替代品是非常麻烦的事情,甚至往往需要重新定制相应的控制器。实际上我们手上的智能手机就是一款高效、便捷和通用性强的控制器, 使用智能手机作为机器人的控制器,成本低廉、通用性好 [6] ,用户不需要特定的控制器和附加的硬件,只需要打开手机下载相应的App程式就可以对智能车机器人随心所欲的控制。考虑到智能车机器人在不同环境和应用下的使用,本项目充分利用了智能手机内置硬件的优势,对控制方式进行了多样化设计以适应不同场合、不同环境下的控制:用户不仅可以使用模拟摇杆控制小车的行进方向,还可以使用重力感应进行控制,增加了小车的易用性和控制的乐趣;另一方面,项目还设计了坐标式指令控制模式,只需要发送相应的坐标,就可以让小车自主运动到相应位置,这样自主式的运动也让智能车能够更好的在特定和复杂的环境下使用和发挥。 3.1 MIT App Inventor 编程环境 安卓手机的开源特性让程序编写更加方便,而Google 公司提供的 MIT App Inventor 更是为开发者提供了一套便捷、方便的图形化程序编写工具 [7] 。它是一款在谷歌浏览器下的云端开发工具,利用积木式的编程理念,让困难和乏味的编程变得轻松易懂,甚至没有很好编程基础的初学者都可以很快入门编写自己的程序,也被称为傻瓜化开发工具 [8] 。 图 4 App Inventor 开发界面(Designer 视图) 上图所示是 App Inventor 的开发界面,它主要分为两个窗口: “Designer”和“Blocks”。其中“Designer”用于软件界面的设计,“Blocks”用于软件程序具体实现的语句编程。 3.2 编程任务分析 根据设计要求,对手机控制端的要求有以下几个方面: ①能够实现与小车蓝牙配对,实现基本通讯,发送相关控制指令; ②通过不同按键可以进入三种控制模式,分别是摇杆、重力感应、坐标式控制; ③按键控制可以监测手机屏幕触点,根据触点的不同方位定义传输协议和信息,并通过蓝牙发送控制指令; ④重力控制模式可以根据内置陀螺仪监测手机翻转角、俯仰角状态,定义相应的变量阈值,并通过蓝牙发送相应控制指令; ⑤坐标指令发送式,能够通过窗口获取用户输入的坐标值,根据输入坐标值的不同,循环发送前进、后退、左转弯、右转弯等指令,直到小车运行到指定位置; 根据设计要求,手机软件程序可分为:初始化模块、手机蓝牙连接模块、摇杆控制模块、重力感应控制模块、坐标式控制模块五个部分。其中初始化模块用于检测手机陀螺仪、内置传感器等是否存在异常状态,将全局变量、内部定时器等初始化;手机蓝牙连接模块需要实现手机与小车的互联,同时需要对手机进行初始化检查,能够发现并告知用户手机蓝牙的状态,提醒用户打开蓝牙以正常工作。由于有 3 控制方式,程序在控制启动前要求用户对控制方式进行选择才可以开始操作,在选了任意一种控制方式后,可以进行相关操作,并随时可以返回并重新选择控制方式。根据这样的思路,程序的总体框如图 5 所示。 图 5 手机 App 程序流程图 3.3 初始化模块 初始化模块在整个程序中没有实质性作用,主要是对程序的可靠性和稳定性确保。其主要任务是:确认手机蓝牙是否打开,初始化全局变量,初始化定时器等。定时器的初始化设定包含定时间隔、定时时间和运行状态等,这些功能的实现和启动,均在“Blocks” 界面下进行简单的设置即可实现,具体程序如下: 图 6 初始化程序 3.4 蓝牙通讯模块 打开软件后,第一件事情就是要智能手机与小车的蓝牙设备进行配对,但是日常生活中,人们手中的智能手机通常有多个配对设备,这就需要用户手动选择对应的配对设备进行连接。因此在程序设置中,蓝牙连接的主要由“连接”和“设备列表”两个按键来实现,如图 7 所示。用户点击“设备列表”,在已配对的设备中选择需要连接的蓝牙设备,选择后,点击“连接”实现互联。 图 7 蓝牙连接界面 打开程序后,用户点击设备列表,这个时候软件要检测手机蓝牙是否打开。如果手机蓝牙没有打开,则提示用户“请打开蓝牙开关”,否则就断开蓝牙开关,因为这样才可以在已经连接好的状态下重新打开开关。“连接”按钮时用户按下后触发的事件,该按钮唯有用户选择后配对设备后,才变成可以点击的状态。点击“连接”按钮(When Connect. Click),系统开始连接蓝牙,考虑到连接蓝牙有等待过程,为了避免用户频繁操作导致程序奔溃,在点击后系统立刻弹出提示“已点击,请稍等”。下图是蓝牙连接前后界面的变化。 图 8 蓝牙连接前后界面变化 3.5 重力感应控制小车 手机内置陀螺仪可以感受 X、Y、Z 三轴的角速度、角加速度和转角。X 轴一般称为翻转角、Y 轴成为俯仰角,在手机中,常常用这两个参量来控制游戏中的前、后、左、右四个方位。X 轴和 Y 轴在手机水平放置的时候,其角度值都为 0°,在常规使用中,一般其角度都不会超过 90°。考虑到重力感应控制的灵敏度问题,在多次测量和试验中发现,把阈值设为20 是比较合适的。使用重力感应控制的思路是:监测内置陀螺仪翻转角和俯仰角的变化,当其 X 轴超过 20°或者 Y 轴超过 20°时根据具体的情况发送相关控制指令,具体流程图如下。 图 9 重力感应控制流程图 3.6 模拟摇杆控制 模拟摇杆对小车的控制相对于重力感应控制,可 以更加精确、灵敏。在一些复杂的应用环境中,摇杆 图 10 重力感应控制程序 无疑是最容易掌握和控制的操作方式。它的最大特点在于直观和准确的控制,向前推动摇杆,小车就前进;反之小车后退,非常符合操作习惯。本项目参考了游戏手柄中摇杆的模型以及用户的使用习惯,将摇杆简化为屏幕中心桌布上的绿色小球,如图 11 所示。用户可以通过拖拽或者点击小球周围屏幕以拉动小球偏离中心位置,模拟摇杆动作,实现对应的指令发送以及控制。 图 11 模拟摇杆控制界面 3.7 坐标指令控制 重力感应和摇杆式操作都是实时性的操控方式,它有这直观、方便和准确的特点,但有时操作者没有办法进行实时的操控,却又需要小车能够到达预定位置,这种情况前两种操作就不再合适了。为此,本项目为小车设计了坐标式指令控制,它是一种半自主式控制智能小车的方式,用户只需要输入预定的坐标点,小车即可自动移动的该位置,而不需要操作者的其他任何的干预和控制。 设计这种半自主式控制的方式主要通过 3 个定时器实现:一个负责前进和后退的 Y 方向定时器,一个负责左右的 X 方向定时器,一个负责转弯控制的转弯定时器。小车的运动完全依靠蓝牙串口接收的指令,根据指令进行运动。而每种方式的指令发送频率都是10 次/秒,故可以设置定时器的循环发送来实现坐标化和单位步数的设置。