全球定位系統(tǒng),小名GPS,大家一定不陌生,對于我們來說,它只有一個(gè)功能——定位,說白了,就是它能告訴我們現(xiàn)在所處的經(jīng)緯度。
雖然功能簡單,可由此衍生出來的應(yīng)用可就不少了,比如車載導(dǎo)航儀,不光能告訴我們現(xiàn)在在哪,還能告訴我們怎么去想去的地方;又如某個(gè)車隊(duì)要了解車輛的位置,那就給每個(gè)車子裝個(gè)GPS和無線收發(fā)設(shè)備,實(shí)時(shí)了解車輛信息。
圖12.1 GPS 記錄器的顯示界面
除此之外,還有些另類的應(yīng)用:比如 GPS授時(shí),所謂授時(shí),就是告訴我們現(xiàn)在幾點(diǎn)鐘了。雖然這有點(diǎn)大材小用的意思,不過這時(shí)間是相當(dāng)準(zhǔn)確的,可以精確到毫秒級,可以作為許多應(yīng)用的標(biāo)準(zhǔn)時(shí)鐘。再有就是今天我們要DIY的這個(gè)“GPS 記錄器”(見圖12.1)了,簡單來說,就是把我們所經(jīng)過的位置記錄下來的裝置。有人要問了,這有什么用呢?假如有驢友旅行過程中發(fā)現(xiàn)一段非常漂亮的路徑,路上湖光山色,風(fēng)景秀麗,他就可以利用這個(gè)裝置將路徑記錄下來和朋友們分享;假如探險(xiǎn)家外出探險(xiǎn),也可以利用這個(gè)裝置將路徑記錄下來,探險(xiǎn)結(jié)束后按原路安全返回。這,就是路徑回溯功能。
接下來讓我們了解一下必備的基礎(chǔ)知識(shí)。
GPS應(yīng)用已經(jīng)非常普及,現(xiàn)在很多手機(jī)都集成了GPS導(dǎo)航的功能,但是光有導(dǎo)航儀或者是GPS接收器是不行的,它還得有天上掛著的24顆衛(wèi)星作為信號(hào)的來源。這24顆衛(wèi)星就像草莓外面的籽一樣均勻地分布在地球上空,基本上在全球任意地方都能接收到GPS衛(wèi)星的信號(hào)。接收器根據(jù)衛(wèi)星發(fā)送的含有報(bào)文的信號(hào)來計(jì)算處于哪個(gè)位置。除此之外,我們不能將衛(wèi)星發(fā)射上去之后就不管了,所以,地球上還有地面中心對這些衛(wèi)星進(jìn)行監(jiān)控和數(shù)據(jù)修正。所以,完整的GPS系統(tǒng)包括 GPS衛(wèi)星、用戶接收端、地面監(jiān)控中心。
圖12.2 解析流程
上面講的GPS系統(tǒng)包含3部分,但是我們平時(shí)能接觸到的只有接收端。別看現(xiàn)在市面上各種牌子的導(dǎo)航儀和接收器數(shù)不勝數(shù),但上面用的GPS接收處理的芯片,全球就只有幾家公司有能力設(shè)計(jì)。其中,SiRF的芯片占據(jù)了民用市場七八成的份額,而目前用的比較多的是2004年發(fā)布的SiRFstar III,也就是所謂的“第3代”芯片。
接下來就是讓其他產(chǎn)品能“聽懂”從GPS芯片發(fā)出的數(shù)據(jù)是什么意思了,這時(shí)就需要有個(gè)通信協(xié)議。目前大部分GPS模塊采用的是NMEA0138協(xié)議。這個(gè)協(xié)議涵蓋了許多方面,GPS只是用到其中的一部分。
NMEA 是由美國全國海洋電子協(xié)會(huì)(The National Marine Electronics Association)制定的一套通信協(xié)議,是目前GPS最常見的通信協(xié)議。
以筆者的這個(gè)GPS 模塊為例,它將接收到的GPS衛(wèi)星信號(hào)解碼之后,通過串口以NMEA格式輸出,而用到的語句只有4個(gè):$GPGGA、$GPGSA、$GPGSV、$GPRMC,其中美元符號(hào)($)代表前綴,表示語句開始;GP 代表對象,代表用在 GPS 上;后面的GGA、GSA、GSV、RMC等是語句類型;每條語句的各個(gè)數(shù)據(jù)字段用半角逗號(hào)(,)分開;結(jié)尾為*XX,XX 是整個(gè)語句的校驗(yàn)和,以檢驗(yàn)收到的語句是否正確,代表回車和換行,表示該條語句結(jié)束。
我們所要做的就是將其接收下來,解析出我們要的數(shù)據(jù),再進(jìn)行下一步的應(yīng)用。
有了從模塊那里收到的數(shù)據(jù),接下來就是解析出里面有用的數(shù)據(jù)了。圖12.2所示為簡單的解析流程。
由于使用的是單片機(jī),所以最簡單的保存數(shù)據(jù)的方案便是使用SPI接口的Flash。另外由于NMEA語句是為了便于傳輸,采用字符形式,所以“身材”比較大,基本上每次的數(shù)據(jù)量在300~500字節(jié),由于Flash容量限制,不能將原始的NMEA 語句直接保存,所以我們自己定義了一個(gè)存儲(chǔ)格式,將其中有用的數(shù)據(jù)摘出來以二進(jìn)制的格式保存,這樣每次的數(shù)據(jù)順利地縮小了。在實(shí)際應(yīng)用中,每個(gè)點(diǎn)的數(shù)據(jù)只需要32字節(jié)。
說到這里,就必須請出神器——Google Earth了。這是谷歌出的一款可以看衛(wèi)星圖的軟件,可惜的是目前的6.0 版還不能直接支持 NMEA 協(xié)議。不過 Google Earth 支持另外一種語言,那就是KML。其全稱是Keyhole Markup Language,基于XML,同樣,它包含了很多復(fù)雜和高級的內(nèi)容,在此不再贅述,我們只需要用到其中一部分——在Google Earth 中畫路徑。
下面是一個(gè)最簡單的KML示例:
Path from GPS Logger V2
Path Name
這個(gè)KML文件被Google Earth讀取后會(huì)生成:
簡單來說,它告訴Google Earth,生成一個(gè)文檔,名字為Path from GPS Logger V2,其中有一個(gè)路徑,名字叫Path Name,路徑的是“連線”的模式,顏色為黃色(ff00ffff),線寬5像素,而具體經(jīng)緯度信息則包含在標(biāo)簽中,繼而Google Earth會(huì)根據(jù)其中的經(jīng)緯度信息繪制出一條折線。
所以,只要將之前保存的每個(gè)點(diǎn)的數(shù)據(jù),依次填充到標(biāo)簽中,則生成的KML被Google Earth讀取之后顯示的就是我們記錄的路徑。
至此,我們自制記錄器所需要了解的背景都全部知道了,接下來便是制作的過程了。
直接顯示當(dāng)前日期和時(shí)間、經(jīng)緯度、海拔、速度、方向等信息,顯示衛(wèi)星信號(hào)強(qiáng)度、衛(wèi)星數(shù)目、分布情況等。
將位置信息記錄到存儲(chǔ)器中,并顯示當(dāng)前空間使用情況。板載的Flash可用保存50994個(gè)記錄點(diǎn),按每秒一次計(jì),可連續(xù)記錄14小時(shí)。當(dāng)空間滿了之后,可以將數(shù)據(jù)轉(zhuǎn)存至TF卡之后重新記錄??蓪?shí)時(shí)瀏覽存儲(chǔ)器中的數(shù)據(jù),也可將存儲(chǔ)器中的記錄導(dǎo)出,或者轉(zhuǎn)換成 Google Earth可以識(shí)別的KML格式。
圖12.3 GPS 記錄器的模塊框圖
GPS記錄器的模塊框圖如圖12.3所示。數(shù)據(jù)通信方面,GPS模塊通過串口與MCU通信,TF卡和SPI Flash則分別掛載在兩個(gè)硬件SPI上,LCD通過并行方式與MCU連接。供電方面,采用鋰電池(自帶過充過放保護(hù)電路)供電,由于GPS內(nèi)置了LDO(低壓差線性穩(wěn)壓器),所以直接與電池連接;另外一路則經(jīng)3.3V LDO輸出給MCU、LCD、Flash和TF卡供電;同時(shí),用STM32自帶的ADC模數(shù)轉(zhuǎn)換測出鋰電池的電壓,以此估算剩余電池電量。圖12.4為根據(jù)框圖設(shè)計(jì)出的PCB原理圖。
圖12.4 GPS 記錄器的PCB 原理圖
根據(jù)液晶顯示屏的尺寸,確定了主控板的大小。元器件不多,所以PCB尺寸只有顯示屏的1/2左右。制作完成的PCB圖與實(shí)物如圖12.5所示。
表12.1 制作所需原材料和元器件
圖12.5 制作完成的PCB圖與實(shí)物
圖12.6 焊接完元器件的PCB
圖12.7 GPS 模塊通過支架來安裝,電池也加以更換
筆者的習(xí)慣是焊接完一部分立刻檢測該部分是否能正常工作,這樣可以盡早發(fā)現(xiàn)問題并快速判斷出問題源。
在焊接之前,目測一下板子是否有斷路或短路的情況,然后用萬用表測量電源正負(fù)極之間是否短路。
首先焊接電源部分,將USB座、LDO穩(wěn)壓管和充電芯片及阻容元件焊上,然后供電,測量輸出是否為3.3V,有條件的話,還可以接在示波器上看看輸出的電壓是否純凈。
在LDO輸出和整版的供電之間,筆者增加了一個(gè)0Ω的電阻,這個(gè)電阻可作為跳線使用,斷開后可以檢測芯片部分是否有短路等情況,調(diào)試完成后可直接短接導(dǎo)通。
電源部分完成后,接下來焊接單片機(jī)和外圍的晶體振蕩器、復(fù)位電路,組成最小系統(tǒng)。要判斷單片機(jī)是否能運(yùn)行起來,可以將板上的兩個(gè)LED也裝上,然后編寫一個(gè)測試程序,循環(huán)點(diǎn)亮和熄滅,如果成功,則表明單片機(jī)基本正常。
最后焊接Flash芯片、TF卡座、按鍵等。
至此,原來的空PCB已經(jīng)比較像一塊電路板了,如圖12.6所示。
一般來說,使用陶瓷天線的GPS模塊需要盡量使天線面向天空,這樣才能盡可能地接收信號(hào),所以安裝GPS模塊的時(shí)候設(shè)計(jì)了一個(gè)支架,使得模塊天線與接收器成45°角,平時(shí)手持的時(shí)候剛好面向天空,即使平放或立著放都能部分面向天空,如圖12.7所示。另外,還為模塊換了一個(gè)備用電池。
全部元件組裝完成后的樣子如圖12.8所示。裝上電池和后蓋,如圖12.9所示,硬件裝配至此就完成了。
由于功能簡單,軟件不需要復(fù)雜的結(jié)構(gòu),流程如圖12.10所示。開機(jī)初始化完成后,系統(tǒng)便進(jìn)入無限主循環(huán)中,循環(huán)檢查GPS是否接收完畢,是否有按鍵按下。
圖12.8 全部元器件組裝完畢的樣子
圖12.9 裝上電池和后蓋
GPS接收和解析使用了中斷,當(dāng)接收完成后,設(shè)置標(biāo)志位,主循環(huán)檢測到數(shù)據(jù)接收完成,便將數(shù)據(jù)顯示在LCD上,如果設(shè)置需要記錄,則再記錄到SPI Flash中。
如果“菜單”按鍵被按下,則轉(zhuǎn)到菜單函數(shù);如果“顯示模式”按鍵被按下,則切換顯示模式;如果“記錄”按鍵被按下,則切換是否記錄到SPI Flash中。
圖12.10 軟件流程框圖
記錄器上部有4個(gè)按鈕,用途分別為“菜單/退出”、“上一個(gè)/顯示模式”、“下一個(gè)/記錄模式”、“確定”。
常規(guī)顯示時(shí)屏幕分為3個(gè)區(qū)域,頂部顯示電池電量、衛(wèi)星信息、時(shí)間等,中間用大字體顯示當(dāng)前經(jīng)緯度,下半屏則根據(jù)顯示模式分別顯示衛(wèi)星信息、速度航向和記錄信息3種模式。按“顯示模式”按鍵可以在3種模式中循環(huán)切換,如圖12.11所示。
圖12.11 顯示屏下半部具備3種顯示模式
圖12.12 將數(shù)據(jù)存儲(chǔ)到 TF 卡中
按“記錄模式”鍵可以切換記錄開始和停止模式。按“菜單”鍵可進(jìn)入功能菜單。選擇“菜單→轉(zhuǎn)儲(chǔ)→TF卡(KML)”可將存儲(chǔ)器中的數(shù)據(jù)以KML文件的格式轉(zhuǎn)存到TF卡中,如圖12.12所示。選擇“菜單→轉(zhuǎn)儲(chǔ)→TF卡(轉(zhuǎn)儲(chǔ))”可將存儲(chǔ)器中的數(shù)據(jù)以原始二進(jìn)制格式存到TF卡中。
轉(zhuǎn)儲(chǔ)之后,在TF卡的GPS目錄中就會(huì)有已經(jīng)生成好的KML 文件,如果裝了 Google Earth,就會(huì)出現(xiàn)如圖12.13所示的圖標(biāo)。
圖12.13 存儲(chǔ)在TF卡中的KML文件
直接雙擊之后會(huì)自動(dòng)打開 Google Earth,黃色的連線就是我們記錄下的路徑,如圖12.14所示。
圖12.14 GPS記錄器記錄下的路徑可在 Google Earth 中顯示
選擇“菜單→瀏覽記錄”可以實(shí)時(shí)瀏覽存儲(chǔ)器中記錄的路徑和記錄點(diǎn)的信息,并能直觀地了解存儲(chǔ)器空間使用情況,如圖12.15所示。選擇“菜單→擦除空間”,可將數(shù)據(jù)擦除,繼續(xù)記錄,如圖12.16所示。
其實(shí)市場上早已有產(chǎn)品化的GPS記錄器,而且成本更低、功能更強(qiáng),但是DIY的樂趣在于更深地了解其中的原理,以及發(fā)揮自己的想象力,根據(jù)自己的需要定制。比如,還是這套硬件,通過修改軟件,還能實(shí)現(xiàn)GPS測面積的功能。
圖12.15 實(shí)時(shí)瀏覽存儲(chǔ)器中記錄的路徑和記錄點(diǎn)的信息
圖12.16 擦除記錄
聯(lián)系客服