自动跟随智能小车的定位与跟随系统设计_第1页
自动跟随智能小车的定位与跟随系统设计_第2页
自动跟随智能小车的定位与跟随系统设计_第3页
自动跟随智能小车的定位与跟随系统设计_第4页
自动跟随智能小车的定位与跟随系统设计_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

北京理工大学珠海学院2020届本科生毕业设计绪论1.1引言随着5G时代的到来,现代网络通信技术相较十几年前已经有了质的飞跃。全球智能化的浪潮使得现代社会逐渐朝着智能社会不断发展,人工智能的逐渐普及,让智能化的生活离人们越来越近。许多智能小车的设计都具有自主巡线的功能,自动寻迹小车等各种各样的智能小车在大学生的课余科技活动中扮演着不可缺少的角色,但是大多数智能小车只是完成了基本部分的功能,只实现了按照既定路线行驶的基本功能,而在跟随性方面的考虑较少,大多数都没有实现跟随性的方面的功能。自动跟随智能小车定位与跟随系统是指在自动跟随智能小车在开启跟随模式时,能够自动识别出被跟随物体的所在方位,利用核心控制系统及跟随控制系统对被跟随物体进行一定距离的自动跟随的系,是基于机械结构、计算机技术及自动控制原理设计运行控制的系统。1.2智能小车现状研究1.2.1国外研究现状如图1.1所示,有人设计出了自动跟随高尔夫球球童车,这款高尔夫球球童自动跟随车车上可以携带高尔夫球袋及各种日常用品并自动跟随主人行驶。当主人戴上一个发射器向小车持续发送无线信号,当小车接收到无线信号后,就会自动跟随主人行驶,操作十分的简单。这样的自动跟随高尔夫球球童车更够极大的减轻人的负担,也能节约对于球童的人力开支。图1.1国外的自动跟随高尔夫球球童车在汽车跟随的领域,如今自动驾驶技术大多数都是运用小轿车上,未来将会有越来越多的小轿车添加自动驾驶技术。在现代物流运输等行业中,大货车驾驶员往往需要在货物的长途运输时长时间的工作,会导致在精神或者体力上都产生较大的消耗,这样极为容易导致疲劳驾驶的出现。货车产生交通事故的很大一部分原因是疲劳驾驶。如果将自动跟随驾驶技术运用到物流行业的货车中,将会使这种非常容易产生疲劳驾驶的现状,得到有效的解决。国外有人研发了自动跟随的自动驾驶卡车。如图1.2所示,由佩洛顿(Peloton)公司研发的一种卡车自动跟随技术REF_Ref23076\r\h[1],现在已经有了多个车队使用这种技术。图1.2自动跟随卡车这项技术是佩洛顿科技建立在佩洛顿pro驾驶跟随技术之上的。这项技术只要应用在了2辆或者更多的卡车车队中,就可以使前车的驾驶员既可以驾驶自己的卡车向前行驶,同时还可以使后面的另一辆卡车被前车司机间接控制着一起行走。这样后方驾驶员可以在感觉到疲劳时将控制权交给前车驾驶员,从而获得休息的时间,当前面的驾驶员感觉到疲劳时,也可以与后车司机轮换位置。这种自动驾驶技术,可以使卡车在一定程度上不需要人的控制,使后车真正的实现了自动驾驶的目的。这项技术基于在多辆卡车间建立V2V通信,在所有卡车上安装雷达的主动制动系统。后车在接收到前车发送的数据后,经过后车的控制计算机的处理可以使后车模仿前车包括前进、转弯、制动在内的所有操作从而实现两辆卡车可以向前同时行驶的功能。如图1.3所示,这是一种由谷歌公司所研发的不依赖人类驾驶的无人驾驶小车REF_Ref23105\r\h[2]。图1.3由谷歌研发的无人驾驶小车这些无人驾驶小车还没有真正的应用,目前仍处于开发和实验的阶段。它们的基本工作原理是激光测距传感器向四周发车激光,当激光碰到四周的障碍物时会返回接受,通过对整个过程时间的计算可以得出小车和小车四周障碍物的相对距离。通过对于四周障碍物的距离探测可以实现小车对于当前道路的交通状况的“观察”。小车使用谷歌地图的详细定位数据可以计算出车辆的具体位置,实现为无人驾驶小车导航的功能。通过小车上的计算机对于小车“观察”到的数据和小车的定位导航数据进行高速的处理,从而实现小车的自动驾驶。1.2.2国内研究现状如图1.4所示,类似于电影拍摄的跟随摄影小车,或者比赛场地上的跟随摄影车。这一类跟随摄影小车一般需要工作人员提前铺设好小车的行驶轨道,小车只能在固定的行驶轨道上前进或后退。通过对小车人为的控制或者图像识别处理等方式,实现小车的跟随拍摄。图1.4跟随摄影轨道车如图1.5所示,国内有公司推出了自动跟随行李箱,能够通过与手机或者遥控器与行李箱之间的无线连接实现5米范围内行李箱的自动跟随。以上几种产品虽然实现了自动跟随的功能,但它们都有着十分昂贵的价格,所以自动跟随的产品难以在大众间普及。图1.5自动跟随行李箱如图1.6所示,由百度公司研发的无人驾驶汽车。图1.6由百度研发的无人驾驶小车国内的百度从2013年才开始对无人驾驶汽车的开发进行研究。其基本的工作原理和谷歌的无人驾驶小车类似,采用多种传感器对小车周围的环境进行信息采集再通过智能计算机对与采集到信息进行处理分析得到小车周围的道路信息。结合百度地图的定位信息和道路信息对小车进行导航,为小车规划出最佳的道路行驶方案。1.3室内定位技术1.3.1WLAN(无线局域网)技术无线局域网技术是一种现在已经普及了的技术。相较于需要通过网线连接的有线局域网技术,无线网络技术使用无线电波的方式搭建网络。这样的优势在于可以节约大量的布线成本,同时优化了用户的上网体验。无线网络通常选择利用无线路由器来建立。无线路由器向各个方向持续发送无线电波,在电波覆盖范围内的智能电子设备便可以连接到无线网络。由于无线电波传播时会受到传播介质(大多数时候是空气)和各种障碍的阻挡或者吸收从而产生衰减,当智能设备与无线路由器之间的间隔距离越远,信号强度就会变得越低。现代无线网络通常采用的频段一个是2.4GHz,另外一个是5GHz。因为频率的提高,5GHz的无线网络频段干扰远小于2.4GHz的无线网络,网络传输速率也更高,但是覆盖范围和穿墙能力要更弱。WLAN室内定位具有定位精度高、部署成本低、适用性广、应用开发广泛的特点REF_Ref23242\r\h[3]。无线局域网定位技术的基本原理是通过计算多个信号点的接收信号强度(RSSI)得出信号发出点与接收点的相对距离,从而确定信号发出点的具体位置。1.3.2ZigBee技术ZigBee又名紫峰协议。是现代诞生的一种较为新的技术。具有低能耗,低成本,网上节点数量多等特点。ZigBee技术依赖于一种特殊的标准,使得它可以实现成千上万个微型传感器之间的协调通信。这种低功耗,数量庞大的组网方式就是ZigBee无线通信技术最大的优势。在大多数无线数据传输过程中,都会出现信号冲突和传输不稳定的情况。ZigBee技术采用了一种防止发生冲突的办法,这种冲突防止的办法可以使ZigBee技术的无线传输更加稳定从而更好的保证了数据的安全传输。ZigBee对数据的处理采用了加密的方式,在一定程度上来说,其安全性比蓝牙技术好REF_Ref23830\r\h[4]。在ZigBee应用于定位技术的方面,现在已有类似于隧道人员定位等的多种应用。这种定位方式通过多个测距基站向需要定位的定位标签发送测距信号,通过对于距离不同基站不同距离的计算方式,得到定位标签所在的具体位置。在使用ZigBee定位技术时,往往只需要很低的能耗就可以使ZigBee持续不断的工作。1.3.3UWB(超宽带)技术超带宽技术是一种先进的无线通信技术。在传统的窄带和宽带通信系统中,一般使用连续的电磁波作为载波REF_Ref4334\r\h[5]。超宽带技术使用的不是正弦波载波而是选择超宽基带脉冲用于传输数据,这样能够使得超宽带技术的频谱范围变大。由于超带宽技术具有非常大的带宽,所以使得超带宽技术能够有相当可观的数据传输速率。超带宽技术的数据传输效率和数据处理能力比传统无线传输更加优秀。在无线定位的解决方案中,近年来越来越多的利用超宽带技术进行方案设计。这样的优点使得超带宽技术能够作为一种优秀的解决办法出现在对于定位精度要求较高的应用场合,但是超宽带技术无线定位的成本相较于其他解决方案会更高。1.3.4蓝牙技术蓝牙技术是一种短距离的无线通信技术。二战时期无线电通讯技术在战场上被用作无线通讯系统。在后来的蓝牙、Wi-Fi等移动通讯系统上,跳频扩频(FHSS)技术为无线数据收发问题的解决发挥了不可缺少的关键作用。蓝牙技术最初方案是为了研究在各种智能设备和智能元器件间搭建一种低功耗、低成本的无线通信连接。最初的目的是为各种智能设备和智能元器件间的无线通讯创造统一的规则也就是协议的标准化。一旦有了标准化的通信协议就可以很好的解决各种不用的智能设备间兼容问题。在连接的方式上,蓝牙设备无需像红外设备一样口对口的进行通讯,只需要互相连接的蓝牙设备处于有效通讯范围内,极大地简单化了设备的连接方式,使用户们的使用体验更加的方便,同时蓝牙技术比其他红外设备的传输速率更快,效率也更高。1999年,其使用的无线频段正式确定为2.4GHz,这个频段属于微波频段,同时具有传输过程稳定,传输速率较快的优点,这样就能在更加短的时间之内传输信息量更为庞大的数据。因为传输效率的提高,从而降低了设备工作时产生的能耗。就在刚刚过去的2019年,北欧集成电路公司(nordic)通过了NRF52811芯片的内部测试,这个芯片可以在一定程度上被称为“室内定位技术中的王者”。这是北欧集成电路公司(nordic)首款采用了最新的蓝牙5.1技术的室内定位SoC(System-on-a-Chip)芯片。这款芯片可以扩展例如蓝牙5.1定向查找、专有2.4GHz频段等的很多不同功能。蓝牙5.1定位技术具有测向的功能,这使得室内定位技术的方案可以通过信号发出的实际方向进行解决,而不是像传统方案一样只能仅仅局限与接收信号强度(RSSI)。1.4选题的研究意义现代社会逐渐注重智能化发展,近年来快递、物流行业发展迅速。如图1.7所示,在快递仓库里,很多AGV车在货物搬运方面占据了很大部分。通过在地上铺设的电磁轨道,AGV小车能够获取到与自身相关的工作信息,听从核心计算机的指令在仓库中快速的移动。这样可以很好的帮助快递行业运输货物从而提高货物搬运的效率,为其他工作节约时间。这类小车的工作原理就和寻迹小车大致相同,但是目前还是具有造价昂贵的缺点。图1.7天猫仓库的AGV小车本文选题的自动跟随智能小车,基于使用现代化的智能设备,解放人类劳动力的理念,利用当前普及的蓝牙通信技术尝试设计出可以自动跟随指定的被跟随物体自动行走的小车。如果添加载物功能,便能极大的方便仓库工作人员对于货品的管理甚至是组建运输小车阵列,这样就能够替代造价高昂的AGV小车。或是在快递派送的时候为快递员减轻负担。或是改造成无需人力推动的跟随式购物小车,方便人们在超市里购物。自动跟随智能小车具有较为广泛的应用前景及商业市场。本文设计的自动跟随智能小车使用的各种传感器的成本低廉,使用便宜且简单的各种传感器就可以实现自动跟随智能小车行驶、避障、跟随的各种功能。小车核心控制芯片为STM32芯片,是现在较为普及的单片机芯片,可编程程度高,核心控制技术比较的成熟,被广泛运用于各种商业产品当中。小车通过无线通信与被跟随物体进行无线数传,具有较短的通讯延迟时间和较快的数据传输速率。1.5本文的主要工作本文将研究设计一款注重要求小车跟随主人的自动跟随智能小车。研究其核心控制结构、定位方式、跟随方式,从而设计出自动跟随智能小车的核心控制系统、定位跟随系统。(1)搭建自动跟随智能小车的自动避障系统和定位跟随系统通过对各种传感器、无线模块进行调查研究,为小车自动避障系统和定位跟随系统的搭建选择合适的元器件,通过元器件与STM32单片机的连接,构建出小车的自动避障系统和定位跟随系统。(2)对自动跟随智能小车的自动避障系统进行研究设计出自动跟随智能小车在行驶过程中的避障系统。在小车行驶过程中,小车通过各种传感器对于障碍物进行检测,在检测行驶前方存在障碍物时,小车将自动停止行驶。只能倒退行驶,或是在排除障碍物后继续行驶。(3)对自动跟随智能小车的定位与跟随系统进行研究对于自动跟随智能小车在跟随过程中的被跟随物体进行定位。在小车开启跟随行驶模式后,小车需要判断被跟随的方向等参数,这需要定位系统对于被跟随物体与小车的相对位置进行判定,经过计算处理后得出小车的行驶方向。通过对于被跟随物体的实时定位,跟随系统将对小车的行驶轨迹进行角度、速度的修正,从而实现跟随的功能。

