Mira&Luna's nursery lab

旅乙女と発明娘の子供部屋

手作りGPSロガー プラスαの3回目   「TinyGPS++にできることいろいろ」

f:id:miraluna:20180111120142j:plain:w400
Mira          🎀目次へ🎀

自作したGPSロガーのプログラムスケッチに使用したライブラリ「TinyGPS++」でできることをいくつか紹介したいと思います。

他の人が作ったライブラリだけどね。便利だし、英語のページだから。

ライブラリについてはこのページ ↓ で少し書きました。
手作りGPSロガー プラスαの2回目 「Arduinoでライブラリを使うための準備」 - Mira&Luna's nursery lab
その中で紹介した「TinyGPS++」。
Arduinianaさんという可愛らしいネコみたいな名前のサイト(作っているのはMr.Mikal Hartという方)で公開されています。
GitHubにもあります。

Arduinianaさんのページ入口

私のプログラムは緯度と経度だけを記録するものだけど、このTinyGPS++のライブラリをインクルードしていれば他にもいろいろな情報を簡単に得ることができます。
スケッチを少しだけ書き換えれば、このGPSロガーで他の情報もSDカードに記録できるようになるというわけ。
その書き換えがとても簡単なの。いくつか紹介するわね。



〇 緯度・経度
まずは今みつは(ATmega328)に書き込まれている、緯度と経度を取得するソース。

sd.println(gps.location.lat(),6);
lcd.print(gps.location.lng(),6);

「sd」というのは私の書いたスケッチの中でSDカードに書き込むという意味で、「lcd」は液晶ディスプレイに表示するという意味。Serialに変えればArduinoのシリアル通信の枠に表示されるわ。
printlnは表示・書き込みのための指示だけど、「ln」をつけると改行して、「print」だけだと次も続けて表示する。
「location」は位置情報を得るときに使うTinyGPS++での約束事。
「lat」は緯度を表すlatitudeのこと。
lng」は経度を表すlongitudeのこと。
「6」は得る位置情報のけた数。12.3456°のようにね。

 上のソースを書き込めば、latである「緯度」をSDカードに書き込んで、
 lngである「経度」を液晶ディスプレイに表示するというわけ。


〇 日付と時間
世界で一番正確な時計を知ってる?
あなたの腹時計のことじゃないわ。
現在一番狂いのない時計は原子を使った原子時計。それが衛星に搭載されていて、GPS機能としてその情報を得ることができるの。ビッグベンよりも正確なのよ。
その世界一正確な日付と時間の情報を取得するソースがこれ。

lcd.print(gps.date.year());
lcd.print(gps.date.month());
lcd.print(gps.date.day());

lcd.print(gps.time.hour());
lcd.print(gps.time.minute());
lcd.print(gps.time.second());
lcd.print(gps.time.centisecond());

それぞれ「年・月・日」「時・分・秒・0'00秒」を取得します。
年については、2000にプラスされる値を得ます。


〇 移動速度

lcd.print(gps.speed.knots());
lcd.print(gps.speed.mph());
lcd.print(gps.speed.mps());
lcd.print(gps.speed.kmph());

上から順に「ノット」「マイル/時」「マイル/分」「キロマイル/時」。
上から順に「ノット」「マイル/時」「メートル/秒」「キロメートル/時」です。(2018.12.15. 訂正)

ごめんなさいね。「km/h」を見つけられなかったの。
このTinyGPS++はいくつもあるNMEAフォーマットの中の$GPGGAと$GPRMCのセンテンスから情報を取得しているの。
GPSの情報(NMEAフォーマット)についての記事はここ
その中にノットでの速度情報はあるんだけど、km/hでの速度情報はないの。$GPVTGのセンテンスの中にはあるんだけど。
だからきっとkm/hの速度情報は、ノットで得た値をx1.852に修正してあるのね。「1kt(knots)=1.852km/h」です。


〇 高度(標高)
登山にGPSを持っていきたい人は多いわよね。自分が苦労して歩いたルートと標高が形になって記録できたらうれしい。
でも、ガーミンのような高性能なツールには手が出せないし、USB型のものは数日間の縦走なんかには充電が必要。
だからGPSロガーを自作する!
なんて人はほとんどいないでしょうけど、何人かはいるはずだわ。

lcd.print(gps.altitude.meters());
lcd.print(gps.altitude.miles());
lcd.print(gps.altitude.kilometers());
lcd.print(gps.altitude.feet());

上から「メートル・マイル・キロメートル・フィート」。
そんなほとんどいないけれど稀な何人かの人のために「高度(海抜)」も記録できる方法を「+βの記事」で紹介しています。シンプルで長時間使用可能なGPSロガーを自作する! という稀なあなた、どうぞ参考に見ていってくださいね。


〇 その他、必要な情報だけをピックアップ
TinyGPS++は任意のNMEAセンテンスから部分的に情報を切り取ることもできるわ。例えば

TinyGPSCustom pickup(gps,"GPRMC",1);

で「$GPRMC」の1番目、「協定世界時(UTC)」だけ得ることもできる。
日本はこれにプラス9時間。これで世界一正確な時計が作れる。


〇 アイディアいろいろ
GPSから取得できる情報はたくさんあるわ。だからアイディア次第でいろんなものを作ることができそう。
TinyGPS++の作者Mikalさんは、目的地が右(R)か左(L)かだけを表示する簡単ナビゲーション機能も情報を切り取るだけで簡単にできると紹介してる。

私だったら宝物を隠して、宝物の位置情報をプログラムに書き込んで、現在地との差を引き算させる。
緯度と経度で示す宝の地図よ。
ルナと隠しっこしたら楽しそう。



GPSロガーのプログラムは↓こちらにあります。
miraluna.hatenablog.com


プラスαの2回目」へ        「プラスαの4回目へ
            ★目次へ