周孟強,童忠晴,李剛
(湖北文理學院物理與電子工程學院,湖北襄陽,441053)
全球定位系統GPS是由美國國防部研制的全球導航衛星系統,于1993年正式投入使用,為用戶提供連續、高精度的三維位置、速度和時間信息及精密導航。我國的北斗衛星導航系統于2004年開始建設,從2011開始對我國和周邊地區提供測試服務,2012年底開始對亞太大部分地區提供衛星導航服務。利用此設計有很廣泛的擴展性,可用于兒童和老人的行蹤掌控,公路巡檢,貴重貨物跟蹤,追蹤與勤務派遣,私人偵探工具,個人財物跟蹤,寵物跟蹤,野生動物追蹤,貨運業,汽車防盜,自行車防盜,電動車防盜,摩托車防盜,銀行運鈔車,軍警演習操控,檢調追蹤,公務車管理等眾多方面。
本設計以STM32F107開發板為基礎,結合AN1502 ATK-NEO-6M GPS模塊,實現STM32單片機和GPS模塊的通信;通過GPS模塊實現定位,STM32對GPS模塊輸入的信息進行讀取和處理,然后在通過OLED顯示得到的定位信息。該系統的總體結構框圖如圖1所示。
該設計還有如下附加功能:定位狀態顯示(衛星顆數、UTC時間等),SD卡數據存儲功能;可以通過RS232串口傳輸坐標和時間至PC機,并通過上位機軟件實現路徑計算和網絡地圖定位。
整個系統由STM32單片機、AN1502 ATK-NEO-6M GPS模塊、OLED、PC機等構成。系統總體結構圖如圖2所示。

圖2 總體系統結構
本設計所選用的STM32是基于ARM? Cortex? M 處理器內核的 32位閃存微控制器,為MCU用戶開辟了一個全新的自由開發空間,并提供了各種易于上手的軟硬件輔助工具。STM32 MCU有融高性能、實時性強、功耗低、電壓低等眾多優點,同時保持集成度高和便于開發的特點,能方便的完成各種中小型項目。
ATK-NEO-6M模塊,是一款高性能的GPS模塊,模塊核心采用的是UBLOX生產的NEO-6M模組,具有50個通道,追蹤靈敏度高,測量輸出頻率高等特性。
ATK-NEO-6M模塊具有以下特點:①模塊采用UBLOX公司生產的NEO-6M 模組,具有小體積和高性能的特點。②模塊使用方便,只通過串口就可設置各種參數并保存在EEPROM里。③模塊有高增益的LNA芯片和陶瓷天線等,有很強的搜索衛星的能力。④模塊兼容3.3V和5V的電平,能外接各種單片機系統。⑤模塊因為有IPX接口,可以連接各種有源天線,有很強的適應能力。⑥模塊自帶備用電池,可以掉電保持星歷數據。ATK-NEO-6M 模塊輸出GPS定位數據采用的是NMEA-0183協議,并通過UBX協議用串口來控制模塊。ATK-NEO-6MGPS模塊的原理圖如圖3所示。

圖 3 ATK—NEO—6M GPS 模塊原理圖
OLED的全稱是有機發光二極管(Organic Light-Emitting Diode),又被稱為有機電激光顯 示(Organic Electroluminesence Display,OELD)。OLED具備自發光,不需背光源、對比度高、厚度薄、視角廣、反應速度快、可用于撓曲性面板、使用溫度范圍廣、構造及制程較簡單等優點,被廣泛應用于各種平面顯示。OLED是本設計最重要的人機接口之一。
OLED具有尺寸小、高分辨率、擁有多種接口方式、工作電壓小等特點。OLED模塊的原理圖如圖4所示。