2自动跟随智能小车整体设计2.1自动跟随智能小车结构部分如图2.1所示,本文设计的自动跟随智能小车底座采用亚克力材质。亚克力又称有机玻璃,亚克力是一种具有很好的化学稳定性和透光性的高分子材料。亚克力板良好的透光性能够让在对各种电子元件调试的时候进行更好的观察。另外亚克力板的硬度很高,耐磨性好。亚克力板的坚固能够很好的支撑起整个小车的重量而且不易变形。图2.1自动跟随智能小车底座底板两测为2个电机的安装留有位置。底板前部为扇形结构,留有多个M3孔洞便于各种传感器和电子元件的安装。后部为万向轮的安装留有4个M3孔洞位置。相比较于驱动小车行驶的大车轮,万向轮的体积较小。为了保持小车底板的水平,在万向轮和小车底板间使用4根长度为10mm的M3铜柱进行连接。在调试过程做发现,万向轮会导致小车实际的行驶路线与预期的行驶路线产生一定的偏差,尤其是在转向或者后退的时候,小车会产生非自主性的转向。于是使用2根M3铜柱将万向轮的旋转角度固定,限制万向轮的角度转动使其近似的变为定向轮。在自动跟随智能小车底座的左右两侧预留了用于固定电机的亚克力板插槽位置。电机与底座之间通过螺栓、螺母和亚克力板进行固定。小车的车轮选用直径65mm的橡胶车轮。车轮内部轮毂为塑料材质,塑料材质坚硬的特点可以保证车轮能够承受小车的整体重量。车轮胎面为橡胶材质,橡胶的特性既可以车轮保证承重的能力,一定的柔韧程度又可以为小车行驶的时候提供足够的摩擦力。小车上层板为一块PCB万用板。用于放置单片机等核心控制的电子元件。以及布置各种元器件之间的跳线。上层PCB板通过M3铜柱与底层亚克力底座连接,使用螺丝、螺母进行固定。2.2自动跟随智能小车驱动部分2.2.1驱动电机电机作为小车重要的驱动元件,坚固耐用是必须考虑的因素。小车的驱动电机选用相较于步进电机而言更加便宜的直流电 机。直流电机的马达在3V空载的情况下能达到每分钟4800转。电机内部采用双轴减速比为48:1减速机构。经过减速机构的减速后,电机在3V空载的情况下输出转速为每分钟100转。适合自动跟随智能小车速度不宜太快的应用场景。经过减速器减速后的电机扭矩比减速前的电机扭矩更大,适合于需要小车载重行驶的应用场景。2.2.2驱动电源电池作为小车重要的供能元件,长久的续航能力是必须考虑的因素。锂充电电池是目前市面上使用范围较广,使用场合极多的一种电池。锂充电电池主要有两种。锂离子充电电池的成本相较于锂聚合物充电电池的成本更加低,所以使用的场景往往会多过锂聚合物电池。因为锂聚合物电池的安全性能要比锂离子电池更加高,所以锂聚合物电池的价格往往也会高于锂离子电池。通常运用在给类似于手机、电脑等成本和安全需求都比较高电子产品中。目前市面上常见的电池种类还有铅酸电池、镍氢电池等等。如图2.2所示,本文出于对成本及硬件部分的电压、电流使用需求,选用2节电池组成驱动小车的电源电池组。2节14500锂离子充电电池安装在智能小车底部的电池座,通过串联的方式为小车供电。14500锂离子充电电池在充满电后能够达到4V的输出电压,能够支持小车的正常工作。图2.214500锂离子充电电池2.3自动跟随智能小车控制部分2.3.1单片机目前市面上的8051单片机,采用最多的一般是STC89C51和AT89C51芯片,这两款8位的单片机芯片结构简单,普及的范围比较广。学习资料也比较丰富,能够比较简单的获得。但是8051单片机如果要使用AD转换等功能往往需要在外部电路进行扩展,这会使得硬件部分变得更加复杂。8051单片机的IO口输出电流往往十分的小,无法在高电平的时候连接负载进行电流输出工作。这使得8051单片机需要另外添加负载驱动元件才能驱动负载工作。另外8051单片机的工作速度也不算太快。相较于古老的89C51单片机,STM32单片机是商用范围更广,性价比更高,功能更加强大的单片机。STM32单片机是以Cortex-M为内核的32位单片机。STM32单片机对比于8051单片机具有很多的优势。在运行速度上来比较,32位的STM32单片机一次能够处理32位的数据,这使得STM32单片机对于数据的处理效率提高了非常的多。而且STM32单片机不存在8051单片机IO引脚输出高电平电流过小的缺点,STM32单片机的IO引脚能够直接连接负载进行电流输出的工作。根据本文对于自动跟随智能小车的实际功能的研究和开发过程的需求,选择STM32单片机作为自动跟随智能小车的主要控制元件。STM32使用串口通信接口实现串行通信,支持IIC、USART、SPI、CAN、USB等多种通讯协议。STM32单片机通常含有一个或多个通用异步收发器和通用同步收发器。如图2.3所示,本文使用的STM32F407VET6芯片是一款基于ARM公司研发的Cortex-M4内核的32位单片机。在芯片的全部名称中,F的意思是芯片的子系列类型。407的意思是这一款芯片的具体型号。V的意思是这一款芯片一共有100根引脚。E的意思是这一款芯片的内嵌Flash(闪存)容量为512K字节。T的意思是这一款芯片的封装类型为LQFP封装。6的意思是这一款芯片的工作温度范围为零下40摄氏度至85摄氏度。另外这款芯片的具有3个通用的定时器。3个通用同步/异步串行接收/发送器,可接外围设备有直接存储器访问,电机控制脉冲宽度调制,温度传感器,湿度传感器等等。图2.3STM32F407VET6芯片2.3.2L298N电机驱动模块如图2.4所示,L298N电机驱动模块是目前使用较为广泛的电机驱动模块。它可以通过单片机的IO引脚对于模块的逻辑输入实现对于2个电机的运动控制。电机驱动模块可以将12V的输入电压通过稳压芯片将至5V进行输出。通道A和通道B可以直接连接电机的正负极。通过4个逻辑输入的引脚可以控制通道A和通道B的正负极。如果需要用到PWM对电机的转速进行控制,可以将通道A使能和通道B使能的跳线帽拔出,改用PWM输入使能通道A和通道B。图2.4L298N电机驱动模块2.3.3PWM(脉冲宽度调制)脉冲宽度调制以一个特定的频率不断开关电源。在一定的周期时间内,改变电源开关的时间长短,使得电源输出中电压的占空比发生改变。从而实现控制电源平均输出的电压的目的。通过这样一种改变的方式可以达到例如控制小车的电机转速、控制温度、控制灯光亮度等的效果。在STM32芯片中使用PWM控制时,通常使用定时器和中断相结合的方式实现。通过定时器控制IO引脚的高电平输出时间,从而实现对于平均电压的调节的功能。在使用脉冲宽度调试的时候,需要注意一些特别的地方。在控制小车电机转速的时候,如果输出电压的占空比过小,对导致电压过小,可能达不到电机运行的最小电压导致无法驱动电机工作。通过使能单片机控制小车电机的引脚采用PWM的工作方式。能够实现小车在转向过程中的差速转向。2.4自动跟随智能小车传感器部分2.4.1红外距离传感器红外线是一种不可见的电磁波。是生活中众多的不可见的电磁波中的一种。红外线在云雾中有着比可见光更强的穿透能力。在现代的科技领域中,红外线的引用非常的广泛的普遍。在医学方面,红外线的发热能力普遍被用来制作医用红外线灯。红外线对于皮肤具有一定的穿透能力,能够将热量带到表皮以下,具有促进血液循环等功能。在军事领域中,有红外夜视装置。因为夜间的可见光数量远远比不上日间的可见光数量,这使得红外光等不可见光的采集在夜间更为容易。红外夜视装置将人类无法用肉眼观测到的红外线通过红外接收装置进行采集,利用光电转换的技术将采集到的信号转换成电信号,通过一定的计算处理,将图像显示在屏幕中。在工业生产中,红外线能够起到测温的功能。自然界中的所有物体都会由于自身的运动辐射出红外线,红外测温仪通过将物体辐射的功率信号转换成电信号后,成像装置的输出信号就可以完全一一对应地模拟扫描物体表面温度的空间分布,经电子系统处理,传至显示屏上,得到与物体表面热分布相应的热像图,运用这一方法,便能实现对目标进行远距离热状态图像成像和测温并进行分析判断[6]。在水利、地质、交通等领域中,利用红外线测距的原理制造出来的测绘工具往往是不可缺少的必要工具。红外线测距仪利用发光二极管发出经过调制后的高频红外信号,因为红外信号的折射率很低所以红外信号不会在传播的过程中过多的扩散。这样的特点使得红外测距的精度能够达到很高的水平。如图2.5所示,本文中使用的红外距离传感器。红外距离传感器模块在工作过程中能够比较好的适应环境光。红外距离传感器的有效最低工作距离为2厘米,有效的最高工作距离为30厘米。红外距离传感器对于障碍物的探测距离的阈值可以通过对电位器旋钮进行调节,当顺时针调节电位器旋钮时,增大红外距离传感器对于障碍物的检测距离,当逆时针调节电位器旋钮时,减小红外距离传感器对于障碍物的检测距离。红外距离传感器最低有效工作电压为3V,最高有效电压为5V。当外接电源电压低于3V时,无法驱动红外距离传感器的正常工作。当外接电源电压高于5V时,容易使得红外距离传感器中的芯片和二极管等元件发生损坏。图2.5红外距离传感器模块2.4.2超声波距离传感器在生活中,超声波的频率通常会高于两万赫兹。超声波的能量比普通的声波集中的多。这样的特点赋予了超声波许多的特性。在医学研究方面,B超就是超声波探测的最广泛的应用。超声波通过对于内脏器官等的探测,能够将反馈的结果经过计算机的数据处理显示在屏幕上,能够使医生直观的观察人体内部的健康情况。在工业领域中,超声波探伤广泛运用在各种各样的工程现场,超声波探伤是一种对于被检测对象没有损害和影响的检测手段。超声波探伤的原理是通过对金属材料发射超声波,超声波在遇到金属材料中的裂隙、空洞等缺陷时,会产生不同的超声波回波,通过超声波探伤仪器对特殊的回波进行处理分析,就能确定金属材料中的缺陷位置。在机器人和自动化等领域中超声波测距有着不可缺少的地位。因为超声波的能量不容易在传输过程中被消耗,而且超声波的定向发送能力比较出色,这使得超声波经常被用做测距的工具。在我们许多家用轿车的倒车系统中,防碰撞的报警器就是用超声波测距的原理实现防碰撞的。如图2.6所示,本文选用的是HC-SR04超声波距离传感器作为超声波测距装置。它性能比较稳定,对于距离的测量数据往往都很准确,其测量精度可以达到最小3mm的距离。超声波距离传感器的最低有效工作距离为30毫米,最高有效工作距离为4000毫米。超声波距离传感器有2个部分。一个部分是超声波的发射部分,发射部分利用IO端口所给出的大于10us的高电平信号,通过发射端口发出8个频率为40KHz的方波。当超声波遇到了障碍物就会产生回波,通过对于回波时间的计算,超声波接收端口向单片机的IO口输入不同持续时间的高电平,持续时间越长的高电平代表超声波距离传感器所测量获得的距离越远,反之持续时间越短的高电平代表超超声波距离传感器所测量获得的距离越近。由于声音在不同温度下的空气中具有不同的传播速度,使得超声波距离传感器可能会受到环境温度的干扰,从而会出现对于距离测量时产生一定的微小误差。图2.6HC-SR04超声波距离传感器2.5自动跟随智能小车通信部分2.5.1蓝牙通信模块现代较为常见的无线通讯技术有蓝牙、WLAN、ZIGBEE等通讯技术。WLAN技术的覆盖范围一般比蓝牙技术的覆盖范围更大,信号频段的干扰会比蓝牙更少。但是比起WLAN复杂的设置过程而言,蓝牙的搭建显得更加的简单。蓝牙技术和WLAN技术相比于ZIGBEE,传输速度更快。WLAN技术相较与蓝牙技术和ZIGBEE0技术的安全性更高。当前最常见的蓝牙模块为蓝牙2.0和蓝牙4.0模块。蓝牙5.0于2016年正式的发布,蓝牙5.0在相比较于过去的蓝牙2.0和4.0具备更快更远的传输能力,传输速率和有效传输距离得到了极大地提高。如图2.7所示,本文选用蓝牙2.0的HC-05蓝牙芯片进行单片机与手机之间的通信。可以使单片机与手机之间搭建无线数据透明传输的通道,使使用者能够通过手机上的控制信号对小车进行无线的控制。图2.7HC-05蓝牙数传模块2.5.2蓝牙信标目前市面上许多产品都采用了蓝牙信标,例如智能防丢器、智能手环等等。当蓝牙信标处于工作状态时,蓝牙信标会不断的向四周一定范围内发射信号,形成信号的范围覆盖。只要有能接受蓝牙的电子产品进入了蓝牙信标的信号覆盖的范围,就能够接收到这个发射信号的蓝牙信标特有的蓝牙信标ID。电子产品可以通过对于信号源的蓝牙信标的特有ID进行解析,可以获得蓝牙信标中预存好的信息。蓝牙信标相比较于GPS定位来说,蓝牙信标的定位精度更加的准确,蓝牙信标的功耗也更加的低。因为蓝牙信标是不断向覆盖范围内的电子产品发送信息的,所以蓝牙信标经常被商场的商家们用来发红包或者微信摇一摇。一旦预设好需要发送的内容,商家们就不再需要多余的操作,蓝牙信标会通过与电子产品之间的自动应答进行工作。如图2.8所示,本文采用以蓝牙5.0的nRF52832低功耗蓝牙芯片为核心的蓝牙信标。图2.8nRF52832低功耗蓝牙信标

