秋月でアンテナ付キットを購入。(2022/8/20現在、在庫切れ)
GPSモジュールの出力
GPSモジュールのシリアル出力はNMEAフォーマット。
上記モジュールはデフォルトでは9600ボー。
ログをPCで取得するならシリアルが2系統必要。
SoftwareSerialでもよいが、今回はSerial1のあるGR-CITRUSを使用。
Serial(USB)をPCとの通信、Serial1(TX:0, RX:1)をGPSモジュールとの通信に使用。
結線
GPSモジュール |
GR-CITRUS |
備考 |
5V |
5V |
GR-CITRUSから給電する。ボタン電池は不使用。 |
GND |
GND |
|
RX |
0 |
Serial1のTX。3.3Vレベルであることに注意(※) 今回は不使用。 |
TX |
1 |
Serial1のRX。3.3Vレベルであることに注意(※) |
1PPS |
接続しない |
1秒周期のパルス出力。今回は不使用。 |
※ 5V系Arduinoの場合はレベル変換が必要。
LED・電池
モジュールに給電するとまず橙色LEDが弱く点灯する。しばらく待ってモジュールが衛星を捕捉すると橙色LEDが1秒周期で点滅するようになる。
バックアップ電池(CR2032)を付けておくと衛星情報などが保持されて、再起動時の測位開始にかかる時間を短縮できる。
スケッチ
#include <TinyGPS++.h>
TinyGPSPlus gps;
void setup()
{
Serial.begin(115200);
Serial1.begin(9600);
while (!Serial) { ; }
}
void loop()
{
while (Serial1.available() > 0){
char c = Serial1.read();
gps.encode(c);
if (gps.location.isUpdated()){
Serial.print("LAT="); Serial.println(gps.location.lat(), 6);
Serial.print("LONG="); Serial.println(gps.location.lng(), 6);
Serial.print("ALT="); Serial.println(gps.altitude.meters());
}
}
}
isValid(), isUpdated(), age()
- isValid() : データが有効か?
- isUpdated():データが更新されたか? (変化したとは限らない)
- age():最後の更新からの経過時間 [msec]
取得できるデータ
Serial.println(gps.location.lat(), 6);
Serial.println(gps.location.lng(), 6);
Serial.print (gps.location.rawLat().negative ? "S" : "N");
Serial.println(gps.location.rawLat().deg);
Serial.println(gps.location.rawLat().billionths);
Serial.print (gps.location.rawLng().negative ? "W" : "E");
Serial.println(gps.location.rawLng().deg);
Serial.println(gps.location.rawLng().billionths);
Serial.println(gps.date.value());
Serial.println(gps.date.year());
Serial.println(gps.date.month());
Serial.println(gps.date.day());
Serial.println(gps.time.value());
Serial.println(gps.time.hour());
Serial.println(gps.time.minute());
Serial.println(gps.time.second());
Serial.println(gps.time.centisecond());
Serial.println(gps.speed.value());
Serial.println(gps.speed.knots());
Serial.println(gps.speed.mph());
Serial.println(gps.speed.mps());
Serial.println(gps.speed.kmph());
Serial.println(gps.course.value());
Serial.println(gps.course.deg());
Serial.println(gps.altitude.value());
Serial.println(gps.altitude.meters());
Serial.println(gps.altitude.miles());
Serial.println(gps.altitude.kilometers());
Serial.println(gps.altitude.feet());
Serial.println(gps.satellites.value());
Serial.println(gps.hdop.value());
応用
NMEAの特定のフィールドのデータを抽出して取得することもできる。
だだし、数値であっても解釈されず文字列 (char*) として返す。
#include <TinyGPSPlus.h>
TinyGPSPlus gps;
TinyGPSCustom pdop(gps, "GNGSA", 15);
TinyGPSCustom hdop(gps, "GNGSA", 16);
TinyGPSCustom vdop(gps, "GNGSA", 17);
void setup()
{
Serial.begin(115200);
Serial1.begin(9600);
while (!Serial) { ; }
}
void loop()
{
while (Serial1.available() > 0) gps.encode(Serial1.read());
if (pdop.isUpdated() || hdop.isUpdated() || vdop.isUpdated())
{
Serial.print(F(" PDOP=")); Serial.print(pdop.value());
Serial.print(F(" HDOP=")); Serial.print(hdop.value());
Serial.print(F(" VDOP=")); Serial.println(vdop.value());
}
}
【追記】M5Stack用GPSユニットでも動作確認OK