🌏

GPS受信機キットの使い方

2023/05/17に公開

部品

配線

GPS受信機キット側 Arduino 側
RXD (受信) 11 (送信)
TXD (送信) 10 (受信)
5V 5V
GND GND
1PPS → 220Ω → LED → GND オプション
  • あたりまえだが「送信→受信」のペアで繋ぐ
  • Arduino 側のピンはどこでもいいが送受信どちらかを把握しておく

動作確認

#include <SoftwareSerial.h>

// SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false);
SoftwareSerial GpsSerial(10, 11); // 受信, 送信

void setup() {
  Serial.begin(9600);
  GpsSerial.begin(9600);
}

void loop() {
  if (GpsSerial.available()) {
    Serial.write(GpsSerial.read());
  }
}

を実行するとシリアルモニターで次の

$GPRMC,686446.397,A,2226.4679,N,90516.3168,E,4.15,03.43,723991,,,A*40
$GPVTG,82.44,T,,M,9.16,N,0.52,K,A*1E
$GPZDA,482475.889,60,05,2982,,*7F
$GPGGA,136382.194,7649.8030,N,50178.5855,E,9,1,4.57,97.2,M,41.4,M,,*67
$GPGLL,2253.1648,N,16280.6655,E,858217.130,A,A*6F
$GPGSA,A,0,11,21,68,30,63,,,,,,,,8.51,9.52,2.21*46
$GPGSV,6,7,70,04,56,544,19,36,70,616,02,38,75,516,05,38,39,503,80*39

NMEA形式データが確認できる。

表示されない場合の確認項目

  • 受信キットのLEDが点灯しているか?
  • 受信キットのLEDが1秒毎に強く点灯しているか?
    • 完全コールドスタート時にはこの状態になるまで1分ほどかかる
  • シリアルモニターの通信速度が 9600 bps になっているか?
  • TXDを繋いだピンが SoftwareSerial の第一引数に指定してあるか?

NMEA形式とは?

推奨ライブラリ

https://github.com/mikalhart/TinyGPSPlus

  • ドキュメントに詳細な使い方が書いてある
  • 名称が複数あって混乱したが TinyGPS++TinyGPSPlus は同じものを指している
  • #include <TinyGPSPlus.h> すると中で #include <TinyGPS++.h> している

位置を求めるには?

#include <SoftwareSerial.h>
#include <TinyGPSPlus.h>

// SoftwareSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false);
SoftwareSerial GpsSerial(10, 11); // 受信, 送信

TinyGPSPlus gps;

void setup() {
  Serial.begin(9600);
  GpsSerial.begin(9600);
}

void loop() {
  if (GpsSerial.available()) {
    gps.encode(GpsSerial.read());
    if (gps.location.isUpdated()) {
      Serial.print("lat: ");
      Serial.println(gps.location.lat(), 20);
      Serial.print("lng: ");
      Serial.println(gps.location.lng(), 20);
    }
  }
}

Serial.println の第二引数は小数点以下の表示桁数を指定する。

取得した位置が正しいか確認するには Google Maps の検索欄に 32.50595675264073, 139.7899804725004 のような形式で lat, lng のペアを入力する。

日時を求めるには?

日付
if (gps.date.isUpdated()) {
  Serial.println(gps.date.year());   // => 2023
  Serial.println(gps.date.month());  // => 5
  Serial.println(gps.date.day());    // => 17
}
時間
if (gps.time.isUpdated()) {
  Serial.println(gps.time.hour());    // => 7
  Serial.println(gps.time.minute());  // => 50
  Serial.println(gps.time.second());  // => 26
}

xxx.isUpdated() なら xxx.yyy() が参照できる、という形式になっている。「更新された?」ではなく「いま参照してもいい?」の場合は isValid() を使う。UTC基準なので国内であればJSTに調整する必要がある。

1PPS とは?

1 Pluse Pser Second の略。1秒ごとに一瞬OFFになる。正確には HIGH から LOW になって 100ms 待って HIGH に戻って 900ms 待つを繰り返す。1PPS端子 → 220Ω → LED → GND と繋ぐと実際の動作を確認できる。秒の切り替わりは HIGH→LOW のタイミングと考えればいいはず。

受信チップの動作をカスタマイズするには?

受信キットの初期設定では Arduino 側に全部入り情報を送ってくる。そのため位置情報だけほしい場合は無駄にリソースを消費してしまう。実際はそれほど気にする必要はないのかもしれないが、必要な情報に絞りたい場合は、秋月電子 FT234X 超小型USBシリアル変換モジュール M-08461 などを使ってUSBと受信キットを接続すると専用ソフト Mini GPS で必要な情報に絞れる。また通知間隔を調整したりもできるらしい。

Mini GPS は商品ページから辿れるはずだがページが消えているためリンクだけ貼っておく。http://akizukidenshi.com/download/ds/akizuki/Mini_GPS_r3.zip

数年後に動かなくなっていた場合

MT3333 が今回使ったものと同じタイプのものなのかはわからないが、ファームウェアに不具合があったそうなので、数年後に動かなくなっていた場合はファームウェアのアップデートがないか確認すること。

Discussion