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