3自动跟随智能小车避障和跟随系统设计3.1总体设计方案根据自动跟随智能小车的功能设计要求,小车需要对各个传感器的数据进行采集,通过核心控制系统的处理分析,可以得到小车与障碍物的间隔长度,通过对于距离数据的判断,判断小车是否需要停车、后退或者转向。从而实现小车的避障功能。若工作环境为室内,可以采用红外距离传感器和超声波距离传感器同时避障,若工作环境为室外,日光会极大的干扰红外距离传感器的正常工作,尽量使用超声波距离传感器进行避障。定位与跟随系统的实现基于被跟随物体和自动跟随智能小车之间的蓝牙通信,通过对于被跟随物体或自动跟随智能小车的蓝牙模块的RSSI(接收信号强度指示)进行计算,测定自动跟随智能小车(信号点)与被跟随物体(接收点)二者间的距离。或者使用超声波发射模块和超声波接收模块实现对于蓝牙信标的替代方案,利用超声波发射端和2个超声波接收端的距离计算出小车与被跟随物体间的距离,利用三角定位算法实现小车对于被跟随物体的准确定位。3.2避障系统设计3.2.1红外测距传感器要使得红外测距传感器工作,需要先将红外测距传感器的电源和地与小车的供电装置进行连接,最低工作电为3伏,最高工作电压为5伏。将红外测距传感器的VCC与小车上经过降压后的5V电源连接,将红外测距传感器的GND与电源负极连接。在单片机上配置好避障需要用到的IO口为输入模式后,将红外测距传感器的OUT与单片机的IO口相连接。在红外测距传感器一般的工作情况下,OUT输出端口的电平为高电平,输出指示灯保持熄灭。这时候不会触发避障函数进入中断。当红外测距传感器检测到小车行驶到障碍物后方的时候,OUT输出端口的电平改变为低电平,输出指示灯电路导通,输出指示灯保持亮起,同时触发避障函数进入中断。在避障中断服务函数中小车只能后退,无法前进或转向,直到红外测距传感器不再检测到小车位于障碍物后方。红外测距传感器具体工作流程如图3.1所示。图3.1红外测距传感器避障流程图3.2.1超声波测距传感器要使得超声波测距传感器能够正常的进行工作,需要先将超声波测距传感器的电源和地与小车的供电装置进行连接。超声波测距传感器的额定电压为5伏,将超声波测距传感器的VCC与小车上经过降压后的5V电源连接,将超声波测距传感器的GND与电源负极连接。将超声波测距传感器的发送引脚与接收引脚分别各连接一个单片机上的IO口。将发送引脚连接的IO口配置为输出模式,将接收引脚连接的IO口配置为输入模式。通过超声波测距传感器的时序图可以理解超声波测距传感器的原理。初始化好超声波测距传感器后,通过超声波避障函数可以获得小车与前方障碍物的距离,一旦小车过于接近前方的障碍物,自动进入避障中断服务函数。在避障中断服务函数中小车只能后退,无法前进或转向,直到超声波测距传感器检测到小车与前方存在的障碍物的距离高于触发中断的距离的阈值。如图3.2所示为超声波测距传感器具体工作流程。图3.2超声波测距避障流程图3.3定位跟随系统设计3.3.1定位的基本原理室内定位方法如果按照信号类型来分类可以分为射频识别类(RFID、WIFI、蓝牙ZigBee、UWB)、图像信号和视频信号类、声音和超声音信号类、红外信号类、可见光信号类、磁场信号类等等。室内定位方法如果按照参数类型来进行分类可以分为接收信号强度(RSSI)、到达时间(TOA)、到达时差(TDOA)、到达角(AOA)、出发角角(AOD)。室内定位方法还可以分为基于测距和基于非测距的方法,基于测距的定位方法有三角定位法等等,基于非测距的定位方法有RSSI指纹法等等。三角测量定位法是一种最为经典的定位方法。三角测量定位法通过至少两个测量装置测量与被定位物体之间的距离,通过对三角形的三条边进行计算,就可以的出被定位物体的准确位置。现代的GPS(全球定位系统)的定位原理也可以看作是三角测量定位法的一种。通过测量被定位物体与全球定位系统中的至少四颗卫星距离,可以获得被定位物体的三维坐标。在蓝牙定位的过程中,三角测量定位法也是一种很好的实现办法,通过布置至少两个蓝牙信标,用手机测量获得两个蓝牙信标的接收信号强度(RSSI),根据接收信号强度(RSSI)在不同距离的值的不同,可以计算出手机与两个蓝牙信标之间的距离。再结合已知的两个蓝牙信标之间的距离,就可以使用三角测量定位法准确定位到手机的距离。在蓝牙5.1中出现了蓝牙定向的概念。蓝牙定向是准确辨别蓝牙方向的有效方法。在蓝牙5.1中的定位方法有到达角度(AOA)方法和出发角度(AOD)方法。到达角度(AOA)方法需要蓝牙信号接收器上面安装了至少两根天线。通过计算不同接收器上的不同接收时间,结合不同接收器间的距离,通过测量不同接收器之间的相位差,可以得到发射器的到达角度,从而实现定位。出发角度(AOD)方法与到达角度(AOA)方法相类似,只是出发角度(AOD)方法需要蓝牙信号发射器上至少安装了两根天线。通过发射器上的天线发出信号,接收器会接收不同相位值的信道数据,通过对相位值的判断可以得到发射器的出发角度,从而实现定位。3.3.2跟随系统的设计方案(1)方案一:在小车上搭建与手机通信的蓝牙芯片和检测小车车身姿态的三轴传感器。小车通过车体前方的超声波测距模块测量出人与小车间的实时距离。当人手持手机向前行走时,小车会与人之间保持相对稳定的实时距离。当人转向时,通过获取手机的陀螺仪数据确定人的转向角度。手机通过蓝牙串口通信将从陀螺仪获取的转向角度等等数据发送给小车,小车根据自身的三轴传感器转动相同的角度,通过单片机的计算和控制,从而实现小车对于人手持的手机跟随的目的。(2)方案二:在小车上布置安装一个或者两个蓝牙信标和蓝牙通信芯片。人手持手机行走。手机通过对于蓝牙信标和蓝牙通信芯片进行信号强度的测量,计算出手机与蓝牙信标和蓝牙通信芯片的实时距离。通过三角定位算法算出小车与人手持的手机的相对位置,利用三轴传感器判断小车需要的转向角度。通过单片机的计算和控制,从而达成小车对于人手持的手机跟随的目的。(3)方案三:在小车上布置安装两个超声波接收装置,组装一个人手持的超声波发射装置。小车通过超声波接收装置接收到超声波后计算得出实时的距离。如果人手持着超声波发射装置转向后,安装在小车两侧的两个接收装置的到信号会产生不同。通过对于超声波发射装置和两个超声波接收装置的距离不同,获取小车应该向哪个方向转向的信息。通过单片机的计算和控制,从而实现小车对于人手持的手机跟随的目的。从理论的角度上来说,以上3个方案都是可以实现的。但是由于本人能力有限,只实现了第三个方案的内容。如图3.3所示为小车超声波自动跟随的流程图。小车通过蓝牙串口接收到自动跟随的指令。打开超声波发射端电源,超声波发射端持续发射超声波。小车车前方的2个超声波接收端持续接收超声波,将接收到的超声波数据经过一定的处理后可以转换为距离信息。通过对左右两端的距离信息进行比较,可以判断出小车需要进行的动作。当小车左端接收到的距离数据大于小车右端接收到的距离数据时,可以判断出超声波的发射位置在小车的偏右侧,所以小车应该向右转向直到小车两接收端接收到的距离数据相等。当小车左端接收到的距离数据小于小车右端接收到的距离数据时,可以判断出超声波的发射位置在小车的偏左侧,所以小车应该向左转向直到小车两接收端接收到的距离数据相等。当小车两接收端接收到的数据相等时,通过比较距离数据与预先设定的跟随阈值的大小,判断小车应该前进还是后退。图3.3超声波自动跟随流程图3.4软件调试工具3.4.1KeiluVision5(mdk5.14)如图2.1所示,Keil系列编程软件单片机C语言软件开发系统。在安装Keil5软件时,如果windows用户名是中文,可能会导致在编译代码过程中出现错误,所以一定要将windows系统用户名修改为英文。如果安装路径中含有中文,也可能会导致在编译代码过程中出现错误,所以安装路径也不能含有中文。另外在安装完成后一定要设置环境变量,否则代码将会无法编译。另外,在使用Keil5软件为STM32单片机编写程序时,最好使用库函数编程。因为写代码速度会更快,写出的代码更加可靠,bug更少。图2.1keil软件3.4.2串口调试工具单片机多功能调试助手,是由粤嵌温工开发的一款单片机多功能调试软件,可以用来调试超声波模块等串口通信模块,也可以为蓝牙模块进行设置波特率、设置工作模式等工作。通过对单片机多功能调试助手中串口连接电脑的端口号进行设置,可以选择单片机与电脑连接的串口。通过对调试助手中的波特率进行设置,可以调节串口的数据传输速率。通过对调试助手中的数据位和停止位进行配置,可以调节不同串口的不同通信格式。在数据显示界面上调试助手还可以使用十六进制的格式显示数据,能够给更加方便快速的让用户调试串口发送的数据,当调试助手通过串口接收到的数据量比较庞大时可以打开文本输出模式进行大量数据的显示,防止调试助手在数据显示的过程中发生错误引发调试助手的崩溃。图2.2单片机多功能调试助手

