APP下载

电动自行车定位监测系统的设计

2022-05-20张东钦黄丽萍李慧敏

物联网技术 2022年5期
关键词:串口北斗单片机

张东钦,黄丽萍,李慧敏,汪 源

(1.三亚学院 理工学院,海南 三亚 572022;2.三亚市第一中学,海南 三亚 572022)

0 引 言

北斗卫星导航系统(BeiDou Navigation Satellite System,BDS)是我国以社会经济发展情况和国家安全为出发点,自主研发并独立运行的一套全球卫星导航系统。随着中国卫星技术的不断完善,如今BDS已被广泛应用于国家安全、货物运输、车辆监测等方面。早在20世纪80年代,我国就开始了基于GPS的汽车监测系统的研究。如今信息化时代已经来临,在卫星技术不断完善、4G网络普遍运用以及地理信息系统(GIS)技术逐渐成熟的条件下,国内的汽车监测系统迅速发展。截至2020年,我国电动自行车保有量已经超过2.5亿辆。在电动自行车数量飞快增长的同时,交通安全、电动自行车失窃等问题也随之而来。在这种车辆剧增和通信发达的数字化环境下,对电动自行车的定位监测系统的需要尤为迫切。如何将车辆定位技术和无线传输数据技术融合到车辆监测中,成为了交通现代化管理的关键。

本文以北斗卫星导航系统的定位技术为核心,利用STM32F103RBT6单片机作为数据处理模块,通过GPRS通信技术将定位数据无线传输到基于OneNET的车辆监测平台,在百度地图上查看车辆的实时位置,实现车辆监测的效果。

1 系统的总体设计

电动自行车监测系统分别由车载终端和车辆监测平台两部分组成,其中车辆监测平台又包括服务器和百度地图。车载终端利用北斗卫星定位模块获取车的定位信息,再进行卫星定位数据的提取和使用无线传输技术发送有效定位数据到服务器,服务器接收到数据流后进行解析,将解析的数据作为百度地图的输入参数,最后在车辆监测平台的百度地图上查看车辆定位。系统设计要求如下:(1)定位数据的查看:用户能够通过监测平台的百度地图实时查看车辆位置;(2)定位数据的备份:用户能够下载已上传到服务器端的定位数据,进行数据备份,方便用户日后查阅;(3)监测平台百度地图的操作:除了放大和缩小地图的这些基本功能,用户还能查看标记点的坐标和信息。

监测系统的车载终端首先要提供稳定的供电让各模块处于工作状态,其次是北斗卫星定位信息的收集和处理,最后是数据的无线传输;车辆监测平台的服务器主要是解析车载终端发送的数据,并将解析数据作为地图的输入参数在车辆监测平台的百度地图上显示。系统的总体功能框架如图1所示。

图1 系统总体功能框架

根据系统框架的基本功能,本设计的车载终端由稳压电路、北斗卫星定位模块、控制核心MCU以及GPRS无线通信模块这四部分构成。其中稳压电路负责各模块的供电;北斗卫星定位模块负责卫星信息的收集;MCU负责卫星定位信息的提取和处理;GPRS无线通信模块负责传输服务器端接收的有效数据。车载终端基本框架如图2所示。其中,北斗卫星定位模块选择ATGM332D-5N-31的高性能全星座定位模块,该模块不仅支持北斗和GPS卫星导航系统的单系统定位,也支持多种组合的卫星系统定位。控制核心MCU选用32位的STM32F103RBT6最小系统单片机,它可以直接处理32位的定位数据,能够满足本设计的高精度的要求。GPRS无线通信模块采用基于MT2503D芯片开发的四频段GSM/GPRS引擎的多功能模块MC20,将数据进行无线传输。

图2 车载终端基本框架

监测平台选择OneNET,它是由中国移动打造的PaaS(Platform as a Service)物联网开放平台,不仅向用户提供服务器的公网IP,还提供了硬件的开发接口,可以避免独自开发物联网APP的难题。根据物联网开发平台提供的硬件接口和接入协议,可以使用车载终端控制GPRS无线通信模块以HTTP协议连接开发平台,达成将数据传到云端的效果。

2 车载终端硬件设计

