GPS受信機キットの使い方
部品
-
秋月電子GPS受信機キット FAQ
- 取り扱いがなくなっていた (2023-05-17)
- GPSモジュール: GYSFDMAXB
- IC: MT3339
配線
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://ja.wikipedia.org/wiki/NMEA_0183
- https://www.yuden.co.jp/wireless_module/document/evbmanual2/jp/TY_GPS_GYSFDMAXB_EvaluationEnvironmentManual_V1.0J_20170929.pdf の P.10
- https://smtengkapi.com/engineer-arduino-gps
- https://www2.kaiyodai.ac.jp/~jtahar0/posts/activity9.html
推奨ライブラリ
- ドキュメントに詳細な使い方が書いてある
- 名称が複数あって混乱したが
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