🌏
GPS受信機キットの使い方
部品
配線
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://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
の第二引数は小数点以下第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