# NEO-M8N GNSS模組

## 基礎小知識
> ### NEO-M8N GNSS模組
> * 支援GPS/GLONASS/Galileo/QZSS/ONASS/BeiDou等衛星定位系統,但同時只支援接收3組信號
> * 燈號常亮表示正常運作,但尚未連接衛星信號;閃爍表示以連接到衛星信號
> * 自帶SMA天線接口,可自行外接其他天線
> * 自帶EEPROM記憶體,可儲存設定
> * 自帶電池,保持定位記錄存在
> * 自帶 Micro USB 接口,可直接連線電腦
> * 自帶信號擴大器
> * 支援SBAS
>
> 技術規格
> * 供電電壓:5 / 3.3 V
> * 輸出頻率:1 - 10 Hz
> * 信號頻道:1575.42 MHZ
> * 通信鮑率:9600(可修改)
> * 通信協議:NMEA0183(默認)/ UBX Binary
> * 使用介面:UART/USB/I2C/SPI...
> * 定位精度:2.5m CEP50 (有50%機率誤差在2.5m內)
> * 導航靈敏度:-167 dBm
> * 如須兼容RTK技術,以提升精度至毫米級,需擴充C94-M8P模組,或購入NEO-M8P
>
> 原理簡介
>
> * GNSS是由衛星發射的信號,信號通常由三個主要部分組成:射頻信號、導航訊息和時間標記。射頻信號是由衛星發射的電磁波,其中包含了衛星的位置和時間信息。導航訊息則包含了衛星的軌道參數、衛星健康狀態等信息。時間標記則是用來同步GNSS接收器和衛星時鐘的。
>
>* M8N GNSS模組通常由天線、接收器和處理器三個部分組成。天線用來接收衛星信號,接收器則負責將接收到的信號轉換成數字信號,並將其傳送到處理器進行處理和分析。處理器則通常由一個芯片和相關的軟件組成,可以解碼和處理來自多個衛星的信號,並通過特定的算法來計算接收器的位置、速度和時間等信息。
>
>> M8N GNSS模組使用的定位和導航算法通常包括以下幾個步驟:
> >* 衛星信號接收:M8N GNSS模組通過天線接收來自多個衛星的信號,並將其轉換成數字信號。
>> * 計算衛星位置:通過接收到的衛星信號,M8N GNSS模組可以計算每個衛星的位置和時間信息。
> >* 衛星幾何定位:在知道每個衛星的位置和時間信息後,M8N GNSS模組可以計算接收器的位置,使用的算法通常是三角測量或更高級的幾何定位算法。
>>* 精度提高:為了提高定位精度,M8N GNSS模組通常會使用不同的校正和過濾算法來處理和分析接收到的信號。例如,可以使用差分GPS技術、多路徑抑制算法、卡爾曼濾波等方法。
>>* 信息整合:M8N GNSS模組可以將接收到的GNSS信號與其他傳感器(例如加速度計、陀螺儀等)的信息進行整合,以提高定位和導航的精度和可靠性。
## 簡單實作
### 接腳說明
> GND -- GND
> VCC -- 5V
> TXD -- 10
> RXD -- 11
### 程式碼
``` c =
#include <SoftwareSerial.h>
#include <TinyGPS++.h>
// 引入 "TinyGPS++" 函式庫
SoftwareSerial gpsSerial(10, 11);
// 宣告軟體序列埠,用來和 GPS 模組通訊,RX 和 TX 分別設定為 10 和 11 腳位
// 註:RX需連接TX腳位;TX需連接RX腳位
TinyGPSPlus gps; // 宣告 "TinyGPS++" 物件,用來解析 GPS 資料
void setup()
{
Serial.begin(9600); // 初始化主要序列埠,並設定傳輸速率為 9600
gpsSerial.begin(9600); // 初始化 GPS 序列埠,並設定傳輸速率為 9600
}
void loop()
{
while (gpsSerial.available() > 0) // 持續檢查 GPS 序列埠是否有資料可讀取
{
if (gps.encode(gpsSerial.read())) // 如果有資料可讀取,則進行解析
{
Serial.print("Location: "); // 印出定位資訊的標頭
Serial.print(gps.location.lat(), 6); // 印出緯度資訊,精確到小數點後 6 位
Serial.print(", "); // 印出分隔符號
Serial.println(gps.location.lng(), 6); // 印出經度資訊,精確到小數點後 6 位
Serial.print(", Altitude: "); // 印出海拔高度的標頭
Serial.print(gps.altitude.meters(), 1); // 印出海拔高度,精確到小數點後 1 位
Serial.print("m, Time: "); // 印出时间的標頭
Serial.print(gps.time.value()); // 印出时间,格式为 HHMMSS.SSS
Serial.println();
}
}
}
//註:如果顯示"Location: 0.000000, 0.000000"表示沒接收到GPS訊號,請移動天線
```
## 延伸實作
- [經緯座標顯示](/O0m2pPGyQdiLRevc9feegQ)