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