4总结与展望4.1设计总结该自动跟随智能小车的定位与跟随系统是基于STM32F407单片机的核心控制,使用keil5和串口调试工具结合开发出的在一定程度上实现了智能化的系统。利用红外测距传感器和超声波测距传感器实现自动跟随智能小车对于行驶过程中的自动避障系统。利用蓝牙信标和人手持的手机实现小车的定位系统。利用STM32F407单片机的计算与控制,实现小车对于目标的自动跟随。4.2设计创新(1)采用红外测距传感器和超声波测距传感器相结合的方式控制小车的自动避障;(2)采用蓝牙信标的方式实现小车对于目标物体的自动定位;(3)通过蓝牙串口实现小车于手机之间的无线通信,实现小车的手动蓝牙控制;(4)当开启自动跟随模式时小车跟随物体自动行驶。(5)使用超声波实现小车对于被跟随物体的三角定位4.3设计不足红外避障传感器受自然光线的影响较大,很容易误触发避障系统;由于电流的波动,亦会造成红外避障系统的误触发;通过蓝牙信标的定位方式需要2个蓝牙信标间的距离比较远,使得这种方案比较难以在小车上实现;超声波模块和红外模块的耗电量很大,14500电池无法支持小车长时间运作。4.4展望在未来的生活中,智能化、自动化的控制实现一定是无处不在的。室内定位的技术目前仍处于不断发展的过程当中。越来越多的智能产品实现了定位的功能,尽管有的精度不高。这个作品是本人经过长时间的不断地学习和不断地努力后所制作出来的。虽然我们的毕业设计作品在一定程度上实现了自动跟随的功能,但是作品中还是存在非常多的不足之处。这体现出了一个好的产品不仅仅需要优秀的设计,还需要在生产过程中的不断完善、调试、优化,这样的过程绝对不是短时间就能够完成的,需要设计人员努力的不断付出汗水与时间。这一次的毕业设计亦是对于大学四年时间所学知识的综合运用,可以巩固在大学中学习到的知识,为即将投入的工作做出必要的铺垫。