圖4 OLED 模塊原理圖
該模塊采用8×2的2.54排針與外部相連,一共有16個引腳,在本設計中,我們只使用了16條線里的15條線,其中15號線是懸空的。在已使用的15條線中,1號線接地、2號線接3.3V的電源,3~14和16號線是信號線。但在不同的模式下我們所使用的信號線的數量是不一樣的,在I2C模式下我們僅僅使用了2條,而在8080模式下,我們卻使用了全部的信號線。但無論在什么模式下,我們所使用的復位線RST是共同的,RST線上的低電平會導致OLED復位,因此在每次初始化之前,都應該將復位線RST置于低電平。
北斗/GPS的功能是把經緯度、高度、速度、溫度、面積、衛星數、UTC時間等信息在液晶上顯示。本系統是通過GPS模塊實現定位,STM32對GPS模塊輸入的信息進行讀取和處理,然后在通過OLED顯示得到的定位信息。因此,本設計處理程序主要由GPS數據處理程序、OLED數據處理程序等組成。
開啟GPS模塊后,接收NMEA-0183格式的信息,提取其中的“GPRMC”語句,若之有效,則提取其中的時間、日期、經緯度;無效則使用RTC提供的時間和日期。再將時間轉換成東八區的時間,判斷位置是否匹配在進行顯示。具體數據流程圖如圖5所示。
這部分代碼主要分為2個部分,一部分采用NMEA-0183協議解析GPS定位數據,另一部分是利用UBX協議對模塊進行配置。
OLED模塊的控制器是SSD1306。SSD1306的顯存的大小為128×64bit,SSD1306將這些顯存分一共分成了8個部分。這樣就組成了128×64大小的點陣。在讀寫操作的時候會出現一個問題,因為該模塊是按字節來寫入的,所以當我們只使用寫方式來使用這個模塊的時候,每次都要寫入8個點,這樣的話就必須要清楚所設置的點的字節的每個位當前的狀態是0還是1,否則后寫入的數據會覆蓋掉之前所表現的狀態,結果就會出現混亂,該顯示的點沒有顯示出來,不該顯示的點顯示了出來。如果在讀的模式下,我們可以事先讀出來要寫入的那個字節的當前的狀況,在修改了要改的位的狀態后再寫入GRAM,這樣就能避免在只寫操作下出現的問題。但是這需要能讀GRAM,該模塊在3線或4線SPI模式下不僅不支持讀,而且該方式的速度也很慢。
為了避免出現這種問題,采用的辦法是在STM32的內部建立一個OLED的GRAM(共128×8個字節),那么在每次修改數據的時候,只用修改STM32上的GRAM,修改完成之后可以一次性把STM32上建立的GRAM的信息寫入到OLED模塊的GRAM。SSD1306初始化框圖如圖6所示。
OLED模塊顯示步驟如下:①設置STM32與OLED模塊相連接的IO。②初始化OLED模塊。啟動OLED模塊要對控制OLED模塊的相關寄存器進行初始化,為接下來的步驟做鋪墊。③通過函數處理字符和數字并在OLED模塊上顯示。
void GPS_Analyse(nmea_msg *gpsz,u8 *buf)
{ NMEA_GPGSV_Analyse(gpsz,buf); //GPGSV 解析
NMEA_GPGGA_Analyse(gpsz,buf); //GPGGA 解析
NMEA_GPGSA_Analyse(gpsz,buf); //GPGSA 解析
NMEA_GPRMC_Analyse(gpsz,buf);//GPRMC解析
NMEA_GPVTG_Analyse(gpsz,buf); //GPVTG 解析 }
//gpsz:nmea:信息結構體

圖5 GPS數據處理流程圖

圖6 SSD1306初始化框圖
//buf:首地址
該部分是NMEA-0183協議解析GPS數據的部分函數,通過數逗號法來解析。NMEA-0183協議是以$GPGSV格式作為開頭,固定輸出格式,因此不論是否有數據輸出,都會有逗號存在,而且有效數據都是以“*”結尾,所以,我們利用NMEA-0183協議的數據格式,采用數逗號的方法,來解析收到的GPS數據。本代碼實現了GPGGA解析、GPGSA解析、GPGSV解析、GPRMC解析和GPVTG解析。
基于STM32的北斗/GPS定位系統的設計,能實現基本的定位功能,也能讓我們熟練的掌握GPS模塊和OLED模塊的原理和使用方法,同時增強對STM32單片機的理解和使用能力。這項設計貼近我們的生活,同時有很強的延展性,而且具有功耗小、實用性強、可開發性強等優點。