车载终端负责实现北斗定位数据的获取、数据的解析和数据的无线传输三个功能。根据设计需求,需要在各集成模块的基础上进行设计,使各模块能够相互配合工作。车载终端的硬件部分主要负责使用北斗卫星定位模块来获取车的定位数据,并经过处理后将数据通过GPRS模块发送到服务器。整个硬件分为稳压电路、主控模块、定位模块、通信模块四部分。车载终端使用LM7805作为稳压电路,采用STM32F103RBT6最小系统板作为主控MCU,通过串口通信的方式与ATGM332D-5N-31定位模块和MC20通信模块配合实现对车的监测功能。

硬件系统设计框架如图3所示。其中稳压电路主要负责为各模块提供工作状态的电压;ATGM332D-5N-31定位模块使用射频天线接收到定位数据后,将定位数据通过串口UART1传输数据给STM32F103RBT6主控芯片,主控芯片再通过串口UART2将数据传给MC20通信模块进行GPRS数据传输。为方便硬件模块的调试和拆卸,在使用立创EDA画本系统原理图时,用各模块排针对应的排母来代替各模块的引脚。

图3 硬件系统设计框架(实线表示电源线,虚线表示数据线)

3 软件设计

STM32F103RBT6最小系统作为本设计的主控MCU,外接ATGM332D-5N-31模块和MC20模块,主要负责让各个模块相互配合工作。本设计的程序开发主要使用KeilµVision5进行编写,主程序的设计流程如图4所示。可以看出,整个程序的基本流程是:首先对单片机最小系统各模块进行初始化,使单片机的各个外设模块能够正常工作;之后是对定位数据的提取和解析,通过编程设置函数判断的条件,若数据完成提取和解析后再进行发送。在编程中使用软复位的方法进行报错,在调试的时候通过这种方法可以提高效率。

图4 主程序设计流程

3.1 串口初始化

由于本设计的MCU在每次串口接收到数据时就要进行处理,串口中断是必不可少的一个功能,因此要想让串口UART1符合本设计获取定位数据的要求,在初始化方面就要把串口的RX的GPIO接口配置成浮空输入模式。中断方面使用上文所描述的结构体配置方法来配置串口UART1的NVIC,设置中断抢占优先级和子优先级。最后再将串口UART1配置成9600波特率、8位数据字长、1个停止位、无奇偶校验位、无硬件控制流的收发模式。串口UART2与串口UART1的配制方法大同小异,只是在GPIO接口和名称上略微作调整。中断也是抢占优先级3和子优先级3,一般在程序上不发生冲突,由于中断级别相同,在两种中断同时发生的情况下,不会相互打断中断,会等到一个中断执行完成后再执行另一个中断。

3.2 LED指示灯初始化

LED的初始化较为简单,只须配置LED所对应的GPIO的结构体GPIO_InitTypeDef,将LED对应的具体GPIO接口设置成推挽输出方式以及端口速度为50 MHz,最后调用初始化函数GPIO_Init()即可。

3.3 定位信息的获取

NMEA 0183是美国国家海洋电子协会(National Marine Electronics Association)为海用电子设备制定的标准格式。目前已成了GPS/BDS导航设备统一的RTCM(Radio Technical Commission for Maritime services)标准协议。该协议包含了7种定位数据形式,其中“推荐定位信息”$BDRMC中包含了时间、经纬度等多种有效的信息,具体信息见表1所列。

表1 $BDRMC数据分析表

由于定位模块连接着UART1的RX接口,因此须将定位数据的提取函数写在串口中断函数中。首先定义一个8位的变量res作为串口接收的每帧数据和数据缓冲的数组USART_RX_BUF[];再编写一个结构体_SaveData来储存定位数据中的各项参数。

程序如下所示:

设计好结构体后就是串口中断函数的编写,其目的是将$BDRMC的这条语句提取出来。硬件方面定位模块的TX引脚和单片机串口UART1的RX是相连接的,因此调用官方函数库中的USART_GetITStatus()函数,以UART1引脚地址USART1和接收中断标志位USART_IT_RXNE作为变量输入来判断单片机的接收引脚RX是否接收到消息。

若接收到消息就利用USART_ReceiveData()将收到的消息赋值给先前定义的变量res。由于串口接收的数据是一帧一帧接收的,在每一次接收到一帧数据的同时也需要将变量res赋值给接收缓冲数组USART_RX_BUF[];当接收到的字符为$时,利用if函数,让变量pointl=0,再通过pointl++这条语句将整条数据存进缓冲数组。