参考文献戴朝典.Peloton公司的智能动力和车队排列系统[J].汽车与配件,2016,(52)何佳,戎辉,王文扬等.百度谷歌无人驾驶汽车发展综述[J].汽车电器,2017,(12)牛煜荣.基于RSSI的WLAN室内定位的研究与实现[D].2016.董春荣.基于RSSI-LQI的ZigBee定位算法的研究与设计[D].2017.李晓龙.基于UWB的移动定位算法研究[D].2016.林品云.关于红外线测温仪的若干问题[J].科技展望,2015,(10)蒋危平,田建新,王子诚.数字化超声波探伤仪十五年技术进展[J].无损检测,2004,26(3)刘旸.亚克力材料在复杂装置中的一体化设计与应用——以港深双年展参展作品"微巨构"装置为例[J].江西建材,2017,(21)肖晓兰,黄海峰,刘利河,等.一种可自动跟随手机行走的小车[J].机械工程与自动化刘丰华,张远见,吴永辉.无线局域定位系统的分析与设计[J].电子产品世界,2004,(19)蒋伟.基于GPS定位的智能跟随小车设计[J].数字化用户,2018,24(7):44-45.刘伟丽.自动跟随小车控制系统[D].吉林:长春理工大学,2013.聂宪波,邵泽箭,巩文文,等.基于单片机自动跟随小车的设计与制作[J].山东工业技术,2015,(4):158-158.刘金海,王勃凡,周龙,等.基于UWB技术实现自动跟随小车设计[J].农业装备与车辆工程,2019,57(12):8-12.夏晓枫,杨佳丽,宁维阳,等.超声波定位智能小车自动跟随算法[J].科技资讯张萍,陈国壮,候云雷,等.基于Android平台的WIFI遥控智能小车的设计[J].计算机测量与控制,2018,26(6):189-191,195.

