【《基于STM32智能避障小车设计》13000字】_第1页
【《基于STM32智能避障小车设计》13000字】_第2页
【《基于STM32智能避障小车设计》13000字】_第3页
【《基于STM32智能避障小车设计》13000字】_第4页
【《基于STM32智能避障小车设计》13000字】_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于STM32智能避障小车设计摘要本次设计采用stm32和Android应用,来实现智能小车的三种不同的工作模式。这三种模式分别为:超声波云台避障模式、Android手机遥控模式、简易导航模式。接下来介绍系统硬件组成:MCU(stm32f103c8t6)作为主控芯片,负责与各模块通信。超声波模块HC-SR04+和舵机SG90,负责采集小车与周围的障碍物距离,再由MCU对数据分析,以此来实现小车的避障。经典的蓝牙模块(HC-05)为MCU与Android手机通信的桥梁。直流减速电机和电机驱动协助MCU驱动小车的行动。GPS模块和磁力计模块分别负责获取小车的地理位置信息、小车的车头的方向。简述了模块的职责,接下来,简单讲一下功能的实现思路及方法。(1)超声波避障模式:由超声波模块装在舵机SG90之上,并且舵机的初始状态为90。MCU会产生PWM信号,控制舵机和超声波采集正前方、左前方、以及右前方的路况信息。然后MCU分析采集的信息,让小车做出不同的行驶路径。(2)遥控模式:该功能采用蓝牙模块来为MCU与Android手机,建立通信网络。为了要遥控模式的实时性,为此蓝牙与MCU之间的串口通信,设为较高的中断优先级。上位机Android端,则采用简洁的UI界面,以及常见的经典蓝牙通信网络,蓝牙通信协议采用SPP协议。方向键被按时,小车会依照方向键的方向运动;当按键松开时,则会使小车停止运动。(3)简易导航模式:该模式主要分为两部分,第一部分是MCU端:下位机MCU在该模式下,主要负责将小车的经纬度通过蓝牙网络,发送给上位机Android应用,同时调节小车的车头朝向。第二部分则是Android端,应用内置高德地图,并调用高德地图API,进行路径规划与导航。导航时,采用定时器每秒更新地图,并将导航的摄像机角度发送给下位机。当小车距离目的地约为15m时,将会自动退回主界面,并发送指令是使小车停止运动。关键词:MCU;蓝牙通信;Android应用;高德地图;导航目录TOC\o"1-3"\h\u282001绪论 页共34页1绪论1.1研究背景与研究意义新冠疫情的发展,各大外卖平台开始提倡无接触送餐。针对这一应用需求,结合高德地图优秀的导航能力,本文设计关于stm32、蓝牙通信技术、以及GPS定位技术相结合的智能小车。系统主要由避障、蓝牙通信、以及上位机Android应用组成,蓝牙通信网络联通了下位机和上位机,下位机为上位机采集的GPS信息,Android端通过内嵌高德地图,并调用其API实现简单的导航。智能小车的导航功能,为外卖的无接触配送提供了可能,同时加快了运输领域的机器人发展。1.2国内外研究现状虽然在早期国内智能型工业机器人技术发展远落后于国外,但是在近几年,智能型工业机器人技术却取得了巨大的进步。早在2017年中旬,在中国人民大学,京东配送机器人就成功地完成了全球第一个单次配送服务,如图1-1。于2019年左右,有一视频关于京东的物流配送机器人。其内容为:路人询问配送的机器人“你的工资呢?”,配送机器人回答:“都用来充电了”。至此,京东自动化配送的机器人已经闻名于国内。除了京东的配送机器人,阿里的无人酒店“菲住布渴”,内部实现一键入住,全程无人工,由机器人“天猫精灵福袋”代替服务员,完成对客户的迎宾和指引,如图1-2。图1-1京东配送机器人图1-2“天猫精灵福袋”机器人国内发展虽然突飞猛进,从上图1-1所知,还是以轮式机器人为主,但是国外就不同了,国外已经步入了仿生态机器人。例如,Boston Dynamics公司研发的机器人Atlas,它被誉为“最有可能取代人类的机器人”,其外形类似于人类,能完成分腿跳、直空翻、倒立、原地360度空中转体等高难度动作,如图1-3。其下还有机器狗Spot,Spot不仅会仰卧起坐,还会为同类开门。如图1-4.图1-3Atlas空中360度转体图图1-4机器狗Spot为同类开门虽然国外的机器人在姿态方面非常的优秀,但是我国的机器人多数偏向于应用。例如:京东的一款配送式机器人,其内部都装配了高精度的激光雷达和道路全景视觉监控的防撞系统,保证了在道路上行驶的安全性,为了防止发生近距离碰撞,其前后两端都安装了超声波感应防撞系统,这些防撞系统保证了配送式机器人能够准确的感知所行驶道路上的环境变化。所以,国内和国外的机器人各有优点,只是研究方向不同。1.3研究内容与设计方案1.3.1主要研究内容本文以四驱的轮式自己动机器人(智能小车)作为下位机,上位机是用Java编写的Android应用,其内嵌高德地图。智能小车装有GPS定位模块,将获取的定位信息,通过蓝牙模块传输给上位机。开发上位机的主要目的是利用高德地图API,为小车进行路径规划以及实时导航,并将行驶方向等信息按照协议传递给小车,小车根据接收到的信息和自身配备的传感器,实现往目标点方向行驶。次要目的则是:在未有GPS信号及一些特殊情况下,可以使用手机进行模式切换、按键控制行驶。本文研究的内容如下:系统硬件设计该系统硬件部分采用Cotrex-M3架构低功耗、低成本的STM32作为微控制器,为了保证小车的稳定性和动力,采取四驱的机械结构。同时小车配备了实现逻辑控制功能和GPS定位功能的多个模块,以此实现了三大功能的智能小车硬件。系统上下位机软件设计系统的软件设计方面,分为两大部分。第一部分为微控制器端,主要负责控制小车行为、避障算法、GPS定位模块数据的解析、与Android上位机的通信、车头朝向信息等。第二部则是Android端的上位机,在Androidstudio平台上,使用JAVA语言来开发,通过调用高德地图API,实现地图显示、经纬度的路径规划以及实时导航,同时完成了小车模式的切换与按键控制与界面UI设计。系统上下位机的通信构建由于Android端需要按键控制、模式切换、导航的航向角等信息发送到小车端,并且小车端需要将自身的经度和纬度信息上传给Android移动端,所以两者之间的通信网络的构建是不可避免的。本次选择的通信桥梁为蓝牙通信,并选择合理的通信协议,以此确保小车的端和Android端数据通信的准确性。1.3.2总体设计方案与思路整个系统主要由五大功能模块组成:STM32F103C8T6最小系统模块、GPS经纬度定位模块、超声波模块HC-SR04+、蓝牙透传模块HC-05、磁力计模块。Android应用设计思路:UI界面及设计四个方向按键,三个模式按键以及一个蓝牙设置按键。不同的按键发送不同的字符串MCU。模式一按键按下时,会发送“MODE1A”字符串给MCU。模式二按键按下时,会发送“MODE2A”字符串给MCU。模式三按键按下时,会给MCU发送字符串“MODE3A”,并跳转到高德地图的导航界面。在该界面下,会依据GPS的经度和纬度信息在高德地图中显示小车位置,并再将每秒发送一次小车需要的行驶方向的角度信息。MCU端构建思路:MCU默认处于模式二(按键操作模式)。当处于模式一时,利用超声波模块HC-SR04+和舵机SG90采集正前方、左前方、右前方的环境数据,在根据HC-SR04+返回的脉冲时间,计算出小车前方30cm内是否存在障碍物,从而达到智能小车的自动避障功能。当处于模式二时,根据对比字符串去控制小车的行动。模式三时,MCU会不断的接收GPS模块传来的经度和纬度信息,然后再将信息通过蓝牙模块转发送给Android手机,根据上位机发送的角度信息,不断调整行驶方向。1.4毕业设计要求本毕业设计使用stm32作为小车端主控,同时编写Android应用实现小车到的控制。主要是实现以下三大功能:避障模式:智能小车检测正前方有障碍物时,转动舵机带动超声波检测其它方向是否有障碍物,从而继续行动。遥控模式:利用者蓝牙模块,进行手机串口通信,从而发送指令使小车前进、后退等。导航模式:智能小车能够根据导航,到达指定目标点附近,范围20m内。系统的大致流程图,如图1-5。主要分为下位机和上位机,Android端通过Bluetoothsocket与下位机的蓝牙模块建立通信网络。图1-5系统简略通信图2硬件设计设计2.1智能小车的避障模块选型避障模块就是小车的眼睛,只有这样小车才能采集前方的数据进行分析。查阅众多的资料,目前的避障主要是以测距模块和摄像头采集数据进行图像识别这两种方式实现。本次选择使用测距模块来实现避障功能。测距模块的主要功能是测量模块位置距离障碍物的距离,再根据距离大小来躲避前方的障碍物。根据所查阅的信息,方案有以下三种:方案一、红外传感测距模块由原理图2-1可知,该模块主要由LM393比较器和一个红外对管组成。其工作原理:红外对管的发射管发射出红外线,若前方存在物体,物体会把红外线反射回去,红外对管的接收管接收到红外线时,红外对管导通,比较器LM393直接与GND相连,此时D0输出低电平;若红外对管前方不存在物体,红外线就不会被物体反射,红外线对管中的接收管将不会收到发射出去的红外线,使得接收管不导通,导致LM393比较器的正极端口的电压要大于负极端口的电压,D0引脚输出为1。使用时,只需读取D0引脚输出的电平,来判断前方是否存在物体,阻碍智能小车前行。图2-1红外避障模块原理图介绍完原理,接下来说明一下模块的电气参数:VCC可接3.3V或者5V的电源;GND接电源的接地端口;D0端口为数字量输出;检测范围为2-30cm,可调节电位器从而改变检测范围;检测角度约为35度。优点:使用方便,占用的IO少。缺点:调整检测距离需要调节滑动变阻器;易受管线影响;并且阻挡物体不能为黑色,否则红外线会被吸收,导致模块误判为前方无物体。实物如下图2-2:图2-2红外避障模块实物图介绍完芯片及原理后,再讲解一下模块的一些参数:VCC可接3.3V/5V的电源正极;GND接电源的接地端口;SCL可接主控芯片的I2C通信的时钟线;SDA可接主控芯片的I2C通信的数据线;INT为中断输出引脚;XSH为片选使能引脚。优点:面积小、测量的精度为正负3%、多种测量模式以及可设置IIC从机的通信地址设置和中断输出。缺点:性价比低、最远距离2M、强光环境下最远距离会缩短。实物图,如下图2-4。方案二、超声波测距模块由图超声波模块原理图图2-3可知,该模块由8位单片机STC11、运算放大器TL074、电平转化芯片MAX232等组成。图2-3超声波模块原理图由于该模块涉及到STC11的内部程序,在此就不说具体原理及实现。接下来说一下引脚功能,实物图如下图2-4,模块VCC引脚可接5V或者3.3V(电源电压不同,测量的距离也不同);Trig引脚为触发控制信号的输入;Echo引脚为回响信号的输出。优点:可控性强、性价比高、测距精度可达3mm、可测范围广(2cm-450cm);缺点:感应角不大于15度、检测面积大于0.5平方米。图2-4超声波模块实物图经过仔细的思索和对比,最后决定使用HC-SR04+作为智能小车的“眼睛”。2.2电机驱动模块本系统选择使用电机驱动模块—L298N,模块采用ST公司研发的电机驱动芯片L298N,该芯片可同时驱动两路3伏至30伏的直流电机,并且芯片内部蕴含降压,可直接为MCU提供5V的电源,并且3.3VMCU的控制,可以方便的控制直流电机的速度与方向,也可以控制两相的步进电机,驱动的电流高达2A,是智能小车电机驱动的首选。实物图如下图2-5:图2-5模块实物图L298N引脚说明图如下图2-6,输出A和输出B接电机的正负两极。通道使能A引脚和通道使能B引脚接高电平有效,可接PWM进行对电机调速。5V供电降低VCC电压输出5V,可为MCU供电。逻辑输入负责根据MCU的IO输出,控制电机正转、反转、停止。12V供电为电源VCC引脚,输入电压为7V至35V。图2-6L298N电机驱动模块引脚说明2.3电源电源采用3节18650锂电池,本该选择一个电源模块去降压,为MCU供电,但因为L298N电机驱动模块自带5V降压,因而直接采用3节18650锂电池。电源满电使用万用表测量为为10.8V,满足L298的电源输入。2.4GPS模块GPS模块采用具有强大性能、体积小的NEO-7N模组,模块集成了放大电路,提升了无源陶瓷天线搜索卫星的速度。同时自带EEPROM,可以通过模块的USB接口进行设置GPS模块的各种参数,并保存与EEPROM,掉电不会消失。使用时需注意,信号灯常亮,表示还未实现定位;信号灯闪烁,表示已经定位成功模块。说明图,如下图2-7。图2-7GPS模块说明图GPS模块接线说明,如表2-1。简单介绍GPS的一些主要参数:GPS模块的串口通信波特率默认为9600。引脚VCC、GND、TXD、RXD必须接,PPS可以选择不接。定位所需时间由短到长:3m的SMA有源天线、有源的陶瓷天线、无源的天线。并且GPS定位时,需在室外空旷之地。本系统采用最快的SMA有源天线。表2-1GPS引脚说明表2.5蓝牙模块万物互联思想的提出,智能家居开始兴起。目前蓝牙主要分为两种,其中一种是经典蓝牙,另外一种就是为了智能家居研发的低功耗蓝牙BLE。经典蓝牙模块(BT)通常是指使用的蓝牙协议低于4.0的蓝牙模块,其优点是传输数据量大,相应的这就会出现功耗大的缺点,还有一缺点是通信距离短,一般为10M左右。低功耗蓝牙BLE则是指所使用的蓝牙协议高于4.0的蓝牙模块,其特点是低功耗,同样的为了控制功耗,传输数据量就比较小,但其传输距离大于经典蓝牙,大约为50米左右。本系统采用经典的蓝牙串口模HC-05,HC-05具有两种工作模式,其一是命令响应工作模式,该模式下可是使用AT指令对模块进行操作和配置。因该模式下使用的AT指令,又称AT模式。另一种模式为自动连接模式,当模块处于该模式下,将会依据实现的配置,进行数据的传输。HC-05实物图如下图2-8:图2-8HC-05蓝牙模块2.6电子罗盘模块GY-273本次系统中所使用的电子罗盘模块的核心是霍尼韦尔公司的HMC5883L芯片,HMC5883L是一种高度集成化,且具有多种数字接口的弱磁传感器类型的芯片。HMC5883L采用了美国霍尔尼尔公司的各向异性磁阻(AMR)技术,此项技术提高了HMC5883L的轴向的灵敏度和线性精度。其通常被应用于智能手表、手机、汽车的导航系统等。模块实物图,如图2-9。图2-9磁力计模块HMC5883HMC5883L是通过采集周围的磁场矢量,通过算法计算出与磁北的角度,而磁北极与真正的北极只相差11度左右。磁北与真北的区别,如图2-10。图2-10磁北与真北的区别图2.7MCU微控制器模块根据以上模块的选择,蓝牙模块和GPS个需要一个USART,L298N需要至少8个GPIO脚,超声波模块需要2个GPIO,SG90舵机需要一个PWM,再根据最小系统价格,本系统选择MCU的型号为STM32F103C8T6。STM芯片选型手册如下图2-11。图2-11STM32F1系芯片选型图STM32F103C8T6最小系统板原理图如下图2-12,简单介绍一下途中电路图,电源模块部分:负责将5V电源降压为3.3V给芯片供电;复位电路部分:采用按键,按下时,RESET接地,MCU复位,内置程序重新运行;晶振部分:负责为MCU提供工作时钟;ST-Link下载电路:负责通过ST-Link对MCU的程序仿真和下载;使能电路:该电路使用来调整下载方式的,根据BOOT0和BOOT1组合共有三种模式,具体请看图2-13。图2-12STM32F103C8T6最小系统板原理图图2-13BOOT三种模式3MCU端软件设计MCU软件部分开发平台采用MDK,并且以C语言为主要编写语言。3.1避障程序设计对于模块编程,不可避免的就是去看使用手册和通信时序图。HC-SR04+的时序图如下图3-1。由时序图可知,第一步:需要MCU将触发信号引脚Trig拉高至少10us,再拉低。然后模块内部会自动发出8个40KHz的脉冲。第二步:捕捉输出回响信号引脚ECHO的高电平时间。第三步:根据捕捉高电平的时间,计算出距离,计算公式:距离=ECHO高电平时间*音速(340m/s)/2。图3-1超声波模块通信通信时序图分析完了模块的使用,接下来简单讲一下程序设计思路,首先,拉高Trig脚电平,20us后在拉低。其次,打开与ECHO连接的MCU引脚的外部中断,发生电平变化时,第一次触发中断时,ECHO为高电平,打开定时器;第二次触发中断时,ECHO为低电平,关闭定时器。最后,在读取定时器的值,就可以得到ECHO输出高电平的时间,再根据时间计算距离即可。接线说明:Trig连接MCU的PA0,Echo连接MCU的PA1。基本配置步骤:步骤一,打开挂载在APB2总线上的GPIOA和AFIO时钟,并将配置PA0为推挽输出和PA1为上拉输入。步骤二,配置PA1的外部中断,将其设置为电平跳变触发。步骤三,开启APB2总线上的定时器TIM4的时钟,配置定时时间为1ms,打开定时器更新中断。步骤四,在定时器中断函数中,计时变量加1。步骤五,在外部中断一对应的函数中,根据ECHO的电平,打开或关闭定时器。步骤六,编写单次启动超声波模块的函数,函数流程图如图3-2。图3-2超声波单次启动流程图超声波模块基本解决,接下来就是超声波模块的底座SG90舵机云台。SG90是一个模拟舵机,需要一直输入一个PWM波,维持舵机的旋转角度。STM32自带PWM输出,仅只需对其进行配置。舵机原理:舵机中存一个在基准电压,当PWM信号被输入时,会产生一个直流偏置电压,舵机就会把这个基准电压与相对应的直流偏置电压比较,获取相应的电压差。再通过将电压差输入到内部的电机驱动芯片上,从而去旋转舵机,当电压差为0时,就停止旋转,达到相应的角度。SG90舵机常用旋转角度与占空比关系,如图3-3。图3-3SG90常用旋转角度与占空比关系图有了SG90和超声波的控制程序,接下来就可以写完整的避障程序了。简易思路:使用超声波模块采集小车正前方和左右两侧与障碍物的距离。分析三个方向的距离,控制小车绕开障碍物。根据程序框图如图3-4,具体叙述一下整个流程:首先利用超声波和舵机去获取90度、135度以及45度的与障碍物的距离。然后根据采集到的前方距离,若大于30cm,进而去判断左距离和右距离是否都大于9cm(判断车身是否能通过),若左距离和右距离都大于9cm,小车就前行;若都小于9cm,小车左转90度;其中之一小于9cm,小车旋转方向与小于9cm方向相反。若正前方距离小于30cm,接检测左右方向距离大于30cm,若都小于,小车旋转90度;否则,旋转方向与小于的方向相反。图3-4避障流程图3.2AndroidAPP蓝牙控制程序设计关于AndroidAPP的编写放在第五章节,这里只介绍MCU端的程序设计。蓝牙模块HC05设置方法共有两种:第一种是MCU内部编程使用AT指令控制。第二种将蓝牙模块和TLL串口模块与电脑连接,利用串口助手发送AT指令。这里采用第二种方法,去设置蓝牙模块的串口通信波特率、蓝牙模块的设备名称,其余采用默认的。主要使用了两条指令,一条是AT+UARH,关于该指令详细说明,请看图3-5。另一条是AT+NAME,详细介绍和例子,请看图3-6。图3-5AT+UARH指令说明图图3-6AT+NAME指令说明图HC-05蓝牙模块是一个透传模块,这就意味着MCU通过串口发送的数据,HC-05不会对其进行数据帧的封装,不会像云平台一般按照一个通信协议去封装数据。其实说白了,就是蓝牙透传模块只是一个接收和转发。这就意味,我们只需写一些特定的字符串作为小车的指令即可。这个本系统不管是Android端还是MCU端,通信结束都是以字符“A”为结尾。自定义的通信指令集表如表3-1:表3-1自定义通信指令集指令作用STOPA停止UPA前进DOWNA后退LEFTA左转RIGHTA右转MODE1A模式一:避障模式MODE2A模式二:AndroidAPP控制MODE3A模式三:导航模式蓝牙程程序思路介绍:首先,蓝牙模块与MCU的USART1连接,所以基本的GPIO配置是不可避免的,这就不说了。接下来说一下,串口配置需要注意的地方,串口的波特率、停止位、校验位的设置需要跟蓝牙模块的设置的相同,不然会出现数据丢失以及乱码的情况。因为蓝牙模块是作为MCU和Android通信的中转站,所以为了方便数据的输出,在代码中重新定义了fputc函数,并且在MDK平台中勾选USEMicroLib,这样就能通过printf函数从USART1直接打印或传输数据。MDK平台使用MicroLib库操作如图3-7。图3-7MDK使用MicroLib库操作图为了能够实时的相响AndroidAPP发送的指令,打开MCU的串口接收中断,并将中断的抢占优先级设置为1,响应优先级设置为3。至于抢占优先级和响应优先级的概念,这里就不诉说了,感兴趣的可以去看蒙博宇的《STM32自学笔记》。USART1的基本设置就完成了,接下来介绍USART1_IRQHandler内部编写。首先,在其内部顶一个接收状态变量state以及接收缓存数组res[64](char)。利用USART_ReceiveData将接收到的数据存入res,当检测到字符“A”时,将state置为1,表示已经接收到了一条完整的指令。接下来只需将接收的数据使用strcmp函数去和之前的指令级进行对比,去设置电机驱动模块的控制逻辑,进而控制小车行驶。蓝牙控制MCU端程序流程图,如图3-8。图3-8蓝牙通信流程图3.3高德地图导航模式3.3.1GPS模块数据解析该功能主要是使用GPS模块,获取到经度和纬度,再将其通过蓝牙发送给手机,手机APP在调用高德地图的API,去定位显示小车的位置。想要通过GPS模块获取经纬度,就需要去了解GPS的指令,指令详细介绍图如图3-9。图3-9GPS指令讲解图由上图可知,GPS定位信息的基本格式,以$GPRMC开头,数据与数据之间以逗号相隔。因此,在解读GPS模块发送的信息时,第一件事就是判断是否接收的数据是否以$GPRMC开头。若以$GPRMC开头,就将接收的数据保存下来,并将获取GPS数据状态变量置1。接收完数据之后,就是对数据进行解析。因为数据之间以逗号隔开,我们只需循环使用6次strstr()函数去查找到逗号,即可获取到需要的经度和纬度信息。解析完数据后,需将解析状态变量置为1,方便能正确的发送经度和纬度给Android端。3.3.2磁力计校准算法——简易椭圆拟合算法磁力计没有外界干扰时,磁力计的输出应该为圆形,如图3-10(a);当外界存在磁场干扰时,磁力计输出为一椭圆,如图3-10(b)。为了抵消外界磁场干扰,是磁偏角更为准确,将椭圆校正为圆形,采用椭圆拟合算法。图3-10磁力计输出图简易椭圆拟合算法实现:第一步,在本地磁场的干扰下,

