張東欽,黃麗萍,李慧敏,汪 源
(1.三亞學院 理工學院,海南 三亞 572022;2.三亞市第一中學,海南 三亞 572022)
北斗衛星導航系統(BeiDou Navigation Satellite System,BDS)是我國以社會經濟發展情況和國家安全為出發點,自主研發并獨立運行的一套全球衛星導航系統。隨著中國衛星技術的不斷完善,如今BDS已被廣泛應用于國家安全、貨物運輸、車輛監測等方面。早在20世紀80年代,我國就開始了基于GPS的汽車監測系統的研究。如今信息化時代已經來臨,在衛星技術不斷完善、4G網絡普遍運用以及地理信息系統(GIS)技術逐漸成熟的條件下,國內的汽車監測系統迅速發展。截至2020年,我國電動自行車保有量已經超過2.5億輛。在電動自行車數量飛快增長的同時,交通安全、電動自行車失竊等問題也隨之而來。在這種車輛劇增和通信發達的數字化環境下,對電動自行車的定位監測系統的需要尤為迫切。如何將車輛定位技術和無線傳輸數據技術融合到車輛監測中,成為了交通現代化管理的關鍵。
本文以北斗衛星導航系統的定位技術為核心,利用STM32F103RBT6單片機作為數據處理模塊,通過GPRS通信技術將定位數據無線傳輸到基于OneNET的車輛監測平臺,在百度地圖上查看車輛的實時位置,實現車輛監測的效果。
電動自行車監測系統分別由車載終端和車輛監測平臺兩部分組成,其中車輛監測平臺又包括服務器和百度地圖。車載終端利用北斗衛星定位模塊獲取車的定位信息,再進行衛星定位數據的提取和使用無線傳輸技術發送有效定位數據到服務器,服務器接收到數據流后進行解析,將解析的數據作為百度地圖的輸入參數,最后在車輛監測平臺的百度地圖上查看車輛定位。系統設計要求如下:(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協議連接開發平臺,達成將數據傳到云端的效果。
車載終端負責實現北斗定位數據的獲取、數據的解析和數據的無線傳輸三個功能。根據設計需求,需要在各集成模塊的基礎上進行設計,使各模塊能夠相互配合工作。車載終端的硬件部分主要負責使用北斗衛星定位模塊來獲取車的定位數據,并經過處理后將數據通過GPRS模塊發送到服務器。整個硬件分為穩壓電路、主控模塊、定位模塊、通信模塊四部分。車載終端使用LM7805作為穩壓電路,采用STM32F103RBT6最小系統板作為主控MCU,通過串口通信的方式與ATGM332D-5N-31定位模塊和MC20通信模塊配合實現對車的監測功能。
硬件系統設計框架如圖3所示。其中穩壓電路主要負責為各模塊提供工作狀態的電壓;ATGM332D-5N-31定位模塊使用射頻天線接收到定位數據后,將定位數據通過串口UART1傳輸數據給STM32F103RBT6主控芯片,主控芯片再通過串口UART2將數據傳給MC20通信模塊進行GPRS數據傳輸。為方便硬件模塊的調試和拆卸,在使用立創EDA畫本系統原理圖時,用各模塊排針對應的排母來代替各模塊的引腳。

圖3 硬件系統設計框架(實線表示電源線,虛線表示數據線)
STM32F103RBT6最小系統作為本設計的主控MCU,外接ATGM332D-5N-31模塊和MC20模塊,主要負責讓各個模塊相互配合工作。本設計的程序開發主要使用KeilμVision5進行編寫,主程序的設計流程如圖4所示。可以看出,整個程序的基本流程是:首先對單片機最小系統各模塊進行初始化,使單片機的各個外設模塊能夠正常工作;之后是對定位數據的提取和解析,通過編程設置函數判斷的條件,若數據完成提取和解析后再進行發送。在編程中使用軟復位的方法進行報錯,在調試的時候通過這種方法可以提高效率。

圖4 主程序設計流程
由于本設計的MCU在每次串口接收到數據時就要進行處理,串口中斷是必不可少的一個功能,因此要想讓串口UART1符合本設計獲取定位數據的要求,在初始化方面就要把串口的RX的GPIO接口配置成浮空輸入模式。中斷方面使用上文所描述的結構體配置方法來配置串口UART1的NVIC,設置中斷搶占優先級和子優先級。最后再將串口UART1配置成9600波特率、8位數據字長、1個停止位、無奇偶校驗位、無硬件控制流的收發模式。串口UART2與串口UART1的配制方法大同小異,只是在GPIO接口和名稱上略微作調整。中斷也是搶占優先級3和子優先級3,一般在程序上不發生沖突,由于中斷級別相同,在兩種中斷同時發生的情況下,不會相互打斷中斷,會等到一個中斷執行完成后再執行另一個中斷。
LED的初始化較為簡單,只須配置LED所對應的GPIO的結構體GPIO_InitTypeDef,將LED對應的具體GPIO接口設置成推挽輸出方式以及端口速度為50 MHz,最后調用初始化函數GPIO_Init()即可。
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()函數的功能是打印結構體的各個成員的數據,并將其發送到服務器。
數據的處理和發送主要在postGpsDataToOneNet()函數中,其輸入變量包括服務器端API_KEY、設備ID以及結構體Save_Data的經緯度參數。
要想將數據傳輸到服務器,首先就要對經緯度進行處理,本設計的經度處理函數和緯度處理函數分別為longitudeToOnenetFormat()和 latitudeToOnenetFormat()。兩個函數的轉換原理相同,Save_Data結構體中存儲的是十進制的坐標,而OneNet物聯網開發平臺接收的是ddmm.mmmm(度,分,秒)格式的經緯度,其中分和秒為六十進制,度為十進制。兩個函數就是利用編程算法把十進制的定位數據轉換成十進制(度)和六十進制(分,秒)的定位數據,以結構體的longitude和latitude作為變量輸入,輸出OneNet物聯網開發平臺識別的定位數據。
處理完數據后通過串口UART2對MC20模塊發送AT指令進行連接,連接成功后再使用測試的AT指令進行數據傳輸設置,然后開始HTTP的報頭操作,最后將轉換好的經緯度坐標轉換成JSON字符串形式,以HTTP協議進行數據的傳輸,發送到服務器端。
系統測試將定位模塊和MC20模塊集成到一塊PCB板上,在測試時通過穩壓電路為系統提供12 V直流電壓的輸入,同時使用有源天線對北斗衛星信號進行收集。圖5(a)為在學校操場進行測試并在監測平臺中實時顯示的定位信息和運動軌跡,圖5(b)為系統測試同步到手機端某跑步軟件顯示的運動軌跡,通過兩圖的對比說明了本定位監測系統功能的實現效果和穩定性。

圖5 系統測試定位信息及運動軌跡
利用北斗定位技術、單片機技術、無線通信技術設計了一款電動自行車定位監測系統。利用北斗衛星定位模塊實現定位數據的獲取,通過單片機串口UART1將數據傳輸到STM32F103RBT6最小系統單片機;然后STM32F103RBT6最小系統單片機接收到數據后進行有效定位數據的提取和處理,再通過串口UART2將處理的定位數據發到GPRS模塊;最后編寫AT指令讓GPRS模塊將接收到的定位數據發送到車輛監測平臺,平臺接收到數據后開始解析其數據流,并在監測平臺的百度地圖上顯示電動自行車的實時定位和運動軌跡。