將GNSS接收器與Arduino連線以獲取位置
在本教程中,我們將Arduino與GNSS接收器連線,並獲取當前位置。任何GNSS接收器通常都使用UART進行通訊。我們將為此使用ublox Neo6M GNSS模組
電路圖

如您所見,我們將Vcc連線到5V,GND連線到GND,Neo 6M的RX連線到Arduino Uno的3號引腳,Neo 6M的TX連線到Arduino Uno的4號引腳。
所需庫
與OLED顯示屏連線Arduino Uno需要TinyGPS庫 -
轉到**工具 → 管理庫**,搜尋此庫,然後單擊安裝。

程式碼演練
我們將演練TinyGPS庫附帶的一個示例程式碼。轉到**檔案 → 示例 → TinyGPS → simple_test**以訪問程式碼。

或者,可以在這裡訪問GitHub上的程式碼 - https://github.com/mikalhart/TinyGPS/blob/master/examples/simple_test/simple_test.ino
如您所見,我們首先包含所需的庫,SoftwareSerial和TinyGPS。SoftwareSerial是一個庫,它允許與任何非序列埠數字引腳進行序列通訊。在這裡,我們將使用該庫啟用與Arduino Uno的3號和4號引腳的序列通訊。
#include −SoftwareSerial.h> #include −TinyGPS.h>
接下來,我們定義TinyGPS物件和SoftwareSerial物件。為了定義軟體序列埠,我們必須提供RX和TX引腳作為引數。由於Arduino的4號引腳連線到Neo 6M模組的TX,因此4號引腳是Arduino端的RX,類似地,3號引腳是TX。
TinyGPS gps; SoftwareSerial ss(4, 3);
在Setup中,我們初始化Serial和SoftwareSerial。在示例程式碼中,他們已將SoftwareSerial初始化為4800波特率。請檢查Neo 6M模組的資料手冊,如果您需要更高的波特率,例如9600,請進行相應的更改。稍後,添加了一些列印語句,其中包括庫的版本號。
void setup()
{
Serial.begin(115200);
ss.begin(4800);
Serial.print("Simple TinyGPS library v. ");
Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();
}現在讓我們仔細看看迴圈。迴圈以定義一些變數開始 -
void loop()
{
bool newData = false;
unsigned long chars;
unsigned short sentences, failed;接下來,有一個持續一秒鐘的for迴圈,其中解析來自軟體序列埠的傳入資料。**gps.encode()**函式接收來自軟體序列埠的每個位元組,並在資料已完全解析並準備使用時返回true。
因此,當它返回true時,我們將**newData**設定為true。
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start lt; 1000;)
{
while (ss.available())
{
char c = ss.read();
// Serial.write(c); // uncomment this line if you want to see the GPS data flowing
if (gps.encode(c)) // Did a new valid sentence come in?
newData = true;
}
}如果newData為true,我們將使用f_get_position()函式獲取緯度和經度作為浮點值,並獲取資料的時間戳(採集時間)。我們使用.satellites()函式獲取接收器可見的衛星數量,並使用.hdop()函式獲取水平精度衰減。您可以在此處閱讀有關hdop的更多資訊https://en.wikipedia.org/wiki/Dilution_of_precision_(navigation)#:~:text=DOP%20can%20be%20expressed%20as,position%20(3D)%20dilution%20of%20precision。
在每個列印語句中,我們檢查INVALID標誌是否為true,如果是,則列印0,否則列印計算出的值。
if (newData)
{
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
Serial.print("LAT=");
Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
Serial.print(" LON=");
Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
Serial.print(" SAT=");
Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
Serial.print(" PREC=");
Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
}稍後,我們使用.stats()函式計算從GNSS接收器接收到的字元數、句子數以及校驗和計算失敗的次數。
gps.stats(&chars, &sentences, &failed);
Serial.print(" CHARS=");
Serial.print(chars);
Serial.print(" SENTENCES=");
Serial.print(sentences);
Serial.print(" CSUM ERR=");
Serial.println(failed);
if (chars == 0)
Serial.println("** No characters received from GPS: check wiring **");請注意,您可能需要將接收器及其天線靠近窗戶以獲取準確的位置。另請注意,GNSS接收器通常具有大約30-40秒的冷啟動時間。這意味著它將在通電後大約30-40秒獲得有效的定位。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP