周孟強,童忠晴,李剛
(湖北文理學(xué)院物理與電子工程學(xué)院,湖北襄陽,441053)
全球定位系統(tǒng)GPS是由美國國防部研制的全球?qū)Ш叫l(wèi)星系統(tǒng),于1993年正式投入使用,為用戶提供連續(xù)、高精度的三維位置、速度和時間信息及精密導(dǎo)航。我國的北斗衛(wèi)星導(dǎo)航系統(tǒng)于2004年開始建設(shè),從2011開始對我國和周邊地區(qū)提供測試服務(wù),2012年底開始對亞太大部分地區(qū)提供衛(wèi)星導(dǎo)航服務(wù)。利用此設(shè)計有很廣泛的擴(kuò)展性,可用于兒童和老人的行蹤掌控,公路巡檢,貴重貨物跟蹤,追蹤與勤務(wù)派遣,私人偵探工具,個人財物跟蹤,寵物跟蹤,野生動物追蹤,貨運業(yè),汽車防盜,自行車防盜,電動車防盜,摩托車防盜,銀行運鈔車,軍警演習(xí)操控,檢調(diào)追蹤,公務(wù)車管理等眾多方面。
本設(shè)計以STM32F107開發(fā)板為基礎(chǔ),結(jié)合AN1502 ATK-NEO-6M GPS模塊,實現(xiàn)STM32單片機(jī)和GPS模塊的通信;通過GPS模塊實現(xiàn)定位,STM32對GPS模塊輸入的信息進(jìn)行讀取和處理,然后在通過OLED顯示得到的定位信息。該系統(tǒng)的總體結(jié)構(gòu)框圖如圖1所示。
該設(shè)計還有如下附加功能:定位狀態(tài)顯示(衛(wèi)星顆數(shù)、UTC時間等),SD卡數(shù)據(jù)存儲功能;可以通過RS232串口傳輸坐標(biāo)和時間至PC機(jī),并通過上位機(jī)軟件實現(xiàn)路徑計算和網(wǎng)絡(luò)地圖定位。
整個系統(tǒng)由STM32單片機(jī)、AN1502 ATK-NEO-6M GPS模塊、OLED、PC機(jī)等構(gòu)成。系統(tǒng)總體結(jié)構(gòu)圖如圖2所示。
圖2 總體系統(tǒng)結(jié)構(gòu)
本設(shè)計所選用的STM32是基于ARM? Cortex? M 處理器內(nèi)核的 32位閃存微控制器,為MCU用戶開辟了一個全新的自由開發(fā)空間,并提供了各種易于上手的軟硬件輔助工具。STM32 MCU有融高性能、實時性強、功耗低、電壓低等眾多優(yōu)點,同時保持集成度高和便于開發(fā)的特點,能方便的完成各種中小型項目。
ATK-NEO-6M模塊,是一款高性能的GPS模塊,模塊核心采用的是UBLOX生產(chǎn)的NEO-6M模組,具有50個通道,追蹤靈敏度高,測量輸出頻率高等特性。
ATK-NEO-6M模塊具有以下特點:①模塊采用UBLOX公司生產(chǎn)的NEO-6M 模組,具有小體積和高性能的特點。②模塊使用方便,只通過串口就可設(shè)置各種參數(shù)并保存在EEPROM里。③模塊有高增益的LNA芯片和陶瓷天線等,有很強的搜索衛(wèi)星的能力。④模塊兼容3.3V和5V的電平,能外接各種單片機(jī)系統(tǒng)。⑤模塊因為有IPX接口,可以連接各種有源天線,有很強的適應(yīng)能力。⑥模塊自帶備用電池,可以掉電保持星歷數(shù)據(jù)。ATK-NEO-6M 模塊輸出GPS定位數(shù)據(jù)采用的是NMEA-0183協(xié)議,并通過UBX協(xié)議用串口來控制模塊。ATK-NEO-6MGPS模塊的原理圖如圖3所示。
圖 3 ATK—NEO—6M GPS 模塊原理圖
OLED的全稱是有機(jī)發(fā)光二極管(Organic Light-Emitting Diode),又被稱為有機(jī)電激光顯 示(Organic Electroluminesence Display,OELD)。OLED具備自發(fā)光,不需背光源、對比度高、厚度薄、視角廣、反應(yīng)速度快、可用于撓曲性面板、使用溫度范圍廣、構(gòu)造及制程較簡單等優(yōu)點,被廣泛應(yīng)用于各種平面顯示。OLED是本設(shè)計最重要的人機(jī)接口之一。
OLED具有尺寸小、高分辨率、擁有多種接口方式、工作電壓小等特點。OLED模塊的原理圖如圖4所示。
圖4 OLED 模塊原理圖
該模塊采用8×2的2.54排針與外部相連,一共有16個引腳,在本設(shè)計中,我們只使用了16條線里的15條線,其中15號線是懸空的。在已使用的15條線中,1號線接地、2號線接3.3V的電源,3~14和16號線是信號線。但在不同的模式下我們所使用的信號線的數(shù)量是不一樣的,在I2C模式下我們僅僅使用了2條,而在8080模式下,我們卻使用了全部的信號線。但無論在什么模式下,我們所使用的復(fù)位線RST是共同的,RST線上的低電平會導(dǎo)致OLED復(fù)位,因此在每次初始化之前,都應(yīng)該將復(fù)位線RST置于低電平。
北斗/GPS的功能是把經(jīng)緯度、高度、速度、溫度、面積、衛(wèi)星數(shù)、UTC時間等信息在液晶上顯示。本系統(tǒng)是通過GPS模塊實現(xiàn)定位,STM32對GPS模塊輸入的信息進(jìn)行讀取和處理,然后在通過OLED顯示得到的定位信息。因此,本設(shè)計處理程序主要由GPS數(shù)據(jù)處理程序、OLED數(shù)據(jù)處理程序等組成。
開啟GPS模塊后,接收NMEA-0183格式的信息,提取其中的“GPRMC”語句,若之有效,則提取其中的時間、日期、經(jīng)緯度;無效則使用RTC提供的時間和日期。再將時間轉(zhuǎn)換成東八區(qū)的時間,判斷位置是否匹配在進(jìn)行顯示。具體數(shù)據(jù)流程圖如圖5所示。
這部分代碼主要分為2個部分,一部分采用NMEA-0183協(xié)議解析GPS定位數(shù)據(jù),另一部分是利用UBX協(xié)議對模塊進(jìn)行配置。
OLED模塊的控制器是SSD1306。SSD1306的顯存的大小為128×64bit,SSD1306將這些顯存分一共分成了8個部分。這樣就組成了128×64大小的點陣。在讀寫操作的時候會出現(xiàn)一個問題,因為該模塊是按字節(jié)來寫入的,所以當(dāng)我們只使用寫方式來使用這個模塊的時候,每次都要寫入8個點,這樣的話就必須要清楚所設(shè)置的點的字節(jié)的每個位當(dāng)前的狀態(tài)是0還是1,否則后寫入的數(shù)據(jù)會覆蓋掉之前所表現(xiàn)的狀態(tài),結(jié)果就會出現(xiàn)混亂,該顯示的點沒有顯示出來,不該顯示的點顯示了出來。如果在讀的模式下,我們可以事先讀出來要寫入的那個字節(jié)的當(dāng)前的狀況,在修改了要改的位的狀態(tài)后再寫入GRAM,這樣就能避免在只寫操作下出現(xiàn)的問題。但是這需要能讀GRAM,該模塊在3線或4線SPI模式下不僅不支持讀,而且該方式的速度也很慢。
為了避免出現(xiàn)這種問題,采用的辦法是在STM32的內(nèi)部建立一個OLED的GRAM(共128×8個字節(jié)),那么在每次修改數(shù)據(jù)的時候,只用修改STM32上的GRAM,修改完成之后可以一次性把STM32上建立的GRAM的信息寫入到OLED模塊的GRAM。SSD1306初始化框圖如圖6所示。
OLED模塊顯示步驟如下:①設(shè)置STM32與OLED模塊相連接的IO。②初始化OLED模塊。啟動OLED模塊要對控制OLED模塊的相關(guān)寄存器進(jìn)行初始化,為接下來的步驟做鋪墊。③通過函數(shù)處理字符和數(shù)字并在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:信息結(jié)構(gòu)體
圖5 GPS數(shù)據(jù)處理流程圖
圖6 SSD1306初始化框圖
//buf:首地址
該部分是NMEA-0183協(xié)議解析GPS數(shù)據(jù)的部分函數(shù),通過數(shù)逗號法來解析。NMEA-0183協(xié)議是以$GPGSV格式作為開頭,固定輸出格式,因此不論是否有數(shù)據(jù)輸出,都會有逗號存在,而且有效數(shù)據(jù)都是以“*”結(jié)尾,所以,我們利用NMEA-0183協(xié)議的數(shù)據(jù)格式,采用數(shù)逗號的方法,來解析收到的GPS數(shù)據(jù)。本代碼實現(xiàn)了GPGGA解析、GPGSA解析、GPGSV解析、GPRMC解析和GPVTG解析。
基于STM32的北斗/GPS定位系統(tǒng)的設(shè)計,能實現(xiàn)基本的定位功能,也能讓我們熟練的掌握GPS模塊和OLED模塊的原理和使用方法,同時增強對STM32單片機(jī)的理解和使用能力。這項設(shè)計貼近我們的生活,同時有很強的延展性,而且具有功耗小、實用性強、可開發(fā)性強等優(yōu)點。