收集小车旋转360度的数据,记录下X轴与Y轴的最大值和最小值。第二步,计算出偏差的偏移和灵敏度的比例因子,用来补偿本地磁场的干扰。假设X轴增益为1,椭圆拟合算法的数学表达式,如下:X轴的偏移量计算公式:X轴的偏移量计算公式:Y轴增益计算公式:磁偏角计算公式:x为磁力计X轴的输出,y为磁力计Y轴的输出。切记,不要将磁力计放在磁性物体附近,否则误差非常大。3.3.3导航设计思路智能小车仅在有GPS信号时,才会进行小车的行驶方向校准。第一步,接收到上位机发送的航向角,读取车头朝向的磁偏角,若两者的差值小于10度,则启动避障程序;若大于10度,则不断去校准航向。高德地图导航流程图,如图3-11。图3-11高德地图导航流程图4Android应用设计4.1Androidstudio工程创建及文件介绍创建工程:单击NEW,选择NEWProject,如图4-1操作。接着就会跳出图4-2,选择一个Activity,然后单击NEXT。接下来就是给工程命名,如图4-3,最后单击Finish,一个新工程就建好了。图4-1创建工程图图4-2Activity选择图图4-3工程命名AndroidApp文件目录如图4-4,AndroidManifest.xml文件内部写有Android的相关权限等。Java文件夹底下的是应用的源代码,其下的activity文件夹底下的是高德地图的相关源代码,bluetooth文件夹下的是蓝牙的通信源码和蓝牙设备好获取的源码,Data是全局变量文件,MainActivity为主界面的源码。在往后就是看res文件夹下的文件,layout文件夹下的是UI界面文件,drawable内包含各种图片文件,value则是包含字符串替代文件、颜色配置文件、以及APP的主题文件。图4-4Android应用文件目录图4.2Android应用界面设计AndroidAPP界面如图4-5,从图可知,需要从左palette栏脱出8个Button,有箭头的四个按键用于控制小车的前进、小车的后退、小车的左转、小车的右转。最底部的从左到右,分别用于设置小车为模式一、模式二、模式三。右上方的蓝牙按键跳出AlertDialo对话框,对话框内为一个列表,分别为打开蓝牙、蓝牙的连接、断开蓝牙。图4-5AndroidAPP界面图按键属性改动:从palette其默认样式为灰色,如图4-6(b)。本APP界面的是加上了背景图片,如图4-6(a)。接下来说一下按键属性,首先是Android:id是每个控件都有的,这是控件的id,用于Java文件中findViewById函数对控件的绑定,以作区分。Android:text是控件表面的文本信息,本App右上方的显示的蓝牙设置,就是通过以此来实现的。Android:background为控件的背景,想要作为其背景,需要将PNG格式文件放入drawable文件夹内。讲一下如何将jpg格式转化为PNG格式,可以使用windows自带的画图工具,将其粘贴进画板,然后保存时,选择PNG格式。图4-6按键对比图4.3Android基本控件和蓝牙通信网络首先介绍一些,简单的控件的编程。按键编程:先创建一个Button类,使用findViewById()去绑定UI界面的控件,然后在编写属于该按键的监听函数。监听函数有两种写法,一种是setOnClickListener()函数,另一种setOnTouchListener()函数。这两种的区别在于后者重写时,会多一个触屏事件变量MotionEvent,该变量可以检测按键的按下和弹起。有了以上的基本的控件编程了,接下来介绍一下,蓝牙相关的组件。想要调用Android手机的蓝牙组件,需要在AndroidManifest.xml文件中添加蓝牙的三条权限,接着就是去获得蓝牙适配器,只需BluetoothAdapter.getDefaultAdapter()函数获取即可。有了蓝牙适配器,即可对手机蓝牙进行打开和关闭操作。接下来就是蓝牙设备连接,当用户单击连接蓝牙时,就会由MainActivity跳转至BluetoothDeviceListActivity,同时传递请求码。BluetoothDeviceListActivity内部主要利用广播去获取蓝牙设备,并将搜索到的设备存放在界面的列表中。选择需要连接的蓝牙设备后,会将请求码和蓝牙设备地址传回MainActivity。MainActivity接收到返回的请求码后,会进入onActivityResult()中将获取的蓝牙地址转化为蓝牙地址类,并调用ChatService中的连接线程,与该蓝牙设备创建一个新的蓝牙串口通信网络。因为HC-05为蓝牙串口透传模块,蓝牙网络的UUID必须00001101-0000-1000-8000-00805F9B34FB。ChatService为官方例程提供的源码,只略做解释,该文件内含连接线程ConnectThread()、数据接收和发送线程ConnectedThread()以及接受连接线程,这里其实只是用到前了两个线程。4.4高德地图移植目前国内主流的两大地图开发平台为百度地图API和高德地图API,本应用采用高德地图,因为高德地图有着覆盖其全平台产品的近千篇的开发文档,并且平台还提供了覆盖核心产品典型使用场景的示例。在移植高德地图之前需要做以下几个准备:申请密钥Key。首先需要注册高德地图开放平台的账号,成为高德地图开放平台的开发者,然后进入个人用户的控制台,单击“应用管理栏”下的“我的应用”,创建新的应用。在创建的应用上点击"添加"按钮,在弹出的对话框,如下图5-6所示。接下来只要填写key名称,同时去Androidstudio平台获取调试版的安全码SHA1、发布版的安全码SHA1、以及PackageName,即可获得高德地图的Key,切记一个Key只能一个应用使用,否则会出现应用无法访问平台的问题。图4-7申请Key图获取图4-7中所需要的信息。回到Androidstudio平台,单击Build栏下的GenerateSignedBunldorAPK,创建一个APK的Key,并将其加入工程中,详细步骤可以查百度,这里不详细说了。单击Androidstudio平台左下角的Terminal,利用cd命令进入Java的bin中,再输入“keytool-v-list-keystore

