M5STICK-CでGPS受信


M5STICK-Cの汎用I/Oポートがどこまで汎用なのか?を知りたいので、前回はI2C接続でしたが、今回は、UART接続に挑戦してみます!
また、手元にあった秋月電子のGPSモジュール(AE-GPS)をM5STICK-Cに繋いで、位置情報を取得してみましょう!

AE-GPSとの接続(RXDをG26,TXDをG36)に繋いでいます。

ソースコード

TinyGPS Plusのライブラリーを使用しています。

// M5STICK-Cで、GPS(UART接続)を繋いで値を取得する
// Programed by Kazuyuki Eguchi

#include <M5StickC.h>
#include <TinyGPS++.h>

HardwareSerial GPSUART(1);
TinyGPSPlus gps;

void setup() {
  M5.begin();
  M5.Axp.ScreenBreath(9); // バックライトの明るさ(7-15)
  M5.Lcd.setRotation(1);
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(TFT_YELLOW);
  M5.Lcd.setCursor(0, 0);

  GPSUART.begin(9600, SERIAL_8N1, 26, 36);  
}

void loop() {
   if (GPSUART.available()) {
    int inByte = GPSUART.read();
    // Serial.write(inByte);
    
    if(gps.encode(inByte)){
      displayInfo();
    }
  }
}

void displayInfo()
{
  M5.Lcd.fillScreen(TFT_BLACK);
  M5.Lcd.setCursor(0, 0);
  
  Serial.print(F("Location: "));
  M5.Lcd.print(F("Location: "));
   
  if (gps.location.isValid())
  {
    M5.Lcd.print(gps.location.lat(), 6);
    M5.Lcd.print(F(","));
    M5.Lcd.print(gps.location.lng(), 6);
    
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(","));
    Serial.print(gps.location.lng(), 6);
  }
  else
  {
    M5.Lcd.print(F("INVALID"));
    Serial.print(F("INVALID"));
  }

  M5.Lcd.print(F("  Date/Time: "));
  Serial.print(F("  Date/Time: "));
  
  if (gps.date.isValid())
  {
    M5.Lcd.print(gps.date.month());
    M5.Lcd.print(F("/"));
    M5.Lcd.print(gps.date.day());
    M5.Lcd.print(F("/"));
    M5.Lcd.print(gps.date.year());

    Serial.print(gps.date.month());
    Serial.print(F("/"));
    Serial.print(gps.date.day());
    Serial.print(F("/"));
    Serial.print(gps.date.year());
  }
  else
  {
    M5.Lcd.print(F("INVALID"));
    Serial.print(F("INVALID"));
  }

  M5.Lcd.print(F(" "));
  Serial.print(F(" "));
  
  if (gps.time.isValid())
  {
    if (gps.time.hour() < 10) {
      M5.Lcd.print(F("0"));
      Serial.print(F("0"));
    }
    
    M5.Lcd.print(gps.time.hour());
    M5.Lcd.print(F(":"));

    Serial.print(gps.time.hour());
    Serial.print(F(":"));
    
    if (gps.time.minute() < 10) {
      M5.Lcd.print(F("0"));
      Serial.print(F("0"));
    }
    
    M5.Lcd.print(gps.time.minute());
    M5.Lcd.print(F(":"));

    Serial.print(gps.time.minute());
    Serial.print(F(":"));
    
    if (gps.time.second() < 10) {
      M5.Lcd.print(F("0"));
      Serial.print(F("0"));
    }
    
    M5.Lcd.print(gps.time.second());
    M5.Lcd.print(F("."));

    Serial.print(gps.time.second());
    Serial.print(F("."));
    
    if (gps.time.centisecond() < 10) {
      M5.Lcd.print(F("0"));
      Serial.print(F("0"));
    }
    
    M5.Lcd.print(gps.time.centisecond());
    Serial.print(gps.time.centisecond());
  }
  else
  {
    M5.Lcd.print(F("INVALID"));
    Serial.print(F("INVALID"));
  }

  Serial.println();
}

動作イメージ

以上、ご参考までに