齐新皓,苏秀云,马国,等.单目视觉自动跟随小车的设计[J].机器人技术与应用,2018,(5):42-44.蔡磊,周亭亭,郭云鹏,等.基于超声波定位的智能跟随小车[J].电子测量技术刘硕,师五喜.智能小车编队避障控制系统设计[J].自动化与仪表,2019,34(1):28-32.HongguiLi,MariaTrocan,DimitriGalayko.Virtualfingerprintandtwo-wayranging-basedBluetooth3DindoorpositioningwithRSSIdifferenceanddistanceratio[J].JournalofElectromagneticWavesandApplications,2019,33(16).

谢辞转眼间大学四年便已经过去,毕业设计是大学四年中的最后一门课。经过了数个月的不断努力后,毕业设计的工作逐渐进入了尾声。自动跟随智能小车的基本功能都已经实现了。尽管没有达到最好的预期目标,但是至少我很尽力的去完成了这一次的毕业设计。非常感谢尹新彦老师在毕业设计最开始的定题阶段中对我的支持,老师说毕业设计就是要做自己最感兴趣的东西。在毕业设计的制作过程中,尹新彦老师在理论方面提供了很多实用的建议,老师还在论文撰写方面给了很多的有用指导,往往能够为迷茫的我指明一条前进的道路。我还要感谢我的组员对我的支持和陪伴,是在我们的共同努力下,才做出了这次的毕业设计。另外,我还要感谢同班同学黄浩榕在我的毕业设计过程中为我提供的帮助。十分感谢大学四年里所有教过我的老师们。老师们不仅教会了我许多的知识,还教会了我学习的方法和许多为人处世的道理。最后,感谢各位答辩老师们在百忙之中抽出时间来阅读我的论文,祝所有老师们都身体健康,工作顺利。

