ソラコム信州UGでWio LTEハンズオンをして、スターターキットも購入したので、せっかくなので色々試して手を動かしてみよう!の記録です。
さて、今回は、GPSですよ!
奥まった窓もないシェアオフィスの中では、GPS測定ができない・・・
ここは、長野県上田市です。寒いです。無理です。
寒いです。しばらくすると、シリアルモニタのログも止まってしまったんですが、寒さにMacかWioかセンサーが耐えられなくなったんでしょうか・・・(違ったんですがw。その話はあとで。)
プログラム準備編
まず、Grove-GPSの解説ページをみます。SeeedのWikiページから探せます。
UARTにつなげます。カチッとはめるだけなので、楽ですね・・・。
スケッチ例 grove-gps
Arduinoのスケッチ例ですでにgrove gpsがあるので、これをコンパイルして書き込みして、実行します。
シリアルモニタに結果が出力されますが・・・・・・・肝心の緯度経度が、出てきません。
しかも、衛星の数が4つ取れたところで、シリアルモニターがストップしてしまいます。
なんでやー。
電源供給が足りないのか。。。と思案したり、だーいぶ悩んだんですが、スケッチ例ではうまくいかない、という結論です。
GpsDataとして確保しているのが、スケッチ例では、60となっていますが
HardwareSerial* GpsSerial; char GpsData[60];
200くらいに増やしてあげてください。
HardwareSerial* GpsSerial; char GpsData[200];
無事にシリアルコンソールに出力されました。
衛星が取得できて、緯度経度が取得できたけど、それを蓄積できる領域が足りませんでした、という罠でした。
バッファオーバーランかよー pic.twitter.com/Xynnc0I1fJ
— ぼへぼへ (@bohebohechan) January 2, 2018
さて、ここに出力されているのは、GPSのNMEA フォーマットですね。
こちらに詳しく値が何なのかの仕様がかかれてありますのでご参考に。
TinyGPS
ちょっと表記がわかりにくいので、「TinyGPS++」を使います。
取得した値をわかりやすく表示することができます。
TinyGPSを使った表示
TinyGPS++をダウンロードしてzipファイルをインクルードします
#include <TinyGPS++.h>
スケッチ例のGpsReadの関数に追加
const char* GpsRead() { while (GpsSerial->available()) { char data = GpsSerial->read(); if (gps.encode(data)) { displayInfo(); }
表示関数
void displayInfo() { SerialUSB.print(F("Location: ")); if (gps.location.isValid()) { SerialUSB.println(gps.location.lat(), 6); SerialUSB.println(gps.location.lng(), 6); } else { SerialUSB.println(F("INVALID")); } }
結果
シリアルコンソールで確認です!
緯度、経度が表示できました。
結局、GPSのデバッグは東京のオフィスの窓際でせっせとやりました。
さて、次は、何を使ってみようかな・・・・。