<前面创建APK的Key的路径>”,然后就会得到发布版的SHA1,如图4-8。相对于发布版SHA1,调试版安全的SHA1获取就容易多了,具体操作如图4-9。最后就是获取PackageName,该信息只需打开AndroidManifest.xml文件,在开头就会有这一句“<manifestxmlns:android="http://S/apk/res/android"package="XXXXX">”,只需要吧XXXX的内容填入即可。单击提交,就会获得高德地图的Key。图4-8发布版的SHA1获取图图4-9调试版安全SHA1操作图添加高德地图的开发包。首先去高德地图API官网,单击开发支持下的Android导航SDK。然后下拉,找到“相关下载”,即可下载到高德地图的开发包,接下来将开发包的文件移植到工程文件夹内的lib文件夹内。再如图4-10操作,就完成了开发包的添加。图4-10build.gradle操作图添加权限和高德地图的Key,该操作全是在AndroidManifest.xml内完成。权限和高德地图具体内容,如图4-11。图中android:value的值为步骤二获取到的。图4-11权限和高德地图Key4.5Android应用导航功能设计思路首先,由于高德地图的API过于复杂,所以可以去高德地图的开放平台学习提供的例程,然后依照官方例程仿写自己需要实现的功能。先确定目标:使用MCU传过来的经度和纬度信息来定位,因此我们需要去平台的开发者指南寻找,发现仅在Android导航SDK开发指南里,有关于“传入外部GPS数据”指导和介绍。简单介绍高德地图的“传入外部GPS数据”,其等价于不再使用系统的定位点进行驱动了,导航SDK内部将会以您传入的定位点数据为标准进行无起点算路和实时导航,建议传入频率为一秒一次,否则可能影响导航效果。想要使用这一功能,需要做好以下几步:(1)开启外部数据定位点,调用AMapNavi的setIsUseExtraGPSData()方法开启使用外部定位点数据,将其设置为true。(2)传入外部GPS数据,调用AMapNavi的setExtraGPSData()方法传入外部定位点数据。注意:传入的定位点数据必须是WGS84坐标系(type传入1)或者高德坐标系(type传入2),并且经度、纬度、速度、精度、角度、时间参数缺一不可。

