2023年5月29日 星期一

ESP32 與 GPS 模組定位取得經緯度座標


本實作使用 WeMos LoLin32 開發板配合U8g2程式庫於OLED中顯示訊息。直接將 WeMos LoLin32 以 USB 線連接到開發電腦進行程式編譯上傳即可。使用Arduino IDE 編譯 ESP32 程式前請先確認已經正確選定開發板規格。

ESP32 與 OLED 接腳設定
1. 電源接線:
【ESP32】3.3V →【OLED】VCC
【ESP32】GND →【OLED】GND
2. 信號接線:
【ESP32】22→【ESP-01】SCL
【ESP32】21→【ESP-01】SDA




想要取得全球位置定位座標,就必須使用GPS模組來取得衛星定位信號,本實作使用GY-NEO6MV2來實作取得衛星訊號的經緯度座標。

GY-NEO6MV2模組核心採用 UBLOX 公司的 NEO-6M 模組,具有 50 個通道,追蹤靈敏度高達-161dBm,測量輸出頻率最高可達 5Hz。NEO-6M 模組自帶高效能無源陶瓷天線,相容 3.3V 和5V 微控制器系統,並自帶可充電後備電池。

NEO-6M 模組非常小巧(25.5mm*31mm),模組透過 4 個 2.54mm 間距的排針與外部連線。


GPS模組的訊息為MNEA標準格式,訊息內容以 ASCII 編碼,且每一則訊息皆以 $ 符號開頭,訊息最後則以 \r\n 作為結尾。
  • $ GPGSA - GPS DOP和主動衛星
  • $ GPGSV - 詳細的GPS衛星資訊
  • $ GPGLL - 地理緯度和經度
  • $ GPRMC - 基本的GPS pvt(位置、速度、時間)資料
  • $ GPVTG - 速度很好
SSP32 與 GY-NEO6MV2 接腳設定
1. 電源接線:
【ESP32】3.3V →【NEO-6M】VCC
【ESP32】GND →【NEO-6MD】GND
2. 信號接線:對應 ESP32 的 UART2 序列接腳
【ESP32】16→【NEO-6M】RX
【ESP32】17→【NEO-6M】TX

為了解析GPS模組的MNEA訊息,可以直接使用前輩們所開發的程式庫加以利用,本實作使用 Mikal Hart 所開發的 TinyGPS PLUS

將下載下來的程式庫模組壓縮檔以 匯入 方式加入開發程式中:


撰寫實驗程式如下並進行編譯燒錄:
#include <TinyGPS++.h> //引入GPS程式庫
#define GPS_BAUD 9600 // GPS的序列通訊速率
#include <U8g2lib.h> //引入OLED程式庫

U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
TinyGPSPlus gps; // 宣告gps物件

void parseGPS()
{
  if (gps.location.isValid())
  {
    float lat = gps.location.lat(); // 緯度
    float lng = gps.location.lng(); // 經度
    
    u8g2.firstPage();
     do {
    u8g2.setCursor(5, 20);
    u8g2.printf("Coordinate:");  
    u8g2.setCursor(5, 40);
    u8g2.printf("%.6f", lat);  //列印緯度座標
    u8g2.setCursor(5, 60);
    u8g2.printf("%.6f", lng);  //列印經度座標
  } while ( u8g2.nextPage() );
  
    Serial.printf("座標:%.6f, %.6f\n", lat, lng);
  }
  else
  {
     u8g2.clearBuffer(); //清除暫存區
     u8g2.drawStr(10, 50, "ERROR"); //設定繪製內容
     u8g2.sendBuffer(); //送出繪製內容

    Serial.printf("座標資料錯誤\n");
  }
}

void setup()
{
  Serial.begin(9600);
  Serial2.begin(GPS_BAUD);
  u8g2.begin(); //初始顯示器物件
  u8g2.setFont(u8g2_font_t0_22b_te); //指定字型
}

void loop()
{
  while (Serial2.available() > 0) //是否有資料傳入
  {
    if (gps.encode(Serial2.read())) //讀取GPS資訊
    {
      parseGPS();
    }
  }
}
將實驗模組移到戶外或可接收到衛星訊號的場所進行GPS信號接收測試。
 

沒有留言:

張貼留言

熱門文章