使 用 if(USART_RX_BUF[0] == '$' && USART_RX_BUF[4] == 'M' && USART_RX_BUF[5] == 'C'),这条语句能够实现筛选$BDRMC这条关键定位信息。当串口接收到字符为“/n”即换行字符时,就说明此时的$BDRMC信息已经全部存入缓冲数组,可以将结构体内的GPS_Buffer用初始化函数memset()清零,再使用复制函数memcpy()将缓冲数组区的数据存到GPS_Buffe里保存并将isGetData置位。再次使用初始化函数memset()把缓冲数组的数据清零,让变量pointl重新变为0后开始下次串口的接收。

结构体的获取定位标志位isGetData置位后,就能够跳入主函数的parseGpsBuffer()函数,此函数的功能是将$BDRMC定位信息里的各个参数填写到结构体。

首先是定义两个指针subString和subStringNext,代表的是地址。通过if (Save_Data.isGetData)后将定位标志位isGetData复位,然后进入for(i)循环(i从0开始)。第一次for循环使用subString = strstr(Save_Data.GPS_Buffer, ",")语句,目的是获取结构体中GPS_Buffer的数据第一个逗号“,”的位置。第二次for循环中使用subString++来获取逗号后的有效数字的位置。利用 subStringNext = strstr(subString, ",")语句来获取第二个逗号的位置,通过switch(i)函数配合复制 函 数“case 1 :memcpy(Save_Data.UTCTime, subString,subStringNext - subString);break; ”的语句将两逗号之间的数据写进Save_Data结构体的UTCTime中。

写入成功后利用递归算法将subStringNext赋值subString,并使解析数据标志位isParseData置位。如此循环六次直到将结构体的最后参数E_W数据写入,再使用if语句判断usefullBuffer[0]存的是A还是V来给结构体中的isUsefull赋值,最后printGpsBuffer()函数的功能是打印结构体的各个成员的数据,并将其发送到服务器。

3.4 定位信息的传输

数据的处理和发送主要在postGpsDataToOneNet()函数中,其输入变量包括服务器端API_KEY、设备ID以及结构体Save_Data的经纬度参数。

要想将数据传输到服务器,首先就要对经纬度进行处理,本设计的经度处理函数和纬度处理函数分别为longitudeToOnenetFormat()和 latitudeToOnenetFormat()。两个函数的转换原理相同,Save_Data结构体中存储的是十进制的坐标,而OneNet物联网开发平台接收的是ddmm.mmmm(度,分,秒)格式的经纬度,其中分和秒为六十进制,度为十进制。两个函数就是利用编程算法把十进制的定位数据转换成十进制(度)和六十进制(分,秒)的定位数据,以结构体的longitude和latitude作为变量输入,输出OneNet物联网开发平台识别的定位数据。

处理完数据后通过串口UART2对MC20模块发送AT指令进行连接,连接成功后再使用测试的AT指令进行数据传输设置,然后开始HTTP的报头操作,最后将转换好的经纬度坐标转换成JSON字符串形式,以HTTP协议进行数据的传输,发送到服务器端。

4 实际测试

系统测试将定位模块和MC20模块集成到一块PCB板上,在测试时通过稳压电路为系统提供12 V直流电压的输入,同时使用有源天线对北斗卫星信号进行收集。图5(a)为在学校操场进行测试并在监测平台中实时显示的定位信息和运动轨迹,图5(b)为系统测试同步到手机端某跑步软件显示的运动轨迹,通过两图的对比说明了本定位监测系统功能的实现效果和稳定性。

图5 系统测试定位信息及运动轨迹

5 结 语

利用北斗定位技术、单片机技术、无线通信技术设计了一款电动自行车定位监测系统。利用北斗卫星定位模块实现定位数据的获取,通过单片机串口UART1将数据传输到STM32F103RBT6最小系统单片机;然后STM32F103RBT6最小系统单片机接收到数据后进行有效定位数据的提取和处理,再通过串口UART2将处理的定位数据发到GPRS模块;最后编写AT指令让GPRS模块将接收到的定位数据发送到车辆监测平台,平台接收到数据后开始解析其数据流,并在监测平台的百度地图上显示电动自行车的实时定位和运动轨迹。

猜你喜欢

串口北斗单片机
北斗和它的N种变身
北斗时钟盘
浅谈AB PLC串口跟RFID传感器的通讯应用
基于单片机的SPWM控制逆变器的设计与实现
“北斗”离我们有多远
基于单片机的层次渐变暖灯的研究
基于单片机的便捷式LCF测量仪
中国的北斗 世界的北斗
USB接口的多串口数据并行接收方法探索
基于蓝牙串口适配器的GPS接收机与AutoCAD的实时无线通信