將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秒獲得有效的定位。

更新於: 2021年5月31日

994 次檢視

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.