---
title: GPS 接收器的原理與應用—PART6
description: "**作者：Bird** 上一回[【Maker 電子學】GPS 接收器的原理與應用…"
url: "https://makerpro.cc/docs/gps-receiver-principles-and-application-part6/"
updated: "2025-05-05"
category: GPS接收器
---

# GPS 接收器的原理與應用—PART6

**作者：Bird**

上一回[【Maker 電子學】GPS 接收器的原理與應用—PART5](https://makerpro.cc/2022/04/gps-receiver-principles-and-application-part5/)，我們介紹了實際可以用在各種 Maker 專案的 GPS 接收器模組，並說明了這類型接收器模組所使用的界面，以及它所輸出的訊號格式。這一回我們要繼續來看怎麼樣使用這種 GPS 接收器模組。

### **接收器模組實物**

爲了示範給讀者們看，我去蝦皮上買了一顆上次提到的 u-blox NEO-7M GPS 接收器模組來做實驗。

 ![](http://makerpro.cc/wp-content/uploads/2022/05/1.1.png)

（圖片來源：Bird 提供）

這是接收器的零件面，上面可以看到 u-blox 的模組及一些週邊零件，八支腳的那顆 IC 是 I2C 的 EEPROM 24C32，而右下角的那顆圓形的零件則是一顆超級電容器。

NEO-7M 模組的內部有一塊叫做 BBR（battery-backed RAM）的記憶體，它是非常省電的 SRAM 結構，可以靠著電池或是超級電容的電力維持內容達數天之久。BBR 這塊記憶體會用來儲存 GPS 模組的設定、最後定位的位置、星曆及曆書的相關資訊。除此之外，模組內部還有一個在斷電之後可以靠電池持續運作的 RTC（real time clock），因此下次開機時它仍然會知道現在是幾年幾月幾日幾點幾分。

我們上次說過，當 GPS 接收器冷開機、要開始尋找衛星時，它如果能有關於目前時間和位置的資訊，對於要搜尋哪些衛星、要用什麼 PRN 讓 correlator 開始解碼非常重要。畢竟一組導航電文至少要 30 秒才能完整接收，如果選對 PRN，很快就可以收到時間碼、星曆等資訊，快速完成定位；如果選錯 PRN，只會收到一堆雜訊，因此絕大多數的 GPS 接收模組或是接收器都會有類似的設計：利用備份電池（backup battery）維持時鐘的運作，並記住最後定位的位置及最後收到的衛星曆書。

 ![](http://makerpro.cc/wp-content/uploads/2022/05/2.1.png)

（圖片來源：Bird 提供）

這個模組的反面就只有 GPS 陶瓷天線，以及一個外接天線用的 SMA 連接器。這個 GPS 模組的天線設計很有趣，它沒有 antenna switch，也沒有其它的切換電路。陶瓷天線的輸出會接到一顆 MAX2659 天線放大器上，MAX2659 的輸出則跟外接天線的連接器輸入一起接到 NEO-7M 模組的 RF 輸入，因此當我們將模組接上外接天線時，內建的天線仍然在工作，它的輸出會跟外接天線的輸出混在一起進入 GPS 晶片。外接天線接頭上的訊號包含了來自 GPS 晶片的 VCC_RF，它可以供電給外接天線裡面的 LNA 低雜訊放大器。

### **實戰**

這個模組有 micro USB 連接器，而 u-blox NEO-7M GPS 晶片也有原生的 USB 支援。如果你手邊有 PC，只要直接將它用 USB cable 插到 PC 上，馬上就可以開始玩。

 ![](http://makerpro.cc/wp-content/uploads/2022/05/3.1.png)

（圖片來源：Bird 提供）

它的 USB 界面會透過 USB CDC（communication device class）模擬出一個虛擬的串列界面，你可以在裝置管理員裡面看到這個裝置。

接下來，我們用 Tera Term 或是 PuTTY 之類的終端機模擬軟體去開這個虛擬的串列界面，就可以看到 GPS 的輸出了。

 ![](http://makerpro.cc/wp-content/uploads/2022/05/4-1.png)

（圖片來源：Bird 提供）

我們上一回有簡單介紹一下，這種 GPS 輸出的資料格式叫做 NMEA-0183，它是美國國家海洋電子協會（National Marine Electronics Association）定義的船舶用電子裝置通訊標準。標準的 NMEA-0183 是用 4800 bps 的 RS-232C 傳送，但由於我們現在用的是 USB 上的虛擬串列界面，所以 baudrate 隨便設都沒關係。

我們先來看第一個訊息，$GPGSA。

### **解碼**

$GPGSA 這個訊息是用來告訴你 GPS 接收器目前的定位狀態，它總共有 18 個資料欄位，扣掉第 18 個欄位是 checksum 之外，有 17 個欄位有資料：

- 欄位 1：定位模式，A = 自動手動 2D/3D，M = 手動 2D/3D
- 欄位 2：定位類型，1 = 未定位，2 = 2D 定位，3 = 3D 定位
- 欄位 3 - 14：目前接收器正在接收、解碼的衛星編號
- 欄位 15：PDOP 綜合位置精度因子
- 欄位 16：HDOP 水平精度因子
- 欄位 17：VDOP 垂直精度因子

最後三個參數叫做「精度衰減因子」（DOP，Dilution of Precision），代表的是 GPS 目前定位的位置精確度。它的數值範圍從 0.5 到 99，數字越大精度越差。這幾個精度因子只與衛星在天空中的位置分佈有關，與其它影響定位精度的因素如電離層延遲、時鐘誤差等無關。

我們在第一回的時候有說過，GPS 定位的原理是使用接收機與衛星之間的測距進行三角定位，雖然理論上當距離已知時，定位只會有唯一解，但當測距的結果帶有誤差時，定位的結果就會是一個範圍，而不是一個精確的點，而這時，這個範圍的大小就會受到天空中衛星分佈相對位置的影響。原則上，用來定位的衛星分佈得越分散，定位精度會越好；舉個極端一點的例子：如果你只收得到剛剛好可以用來做 3D 定位的四顆衛星，而這四顆衛星都在天頂附近，這樣的定位精度就會很差。

我們來看看實際收到的訊息：

$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30

從上面的訊息可以看出來，目前 GPS 接收器是在 A 自動定位模式，未完成定位。因爲我截取這個訊息時，GPS 接收器就放在電腦旁邊的桌上，在室內當然收不到 GPS 的訊號，所以接下來的一連串逗點就代表接收器現在完全不知道該用什麼 PRN 來收衛星，而最後的三個 99.99 則是代表精度因子都爛到爆表，因爲沒有完成定位呀。

我找了一條超長的 USB 延長線，把 GPS 接收器放到陽台看得到天空的位置。過沒多久，$GPGSA 訊息就變成：

$GPGSA,A,2,15,05,29,,,,,,,,,,3.16,2.99,1.00*0E

第二個資料欄已經變成 2，表示接收器已經完成 2D 定位。從接下來的參數也可以看出來，接收器已經捕獲了第 15 號、第 5 號、第 29 號衛星，而三個原來是 99.9 的精度因子也降到了個位數的範圍。

再給它一點時間，它又捕獲了更多顆衛星。$GPGSA 訊息變成：

$GPGSA,A,3,15,13,06,05,29,30,,,,,,,2.50,1.35,2.10*0C

這時它已經完成 3D 定位，也捕獲了編號 3、15、13、6、5、29、30 號共 7 顆 GPS 衛星的訊號。PDOP 也從剛剛的 3.16 進一步再降低到 2.50，表示定位精度更高。

既然定位完成了，我們就可以來看看現在的位置在哪裡。

在 NMEA-0183 輸出中，有好幾個訊息含有定位資訊。我們先來看 $GPGGA。

$GPGGA,121210.00,2505.23655,N,12136.09846,E,1,07,1.11,54.8,M,17.1,M,,*64

$GPGGA 是一個相當完整的 GPS 定位資訊，不含 checksum 它總共有 12 個資料欄位，以及兩個單位欄位：

- 欄位 1：UTC 時間 HHMMSS.SS
- 欄位 2：緯度 DDMM.MMMM 度分格式
- 欄位 3：北緯 N 或 南緯 S
- 欄位 4：經度 DDMM.MMMM 度分格式
- 欄位 5：東經 E 或 西經 W
- 欄位 6：GPS狀態：0 = 未定位，1 = 非差分定位，2 = 差分定位，6 = 正在估算
- 欄位 7：正在使用的衛星數量
- 欄位 8：HDOP 水平精度因子
- 欄位 9：橢球高
- 欄位 10：地球橢球面相對大地水準面的高度
- 欄位 11：差分時間
- 欄位 12：差分站 ID

在欄位 9 和 10 的後面各有一個逗點加 M，代表這兩個欄位的單位是公尺。

從上面的欄位定義看起來，目前 GPS 定位到的位置在北緯 25 度 5.23655 分，東經 121 度 36.09846 分，抓取這則資料的時間是格林威治時間 12 點 12 分 10 秒，加 8 小時就是台灣時間。

NMEA-0183 輸出的經緯度格式叫做 DDMM.MMMM，其中 D 是「度」的意思，M 是「分」的意思，1 度等於 60 分。不過目前大部分的電子地圖所使用的經緯度都是十進制的經緯度格式，因此如果我們想要在 Google Maps 裡查詢這個經緯度，需要做一些轉換。

以上面那個座標爲例，它的緯度是 25 度 5.23655 分，我們只要把分除以 60，就可以得到緯度的小數點部分：

5.23655 / 60 = 0.087275833

所以緯度以純度數來表示就是 25.087275833 度。經度 121 度 36.09846 分也可以用同樣的方法轉換：

36.09846 / 60 = 0.601641

所以精度的度數就是 121.601641。我們將經緯度補上 N 和 E，加上逗號變成這個字串：

N25.087275833,E121.601641

把它貼到 Google Maps 裡，就可以看到位置：

 ![](http://makerpro.cc/wp-content/uploads/2022/05/5-2.png)

（圖片來源：Bird 提供）

另外要特別說明一下的是，欄位 9 所測得的高度叫做「橢球高」，它是假設地球是一個完美的橢球而得到的一個幾何上的高度，跟實際的海拔高度仍然有落差。台灣地區的海拔高度參考基準是以基隆港的海平面爲基準，海拔高度平均來說大概比橢球高低 20 公尺左右，但這個差值會隨著位置的不同而改變，需要查表。

至於最後兩個關於差分站的參數，由於台灣地區沒有廣域的差分站廣播訊號，在市區是不會有差分定位能力的。不過航港局在 2019 年於台灣沿海建置了一系列的差分站，每一站的訊號涵蓋範圍達 100 海里，因此在台灣沿海航行的船隻都可以收到差分站的訊號，啟用差分 GPS 的功能，獲得 5 米以下的定位精度。

如果你只需要經緯度的定位資訊，不需要高度、差分等額外的資訊，$GPGLL 是一個比較短、比較適合的資訊：

$GPGLL,2505.23345,N,12136.10136,E,131146.00,A,A*6A

$GPGLL 只有六個欄位：

- 欄位 1：緯度 DDMM.MMMM 度分格式
- 欄位 2：北緯 N 或 南緯 S
- 欄位 3：經度 DDMM.MMMM 度分格式
- 欄位 4：東經 E 或 西經 W
- 欄位 5：UTC 時間 HHMMSS.SS
- 欄位 6：資料有效性：A = 資料有效，V = 資料無效

如果只需要簡單的定位資訊，抓 $GPGLL 是個不錯的方法。

GPS 除了定位，其實還有測速的功能。如果要知道接收器移動的速度，需要讀取 $GPRMC 這組資訊。

$GPRMC,134248.00,A,2505.23434,N,12136.10298,E,0.108,,130522,,,A*73

$GPRMC 總共有 12 個資料欄位：

- 欄位 1：UTC 時間 HHMMSS.SS
- 欄位 2：資料有效性：A = 資料有效，V = 資料無效
- 欄位 3：緯度 DDMM.MMMM 度分格式
- 欄位 4：北緯 N 或 南緯 S
- 欄位 5：經度 DDMM.MMMM 度分格式
- 欄位 6：東經 E 或 西經 W
- 欄位 7：航速，單位是節（knot）
- 欄位 8：航向，0 - 359.9 度
- 欄位 9：UTC 日期 DDMMYY
- 欄位 10：磁偏角，0 - 180 度（optional）
- 欄位 11：磁偏角方向，E 東或 W 西
- 欄位 12：定位模式：A = 自主定位，D = 差分，E = 估算，N = 數據無效

在 $GPRMC 的第 7 個欄位中可以拿到關於速度的資料。由於 NMEA-0183 是爲了航海而制定的標準，所以這一欄的速度單位是節（knot），也就是每小時 1 海里。1 海里等於 1.852 公里，所以這個數字乘上 1.852 就可以得到 km/h。

第 8 個欄位的航向是以相鄰兩次定位之間的連線當作航向，因此如果像我現在把 GPS 接收器放在固定的位置不動，因爲每次定位之間仍然會因爲誤差而有一些飄移，所以航向就會一直亂跳。在具有電子羅盤的 GPS 接收器中，它會提供欄位 10、11 的磁偏角資訊，不過 NEO-7M 這個模組沒有電子羅盤，所以這兩欄沒有資訊。

### **小結**

這一次我們將 u-blox NEO-7M GPS 接收器模組透過 USB 接到 PC 上，實際來觀察在真實環境中收到的訊號、解出來的資料，我們也說明了 $GPGSA、 $GPGGA、$GPGLL、$GPRMC 等幾個最重要的定位訊息。

下一回我們要試著將 GPS 接收器透過 UART 連接到像 Arduino 這樣的小系統上，來使用 GPS 的訊號。

（責任編輯：賴佩萱）
