🌏

GPS受信機キットの使い方

2023/05/17に公開約4,400字

部品

配線

GPS受信機キット側 Arduino 側
RXD (受信) 11 (送信)
TXD (送信) 10 (受信)
5V 5V
GND GND
1PPS → 220Ω → LED → GND オプション
  • 送信受信のペアで繋ぐ
  • Arduino 側のピンはどこでもいいが送受信どちらかを把握しておく
  • キット側の名称を 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 の第二引数は小数点以下第N位まで表示するの意味
  • 取得した位置が正しいか確認するには 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

ログインするとコメントできます