張東欽,黃麗萍,李慧敏,汪 源
(1.三亞學(xué)院 理工學(xué)院,海南 三亞 572022;2.三亞市第一中學(xué),海南 三亞 572022)
北斗衛(wèi)星導(dǎo)航系統(tǒng)(BeiDou Navigation Satellite System,BDS)是我國(guó)以社會(huì)經(jīng)濟(jì)發(fā)展情況和國(guó)家安全為出發(fā)點(diǎn),自主研發(fā)并獨(dú)立運(yùn)行的一套全球衛(wèi)星導(dǎo)航系統(tǒng)。隨著中國(guó)衛(wèi)星技術(shù)的不斷完善,如今BDS已被廣泛應(yīng)用于國(guó)家安全、貨物運(yùn)輸、車(chē)輛監(jiān)測(cè)等方面。早在20世紀(jì)80年代,我國(guó)就開(kāi)始了基于GPS的汽車(chē)監(jiān)測(cè)系統(tǒng)的研究。如今信息化時(shí)代已經(jīng)來(lái)臨,在衛(wèi)星技術(shù)不斷完善、4G網(wǎng)絡(luò)普遍運(yùn)用以及地理信息系統(tǒng)(GIS)技術(shù)逐漸成熟的條件下,國(guó)內(nèi)的汽車(chē)監(jiān)測(cè)系統(tǒng)迅速發(fā)展。截至2020年,我國(guó)電動(dòng)自行車(chē)保有量已經(jīng)超過(guò)2.5億輛。在電動(dòng)自行車(chē)數(shù)量飛快增長(zhǎng)的同時(shí),交通安全、電動(dòng)自行車(chē)失竊等問(wèn)題也隨之而來(lái)。在這種車(chē)輛劇增和通信發(fā)達(dá)的數(shù)字化環(huán)境下,對(duì)電動(dòng)自行車(chē)的定位監(jiān)測(cè)系統(tǒng)的需要尤為迫切。如何將車(chē)輛定位技術(shù)和無(wú)線傳輸數(shù)據(jù)技術(shù)融合到車(chē)輛監(jiān)測(cè)中,成為了交通現(xiàn)代化管理的關(guān)鍵。
本文以北斗衛(wèi)星導(dǎo)航系統(tǒng)的定位技術(shù)為核心,利用STM32F103RBT6單片機(jī)作為數(shù)據(jù)處理模塊,通過(guò)GPRS通信技術(shù)將定位數(shù)據(jù)無(wú)線傳輸?shù)交贠neNET的車(chē)輛監(jiān)測(cè)平臺(tái),在百度地圖上查看車(chē)輛的實(shí)時(shí)位置,實(shí)現(xiàn)車(chē)輛監(jiān)測(cè)的效果。
電動(dòng)自行車(chē)監(jiān)測(cè)系統(tǒng)分別由車(chē)載終端和車(chē)輛監(jiān)測(cè)平臺(tái)兩部分組成,其中車(chē)輛監(jiān)測(cè)平臺(tái)又包括服務(wù)器和百度地圖。車(chē)載終端利用北斗衛(wèi)星定位模塊獲取車(chē)的定位信息,再進(jìn)行衛(wèi)星定位數(shù)據(jù)的提取和使用無(wú)線傳輸技術(shù)發(fā)送有效定位數(shù)據(jù)到服務(wù)器,服務(wù)器接收到數(shù)據(jù)流后進(jìn)行解析,將解析的數(shù)據(jù)作為百度地圖的輸入?yún)?shù),最后在車(chē)輛監(jiān)測(cè)平臺(tái)的百度地圖上查看車(chē)輛定位。系統(tǒng)設(shè)計(jì)要求如下:(1)定位數(shù)據(jù)的查看:用戶能夠通過(guò)監(jiān)測(cè)平臺(tái)的百度地圖實(shí)時(shí)查看車(chē)輛位置;(2)定位數(shù)據(jù)的備份:用戶能夠下載已上傳到服務(wù)器端的定位數(shù)據(jù),進(jìn)行數(shù)據(jù)備份,方便用戶日后查閱;(3)監(jiān)測(cè)平臺(tái)百度地圖的操作:除了放大和縮小地圖的這些基本功能,用戶還能查看標(biāo)記點(diǎn)的坐標(biāo)和信息。
監(jiān)測(cè)系統(tǒng)的車(chē)載終端首先要提供穩(wěn)定的供電讓各模塊處于工作狀態(tài),其次是北斗衛(wèi)星定位信息的收集和處理,最后是數(shù)據(jù)的無(wú)線傳輸;車(chē)輛監(jiān)測(cè)平臺(tái)的服務(wù)器主要是解析車(chē)載終端發(fā)送的數(shù)據(jù),并將解析數(shù)據(jù)作為地圖的輸入?yún)?shù)在車(chē)輛監(jiān)測(cè)平臺(tái)的百度地圖上顯示。系統(tǒng)的總體功能框架如圖1所示。
圖1 系統(tǒng)總體功能框架
根據(jù)系統(tǒng)框架的基本功能,本設(shè)計(jì)的車(chē)載終端由穩(wěn)壓電路、北斗衛(wèi)星定位模塊、控制核心MCU以及GPRS無(wú)線通信模塊這四部分構(gòu)成。其中穩(wěn)壓電路負(fù)責(zé)各模塊的供電;北斗衛(wèi)星定位模塊負(fù)責(zé)衛(wèi)星信息的收集;MCU負(fù)責(zé)衛(wèi)星定位信息的提取和處理;GPRS無(wú)線通信模塊負(fù)責(zé)傳輸服務(wù)器端接收的有效數(shù)據(jù)。車(chē)載終端基本框架如圖2所示。其中,北斗衛(wèi)星定位模塊選擇ATGM332D-5N-31的高性能全星座定位模塊,該模塊不僅支持北斗和GPS衛(wèi)星導(dǎo)航系統(tǒng)的單系統(tǒng)定位,也支持多種組合的衛(wèi)星系統(tǒng)定位??刂坪诵腗CU選用32位的STM32F103RBT6最小系統(tǒng)單片機(jī),它可以直接處理32位的定位數(shù)據(jù),能夠滿足本設(shè)計(jì)的高精度的要求。GPRS無(wú)線通信模塊采用基于MT2503D芯片開(kāi)發(fā)的四頻段GSM/GPRS引擎的多功能模塊MC20,將數(shù)據(jù)進(jìn)行無(wú)線傳輸。
圖2 車(chē)載終端基本框架
監(jiān)測(cè)平臺(tái)選擇OneNET,它是由中國(guó)移動(dòng)打造的PaaS(Platform as a Service)物聯(lián)網(wǎng)開(kāi)放平臺(tái),不僅向用戶提供服務(wù)器的公網(wǎng)IP,還提供了硬件的開(kāi)發(fā)接口,可以避免獨(dú)自開(kāi)發(fā)物聯(lián)網(wǎng)APP的難題。根據(jù)物聯(lián)網(wǎng)開(kāi)發(fā)平臺(tái)提供的硬件接口和接入?yún)f(xié)議,可以使用車(chē)載終端控制GPRS無(wú)線通信模塊以HTTP協(xié)議連接開(kāi)發(fā)平臺(tái),達(dá)成將數(shù)據(jù)傳到云端的效果。
車(chē)載終端負(fù)責(zé)實(shí)現(xiàn)北斗定位數(shù)據(jù)的獲取、數(shù)據(jù)的解析和數(shù)據(jù)的無(wú)線傳輸三個(gè)功能。根據(jù)設(shè)計(jì)需求,需要在各集成模塊的基礎(chǔ)上進(jìn)行設(shè)計(jì),使各模塊能夠相互配合工作。車(chē)載終端的硬件部分主要負(fù)責(zé)使用北斗衛(wèi)星定位模塊來(lái)獲取車(chē)的定位數(shù)據(jù),并經(jīng)過(guò)處理后將數(shù)據(jù)通過(guò)GPRS模塊發(fā)送到服務(wù)器。整個(gè)硬件分為穩(wěn)壓電路、主控模塊、定位模塊、通信模塊四部分。車(chē)載終端使用LM7805作為穩(wěn)壓電路,采用STM32F103RBT6最小系統(tǒng)板作為主控MCU,通過(guò)串口通信的方式與ATGM332D-5N-31定位模塊和MC20通信模塊配合實(shí)現(xiàn)對(duì)車(chē)的監(jiān)測(cè)功能。
硬件系統(tǒng)設(shè)計(jì)框架如圖3所示。其中穩(wěn)壓電路主要負(fù)責(zé)為各模塊提供工作狀態(tài)的電壓;ATGM332D-5N-31定位模塊使用射頻天線接收到定位數(shù)據(jù)后,將定位數(shù)據(jù)通過(guò)串口UART1傳輸數(shù)據(jù)給STM32F103RBT6主控芯片,主控芯片再通過(guò)串口UART2將數(shù)據(jù)傳給MC20通信模塊進(jìn)行GPRS數(shù)據(jù)傳輸。為方便硬件模塊的調(diào)試和拆卸,在使用立創(chuàng)EDA畫(huà)本系統(tǒng)原理圖時(shí),用各模塊排針對(duì)應(yīng)的排母來(lái)代替各模塊的引腳。
圖3 硬件系統(tǒng)設(shè)計(jì)框架(實(shí)線表示電源線,虛線表示數(shù)據(jù)線)
STM32F103RBT6最小系統(tǒng)作為本設(shè)計(jì)的主控MCU,外接ATGM332D-5N-31模塊和MC20模塊,主要負(fù)責(zé)讓各個(gè)模塊相互配合工作。本設(shè)計(jì)的程序開(kāi)發(fā)主要使用KeilμVision5進(jìn)行編寫(xiě),主程序的設(shè)計(jì)流程如圖4所示。可以看出,整個(gè)程序的基本流程是:首先對(duì)單片機(jī)最小系統(tǒng)各模塊進(jìn)行初始化,使單片機(jī)的各個(gè)外設(shè)模塊能夠正常工作;之后是對(duì)定位數(shù)據(jù)的提取和解析,通過(guò)編程設(shè)置函數(shù)判斷的條件,若數(shù)據(jù)完成提取和解析后再進(jìn)行發(fā)送。在編程中使用軟復(fù)位的方法進(jìn)行報(bào)錯(cuò),在調(diào)試的時(shí)候通過(guò)這種方法可以提高效率。
圖4 主程序設(shè)計(jì)流程
由于本設(shè)計(jì)的MCU在每次串口接收到數(shù)據(jù)時(shí)就要進(jìn)行處理,串口中斷是必不可少的一個(gè)功能,因此要想讓串口UART1符合本設(shè)計(jì)獲取定位數(shù)據(jù)的要求,在初始化方面就要把串口的RX的GPIO接口配置成浮空輸入模式。中斷方面使用上文所描述的結(jié)構(gòu)體配置方法來(lái)配置串口UART1的NVIC,設(shè)置中斷搶占優(yōu)先級(jí)和子優(yōu)先級(jí)。最后再將串口UART1配置成9600波特率、8位數(shù)據(jù)字長(zhǎng)、1個(gè)停止位、無(wú)奇偶校驗(yàn)位、無(wú)硬件控制流的收發(fā)模式。串口UART2與串口UART1的配制方法大同小異,只是在GPIO接口和名稱上略微作調(diào)整。中斷也是搶占優(yōu)先級(jí)3和子優(yōu)先級(jí)3,一般在程序上不發(fā)生沖突,由于中斷級(jí)別相同,在兩種中斷同時(shí)發(fā)生的情況下,不會(huì)相互打斷中斷,會(huì)等到一個(gè)中斷執(zhí)行完成后再執(zhí)行另一個(gè)中斷。
LED的初始化較為簡(jiǎn)單,只須配置LED所對(duì)應(yīng)的GPIO的結(jié)構(gòu)體GPIO_InitTypeDef,將LED對(duì)應(yīng)的具體GPIO接口設(shè)置成推挽輸出方式以及端口速度為50 MHz,最后調(diào)用初始化函數(shù)GPIO_Init()即可。
NMEA 0183是美國(guó)國(guó)家海洋電子協(xié)會(huì)(National Marine Electronics Association)為海用電子設(shè)備制定的標(biāo)準(zhǔn)格式。目前已成了GPS/BDS導(dǎo)航設(shè)備統(tǒng)一的RTCM(Radio Technical Commission for Maritime services)標(biāo)準(zhǔn)協(xié)議。該協(xié)議包含了7種定位數(shù)據(jù)形式,其中“推薦定位信息”$BDRMC中包含了時(shí)間、經(jīng)緯度等多種有效的信息,具體信息見(jiàn)表1所列。
表1 $BDRMC數(shù)據(jù)分析表
由于定位模塊連接著UART1的RX接口,因此須將定位數(shù)據(jù)的提取函數(shù)寫(xiě)在串口中斷函數(shù)中。首先定義一個(gè)8位的變量res作為串口接收的每幀數(shù)據(jù)和數(shù)據(jù)緩沖的數(shù)組USART_RX_BUF[];再編寫(xiě)一個(gè)結(jié)構(gòu)體_SaveData來(lái)儲(chǔ)存定位數(shù)據(jù)中的各項(xiàng)參數(shù)。
程序如下所示:
設(shè)計(jì)好結(jié)構(gòu)體后就是串口中斷函數(shù)的編寫(xiě),其目的是將$BDRMC的這條語(yǔ)句提取出來(lái)。硬件方面定位模塊的TX引腳和單片機(jī)串口UART1的RX是相連接的,因此調(diào)用官方函數(shù)庫(kù)中的USART_GetITStatus()函數(shù),以UART1引腳地址USART1和接收中斷標(biāo)志位USART_IT_RXNE作為變量輸入來(lái)判斷單片機(jī)的接收引腳RX是否接收到消息。
若接收到消息就利用USART_ReceiveData()將收到的消息賦值給先前定義的變量res。由于串口接收的數(shù)據(jù)是一幀一幀接收的,在每一次接收到一幀數(shù)據(jù)的同時(shí)也需要將變量res賦值給接收緩沖數(shù)組USART_RX_BUF[];當(dāng)接收到的字符為$時(shí),利用if函數(shù),讓變量pointl=0,再通過(guò)pointl++這條語(yǔ)句將整條數(shù)據(jù)存進(jìn)緩沖數(shù)組。
使 用 if(USART_RX_BUF[0] == '$' && USART_RX_BUF[4] == 'M' && USART_RX_BUF[5] == 'C'),這條語(yǔ)句能夠?qū)崿F(xiàn)篩選$BDRMC這條關(guān)鍵定位信息。當(dāng)串口接收到字符為“/n”即換行字符時(shí),就說(shuō)明此時(shí)的$BDRMC信息已經(jīng)全部存入緩沖數(shù)組,可以將結(jié)構(gòu)體內(nèi)的GPS_Buffer用初始化函數(shù)memset()清零,再使用復(fù)制函數(shù)memcpy()將緩沖數(shù)組區(qū)的數(shù)據(jù)存到GPS_Buffe里保存并將isGetData置位。再次使用初始化函數(shù)memset()把緩沖數(shù)組的數(shù)據(jù)清零,讓變量pointl重新變?yōu)?后開(kāi)始下次串口的接收。
結(jié)構(gòu)體的獲取定位標(biāo)志位isGetData置位后,就能夠跳入主函數(shù)的parseGpsBuffer()函數(shù),此函數(shù)的功能是將$BDRMC定位信息里的各個(gè)參數(shù)填寫(xiě)到結(jié)構(gòu)體。
首先是定義兩個(gè)指針subString和subStringNext,代表的是地址。通過(guò)if (Save_Data.isGetData)后將定位標(biāo)志位isGetData復(fù)位,然后進(jìn)入for(i)循環(huán)(i從0開(kāi)始)。第一次for循環(huán)使用subString = strstr(Save_Data.GPS_Buffer, ",")語(yǔ)句,目的是獲取結(jié)構(gòu)體中GPS_Buffer的數(shù)據(jù)第一個(gè)逗號(hào)“,”的位置。第二次for循環(huán)中使用subString++來(lái)獲取逗號(hào)后的有效數(shù)字的位置。利用 subStringNext = strstr(subString, ",")語(yǔ)句來(lái)獲取第二個(gè)逗號(hào)的位置,通過(guò)switch(i)函數(shù)配合復(fù)制 函 數(shù)“case 1 :memcpy(Save_Data.UTCTime, subString,subStringNext - subString);break; ”的語(yǔ)句將兩逗號(hào)之間的數(shù)據(jù)寫(xiě)進(jìn)Save_Data結(jié)構(gòu)體的UTCTime中。
寫(xiě)入成功后利用遞歸算法將subStringNext賦值subString,并使解析數(shù)據(jù)標(biāo)志位isParseData置位。如此循環(huán)六次直到將結(jié)構(gòu)體的最后參數(shù)E_W數(shù)據(jù)寫(xiě)入,再使用if語(yǔ)句判斷usefullBuffer[0]存的是A還是V來(lái)給結(jié)構(gòu)體中的isUsefull賦值,最后printGpsBuffer()函數(shù)的功能是打印結(jié)構(gòu)體的各個(gè)成員的數(shù)據(jù),并將其發(fā)送到服務(wù)器。
數(shù)據(jù)的處理和發(fā)送主要在postGpsDataToOneNet()函數(shù)中,其輸入變量包括服務(wù)器端API_KEY、設(shè)備ID以及結(jié)構(gòu)體Save_Data的經(jīng)緯度參數(shù)。
要想將數(shù)據(jù)傳輸?shù)椒?wù)器,首先就要對(duì)經(jīng)緯度進(jìn)行處理,本設(shè)計(jì)的經(jīng)度處理函數(shù)和緯度處理函數(shù)分別為longitudeToOnenetFormat()和 latitudeToOnenetFormat()。兩個(gè)函數(shù)的轉(zhuǎn)換原理相同,Save_Data結(jié)構(gòu)體中存儲(chǔ)的是十進(jìn)制的坐標(biāo),而OneNet物聯(lián)網(wǎng)開(kāi)發(fā)平臺(tái)接收的是ddmm.mmmm(度,分,秒)格式的經(jīng)緯度,其中分和秒為六十進(jìn)制,度為十進(jìn)制。兩個(gè)函數(shù)就是利用編程算法把十進(jìn)制的定位數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制(度)和六十進(jìn)制(分,秒)的定位數(shù)據(jù),以結(jié)構(gòu)體的longitude和latitude作為變量輸入,輸出OneNet物聯(lián)網(wǎng)開(kāi)發(fā)平臺(tái)識(shí)別的定位數(shù)據(jù)。
處理完數(shù)據(jù)后通過(guò)串口UART2對(duì)MC20模塊發(fā)送AT指令進(jìn)行連接,連接成功后再使用測(cè)試的AT指令進(jìn)行數(shù)據(jù)傳輸設(shè)置,然后開(kāi)始HTTP的報(bào)頭操作,最后將轉(zhuǎn)換好的經(jīng)緯度坐標(biāo)轉(zhuǎn)換成JSON字符串形式,以HTTP協(xié)議進(jìn)行數(shù)據(jù)的傳輸,發(fā)送到服務(wù)器端。
系統(tǒng)測(cè)試將定位模塊和MC20模塊集成到一塊PCB板上,在測(cè)試時(shí)通過(guò)穩(wěn)壓電路為系統(tǒng)提供12 V直流電壓的輸入,同時(shí)使用有源天線對(duì)北斗衛(wèi)星信號(hào)進(jìn)行收集。圖5(a)為在學(xué)校操場(chǎng)進(jìn)行測(cè)試并在監(jiān)測(cè)平臺(tái)中實(shí)時(shí)顯示的定位信息和運(yùn)動(dòng)軌跡,圖5(b)為系統(tǒng)測(cè)試同步到手機(jī)端某跑步軟件顯示的運(yùn)動(dòng)軌跡,通過(guò)兩圖的對(duì)比說(shuō)明了本定位監(jiān)測(cè)系統(tǒng)功能的實(shí)現(xiàn)效果和穩(wěn)定性。
圖5 系統(tǒng)測(cè)試定位信息及運(yùn)動(dòng)軌跡
利用北斗定位技術(shù)、單片機(jī)技術(shù)、無(wú)線通信技術(shù)設(shè)計(jì)了一款電動(dòng)自行車(chē)定位監(jiān)測(cè)系統(tǒng)。利用北斗衛(wèi)星定位模塊實(shí)現(xiàn)定位數(shù)據(jù)的獲取,通過(guò)單片機(jī)串口UART1將數(shù)據(jù)傳輸?shù)絊TM32F103RBT6最小系統(tǒng)單片機(jī);然后STM32F103RBT6最小系統(tǒng)單片機(jī)接收到數(shù)據(jù)后進(jìn)行有效定位數(shù)據(jù)的提取和處理,再通過(guò)串口UART2將處理的定位數(shù)據(jù)發(fā)到GPRS模塊;最后編寫(xiě)AT指令讓GPRS模塊將接收到的定位數(shù)據(jù)發(fā)送到車(chē)輛監(jiān)測(cè)平臺(tái),平臺(tái)接收到數(shù)據(jù)后開(kāi)始解析其數(shù)據(jù)流,并在監(jiān)測(cè)平臺(tái)的百度地圖上顯示電動(dòng)自行車(chē)的實(shí)時(shí)定位和運(yùn)動(dòng)軌跡。