(3)调用导航API,实现导航。启动导航需要有导航的路径,所以算路的API也是不可缺少的。根据官方的开放指南,算路分为经纬度算路和POI算路,很明确我们使用的是外部GPS数据,因此选择经纬度算路。开发指南给的算路指导,如图4-12。图4-12算路代码例程图根据图4-12,我们只需将接收到的经纬度信息,填入NaviLatLng(double纬度信息,double经度信息).然后调用AMapNavi类下的calculateRideRoute进行算路即可。(4)定时器更新定位信息,并重新导航。采用了Android的定时器来定时更新经度和纬度信息,并重新启动导航,同时将航向角发送给MCU,以此实现实时导航。Android的定时器程序框架,如图4-13。图4-13定时器程序框架图不同Activity之间的数据传递。通过学习和查资料,了解的方法有两种,一种是Bundle和Itent,跳转界面来传递数据,该方法弊端,每秒会跳出一个导航界面,导致按下Android手机的返回键,无法立马返回主界面。第二种,定义一个Android应用的全局变量,所有的Activity都有修改和获取的权限。只需新建一个Java类文件,将其继承于Application,然后修改AndroidMainfest.Xml内application下的android:name=“全局变量文件名”即可。接下来,只需在全局变量文件内编写修改函数和获取函数,在Activity中调用,就能完成数据的传递。经纬度转化为高德地图坐标,该内容写在Android定时器任务里面的。讲转化前,先简单的介绍一下坐标体系。主要的坐标格式有WGS84格式、高德坐标以及百度坐标。WGS84为常见的GPS经纬度,而高德坐标和百度坐标是两个平台各自将WGS84进行处理后的坐标体系。因此,在使用外部GPS数据定位时,需要先将WGS84转化为高德坐标。至此关于Android应用方面的修改和编写已全部完成,剩下的就是不停的调试和修改,让小车和手机通信稳定。5系统测试与误差分析系统调试分为三部分:智能小车的硬件调试、智能小车的MCU软件调试、Android应用调试、整体调试。这样可以快速定位问题由哪一部分引起的,大大的缩减了调试难度。5.1智能小车的硬件调试智能小车的硬件方面调试,主要分为万用表检测PCB板和观测各模块是否正常工作。检测引脚:主要的检查的是引脚是否存在虚焊或者漏焊现象。首先,将万用表调到蜂鸣档,然后打开PCB图,根据PCB图,检查每个引脚之间的导通关系。若导通,万用表就会发出“bi~”的声音。模块的观测:先查看L298N模块的指示灯,确认电源是否存在问题。指示灯常亮,表示电源无问题。查看最重要的主控的指示灯,灯亮起,MCU最小系统板已通电。再观测蓝牙模块的指示灯,若指示灯快速闪烁,表示准备就绪,等待连接;若其一秒一闪烁,表示已连接设备。最后观测到GPS模块闪烁,表示定位成功,一定要记住这点,Android应用无法接收到经纬度信息。也可以使用野火的串口助手,查看GPS的定位,如图5-1。图5-1GPS模块定位图5.2智能小车的MCU软件测试MCU软件调试,主要是通过ST-Link和MDK进行仿真、Android手机的蓝牙串口应用进行调试以及测试。首当其冲的是测试L298N对直流电机控制的程序,这部分测试十分简单,只需要再主程序中依次调用写好的前进函数、左转函数、右转函数、后退函数以及停止函数,来观测智能小车的行驶。其次测试的是蓝牙模块代码,这里直接调用printf()函数随意输出一个字符串,然后用Android手机串口应用查看接收的数据,与发送的数据是否一致。然后手机端发送之前约定的指令,看智能小车执行的动作,是否与指令相符合。5.3Android应用调试Android方面的测试,采用蓝牙模块与USB串口转TTL相连,利用电脑的串口助手发送数据和查看数据,并在Androidstudio平台上查看Android应用的输出日志。具体步骤,首先需要将手机设置为允许USB调试,通过USB线连接电脑,如图5-2操作,即可进行Android应用的仿真。图5-2Android应用仿真操作图5.4智能小车避障测试与误差分析在实际测试中,智能小车能够基本的识别障碍物。经过多次测试后,发现在识别曲面或斜面的物体时,有较大的概率无法识别出,还有就是面

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论