附录附录1操作界面主系统主要程序代码#include"stm32f4xx.h"#include"sys.h"#include<stdio.h>staticEXTI_InitTypeDef EXTI_InitStructure;staticGPIO_InitTypeDef GPIO_InitStructure;staticNVIC_InitTypeDef NVIC_InitStructure;staticUSART_InitTypeDef USART_InitStructure;staticuint8_tk;staticuint8_tnum1=0;staticuint8_tnum2=0;staticuint8_tdat_right[2];staticuint8_tdat_left[2];staticuint16_tdistance_right;staticuint16_tdistance_left;#pragmaimport(__use_no_semihosting_swi)struct__FILE{inthandle;/*Addwhateveryouneedhere*/};FILE__stdout;FILE__stdin;//printf重定向intfputc(intch,FILE*f){ USART_SendData(USART3,ch); while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET); USART_ClearFlag(USART3,USART_FLAG_TXE); returnch;}void_sys_exit(intreturn_code){}voiddelay_us(uint32_tn){ SysTick->CTRL=0; //DisableSysTick,关闭系统定时器 SysTick->LOAD=(168*n)-1;//配置计数值(168*n)-1~0 SysTick->VAL=0; //Clearcurrentvalueaswellascountflag SysTick->CTRL=5; //EnableSysTicktimerwithprocessorclock while((SysTick->CTRL&0x10000)==0);//Waituntilcountflagisset SysTick->CTRL=0; //DisableSysTick }voiddelay_ms(uint32_tn){ while(n--) { SysTick->CTRL=0; //DisableSysTick,关闭系统定时器 SysTick->LOAD=(168000)-1; //配置计数值(168000)-1~0 SysTick->VAL=0; //Clearcurrentvalueaswellascountflag SysTick->CTRL=5; //EnableSysTicktimerwithprocessorclock while((SysTick->CTRL&0x10000)==0);//Waituntilcountflagisset } SysTick->CTRL=0; //DisableSysTick }voidcar_work(void); //车轮初始化voidcar_stop(void);//停车voidcar_go(void);//前进voidcar_back(void);//后退voidcar_left1(void);//左转1voidcar_right1(void);//右转1voidcar_left2(void);//左转2 voidcar_right2(void);//右转2voidcar_auto(void);//自动跟随voidcar_auto(void) //自动跟随{ while(30<=distance_left&&distance_left<6800&&30<=distance_right&&distance_right<6800) { if(distance_left>=distance_right+5) { car_right1(); } if(distance_right>=distance_left+5) { car_left1(); } else { if(distance_left>1200&&distance_right>1200) { car_go(); } else { car_stop(); } } if(k==0) break; } car_stop();}voidcar_work(void)//PD0、PD1、PD2、PD3引脚初始化{ //端口D硬件时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); //配置PD0、PD1、PD2、PD3为输出模式 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; //第0、1、2、3根引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //输出模式 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽输出,增加输出电流能力。 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//高速响应 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //没有使能上下拉电阻 GPIO_Init(GPIOD,&GPIO_InitStructure);}voidcar_stop(void)//停车{ GPIO_ResetBits(GPIOD,GPIO_Pin_0);//控制右边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_1); GPIO_ResetBits(GPIOD,GPIO_Pin_2);//控制左边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_3);}voidcar_go(void)//前进{ GPIO_SetBits(GPIOD,GPIO_Pin_0);//控制右边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_1); GPIO_SetBits(GPIOD,GPIO_Pin_2);//控制左边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_3);}voidcar_back(void)//后退{ GPIO_SetBits(GPIOD,GPIO_Pin_1);//控制右边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_0); GPIO_SetBits(GPIOD,GPIO_Pin_3);//控制左边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_2);}voidcar_left1(void)//左转1{ GPIO_SetBits(GPIOD,GPIO_Pin_0);//控制右边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_1); GPIO_ResetBits(GPIOD,GPIO_Pin_2);//控制左边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_3);}voidcar_right1(void)//右转1{ GPIO_ResetBits(GPIOD,GPIO_Pin_0);//控制右边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_1); GPIO_SetBits(GPIOD,GPIO_Pin_2);//控制左边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_3);}voidcar_left2(void)//左转2{ GPIO_SetBits(GPIOD,GPIO_Pin_0);//控制右边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_1); GPIO_SetBits(GPIOD,GPIO_Pin_3);//控制左边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_2);}voidcar_right2(void)//右转2{ GPIO_SetBits(GPIOD,GPIO_Pin_1);//控制右边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_2); GPIO_SetBits(GPIOD,GPIO_Pin_2);//控制左边轮胎 GPIO_ResetBits(GPIOD,GPIO_Pin_3);}//外部中断初始化voidexti0_init(void){ //使能(打开)端口A的硬件时钟,就是对端口A供电 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能系统配置时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE); //配置PA0引脚为输入模式 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //第0根引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN; //输入模式 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//高速响应 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //没有使能上下拉电阻 GPIO_Init(GPIOA,&GPIO_InitStructure); //将PA0和EXTI0连接在一起 SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); //外部中断的配置 EXTI_InitStructure.EXTI_Line=EXTI_Line0; //外部中断0 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //中断 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发,用于识别电平的变低 EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能 EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn; //外部中断0的请求通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority=0; //响应优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能该通道 NVIC_Init(&NVIC_InitStructure); }//串口1初始化voidusart1_init(uint32_tbaud){ //打开PA硬件时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //打开串口1硬件时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //配置PA9和PA10为复用功能模式 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9|GPIO_Pin_10; //第910根引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //多功能模式 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽输出,增加输出电流能力。 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//高速响应 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //没有使能上下拉电阻 GPIO_Init(GPIOA,&GPIO_InitStructure); //将PA9和PA10引脚连接到串口1的硬件 GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //配置串口1相关参数:波特率、无校验位、8位数据位、1个停止位 USART_InitStructure.USART_BaudRate=baud; //波特率 USART_InitStructure.USART_WordLength=USART_WordLength_8b; //8位数据位 USART_InitStructure.USART_StopBits=USART_StopBits_1; //1个停止位 USART_InitStructure.USART_Parity=USART_Parity_No; //无奇偶校验 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //无硬件流控制 USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //允许收发数据 USART_Init(USART1,&USART_InitStructure); //配置串口1的中断触发方法:接收一个字节触发中断 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //配置串口1的中断优先级 NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); //使能串口1工作 USART_Cmd(USART1,ENABLE);}//串口3初始化voidusart3_init(uint32_tbaud){ //打开PB硬件时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //打开串口3硬件时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //配置PB10和PB11为复用功能模式 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11; //第1011根引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //多功能模式 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽输出,增加输出电流能力。 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//高速响应 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //没有使能上下拉电阻 GPIO_Init(GPIOB,&GPIO_InitStructure); //将PB10和PB11引脚连接到串口3的硬件 GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3); //配置串口3相关参数:波特率、无校验位、8位数据位、1个停止位 USART_InitStructure.USART_BaudRate=baud; //波特率 USART_InitStructure.USART_WordLength=USART_WordLength_8b; //8位数据位 USART_InitStructure.USART_StopBits=USART_StopBits_1; //1个停止位 USART_InitStructure.USART_Parity=USART_Parity_No; //无奇偶校验 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //无硬件流控制 USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //允许收发数据 USART_Init(USART3,&USART_InitStructure); //配置串口3的中断触发方法:接收一个字节触发中断 USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); //配置串口3的中断优先级 NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); //使能串口3工作 USART_Cmd(USART3,ENABLE);}//串口2初始化voidusart2_init(uint32_tbaud){ //打开PB硬件时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //打开串口2硬件时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //配置PA2和PA3为复用功能模式 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3; //第23根引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //多功能模式 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //推挽输出,增加输出电流能力。 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//高速响应 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //没有使能上下拉电阻 GPIO_Init(GPIOA,&GPIO_InitStructure); //将PA2和PA3引脚连接到串口2的硬件 GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //配置串口2相关参数:波特率、无校验位、8位数据位、1个停止位 USART_InitStructure.USART_BaudRate=baud; //波特率 USART_InitStructure.USART_WordLength=USART_WordLength_8b; //8位数据位 USART_InitStructure.USART_StopBits=USART_StopBits_1; //1个停止位 USART_InitStructure.USART_Parity=USART_Parity_No; //无奇偶校验 USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; //无硬件流控制 USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; //允许收发数据 USART_Init(USART2,&USART_InitStructure); //配置串口2的中断触发方法:接收一个字节触发中断 USART_ITConfig(USART2,USART_IT_RXNE,ENABLE); //配置串口2的中断优先级 NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02; NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02; NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; NVIC_Init(&NVIC_InitStructure); //使能串口2工作 USART_Cmd(USART2,ENABLE);}voidusart3_send_str(char*str){ char*p=str; while(p&&(*p!='\0')) { USART_SendData(USART3,*p); while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET); p++; }}//蓝牙模块配置voidbluetooth_config(void){ //使能端口E的硬件时钟,端口E才能工作,说白了就是对端口E上电 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE); //配置硬件,配置GPIO,端口E,第6个引脚 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6; //第6个引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT; //输出模式 GPIO_InitStructure.GPIO_Speed=GPIO_High_Speed; //引脚高速工作,收到指令立即工作;缺点:功耗高 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; //增加输出电流的能力 GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; //不需要上下拉电阻 GPIO_Init(GPIOE,&GPIO_InitStructure); //PE6引脚输出高电平,即EN引脚为高电平,进入AT指令模式 PEout(6)=1; delay_ms(500); delay_ms(500); usart3_send_str("AT\r\n"); delay_ms(500); usart3_send_str("AT\r\n"); delay_ms(500); usart3_s

温馨提示

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

评论

0/150

提交评论