GPSの活用


R2.10.30 地図を入れてスクロール運用してみる

 M5StackのGroveAポートGPSをソフトウェアシリアルで使って、現在地を中央にするよう地図をスクロールさせてみました。地図は国土地理院のものを利用させていただいています。詳細な等圧線が表示される状態で切りだしています。

 昨日、M5StackとGPSのセットをダッシュボード上に載せ車で走り回ったところ、それなりに測地できました(^^)/ しかし、画面キャプチャーは失敗(^^;) delay() を入れているからかな?

 地図サイズは、ほぼ縦4km×横5km。1280×960pxの大きさで、832kbでした。表示できます。もう少し大きくしていって限度サイズを見つけたいと思います。

 今朝、散歩に連れ出して記録を取ってみました。それなりに正確そうです。もっと正確にするには、表示する地図の左上と右下の経度・緯度をより厳密に決めてやればいいかと。散歩ぐらいなら、バッテリーは十分です。

 カメラで撮影したもの。

 スクリーンキャプチャーがうまく撮れたもの。十数回試みて、1枚だけ取れました。

 ただ、やっぱりスクリーンキャプチャーがうまくできません。スケッチ上で、タイミングを考える必要があります(^^;) 外で使うために、M5Stackの画面が見難いですね。

 持ちにくいため、GPSユニットに工具箱にあった金具を両面テープで貼り付け、M5Stack背面にある強力磁石を利用して一体化させてみました。

 電源を落としていると、コールドスタートで始めることになり、位置の取得が遅くなります。条件によって異なり、速いときは30秒ほどで、遅くなると数分かかってしまいます。


R2.10.28 地図を入れて運用してみる

 地図を入れて運用してみました。前回にもやっているので、スケッチ的には簡単に修正できました。車のフロントガラスの下に置いて走ってみると、下のようになりました。地図を固定し、移動が赤点になります。ずっと継続測定・描画するので、線になります。

 そして、下が画面コピーしたもの。国土地理院の地図を使わせていただいています。LCD画面左上が原点で、その場所の緯度・経度を基準にして、GPSからのデータをもとに点を打つだけなので難しいことはありません。

 さて、地図スクロールはやらないことにしていましたが、そんなに難しくないぞ?!ということでやってみました。

 地図固定だと320×240ドットの小さな地図で済みましたが、スクロールさせるとなると大きな地図画像が必要です。今回は試験的に908×2853ドットで1.5Mの大きさのjpegファイルで表示することができました。これなら日帰りの登山ぐらいならM5StackGPSを使えそうです。

 必要な地図を用意したら原点となる左上の緯度・経度を調べておきます。右下の緯度・経度を知れば、画像の縦横1ドットあたりどのくらいのΔ緯度・Δ経度になるかが分かります。GPSからくる現在地の緯度・経度を使って、原点から縦横のドット数が計算で求められます。

 M5Stackに表示される画面は、320×240ドットなので、現在地を中央にしたければ、原点からの縦横ドット数から縦240/2、横320/2ドットを引いた値が、大きな地図から切りだすM5StackLCD画面の左上の原点になります。これを表示してやればいいというわけです。

 私は、いつも「はやぶさ」さんの「M5Stackで画像処理 -静止画の表示から動画作成まで-」という記事を利用させていただいています。ありがとうございます。

 テスト動画としてここで見ることができます。ずっと継続してGPS測定するのはバッテリーを消耗するだけなので、間違えてはいけない重要な地点や休憩の時に確認するという使い方でよいのではないかと思いますし、そうであれば日帰りでバッテリーを心配する必要もないのではないかと思います。近いうちに実際に使ってみたいと思います。


R2.10.27 ソフトウェアシリアルで使う

 M5ATOMのGroveAポートをソフトウェアシリアルで使えたので、M5Stackやってみたところ、うまく動作しました。そこで、1年前にGPSユニットをで使おうと思っで、出来なかったことに再挑戦。Arduinoのサイトにあった、EspSoftwareSerialというのを使いました。

 ハードウェアシリアル2を使っていたスケッチはTinyGPS++.hをインクルードしていましたが、それに加えてSoftwareSerial.hをインクルードします。

// The serial connection to the GPS device
HardwareSerial ss(2);

としていたのを、

SoftwareSerial GroveA(22,21);

にしてみたらできました。もちろん、スケッチの下の方でssを使っている箇所はGroveAに直します。

 思いのほかGroveAのケーブルがしなやかだったので、これを使うことの違和感はありませんでした。


R2.7.17 地図上にプロットした

 GPSモジュールで現在地を知ることはできました。これを使って、マップ上で位置表示ができないかやってみました。

 スケッチ上の緯度・経度を得ている箇所で、M5Stackの320×240の座標画面にプロットしてやればいいわけです。得られる緯度・経度は少なくとも小数第6位までを使うようにしたいですね。そうでないと、かなり誤差が大きくなります。
 地図はグーグルマップのものが使いやすいです。国土地理院の地図もいいのですが、細かく見たいときには道路や等高線まで太くなってしまいます。今回は、徒歩による試行なのでグーグルマップを見ながらアバウトに手書きしました。
 M5Stack画面、左上の原点の緯度・経度を基準にします。緯度・経度小数第6位の1単位ごとに画面縦横のドット数がどのくらい違うかを換算値として求めておきます。そして、GPSからのデータを使って計算して画面での位置を求めます。画面は縦のY軸方向が数学とは違うことに留意しなければなりません。

 M5Stackに書き込んで、GPSと一緒になって歩いてみた結果が下記の通り。少々怪しいところもあるけれど、いい結果が得られました。

 もっとも、M5Stack使わなくてもスマホや高価だけどガーミンでも使えばもっといいデータが得られるんだけど(^^;) まあ、M5Stackでもできるということで。


R2.1.10 基板に取り付けた

 コードのままだとフラフラするので、基板に取り付けました。

 早速、実地に車で出かけて近くの運動公園野外ステージへ。その時の結果がこれ。朝5時に出かけたわけでなく、ただ世界時になっているだけです(^^;) このスケッチでは私には直せない(^^;)

 グーグルの地図で緯度経度を入れたら、下のようになりました。正確! 小数点表示を5桁にしたらさらに精度が高まりそう。


R1.12.25 拡張モジュールをセット

 コードが固いので、こんな感じになりました。右のモジュールを分解して、もう少しコンパクトにできるかもしれません。


R1.12.22 拡張モジュールを購入

 拡張モジュールのM5Stack用GPSユニットを購入しました。「GroveケーブルでM5Coreと接続することができるGPSユニット」ということで、購入したのです。

 注文してすぐに届くのがスイッチサイエンスさんのすごいところ。で、早速接続してみました。けれど、動かない。よくよく調べると、GroveソケットはI2Cポートのようだ。シリアル2ポートではない。ならばと5V電源とGNDはソケットそのままに、白と黄色のコードを切ってしまいました。白は、G16のRXD2、黄はG17のTXD2に接続して、先日作ったプログラムを動かしたところ、日にちと時刻が表示されました。時刻は世界時だけど。ダメかな〜と待っていたら、全て表示されました。表示された緯度・経度をグーグルマップに入れたところ、きちんと我が家を指示しました。使える。

 この拡張モジュールは安価なGPSモジュールです。もちろんもっと安いのもあるのですが、ケースに覆われているのがいいですね。同時に購入したプロトモジュールに入れ込んでもいいかもしれません。


 マイクロビットで躓いてしまったGPS。作ったGPS基板をM5Stackで使えるかな? ということで、やってみました。スケッチはM5Stackを導入した時に付いてきたサンプルスケッチ(スケッチ例→B5Stack→Modules→GPS→GPSRaw)。

 マイクロビットの基板では、P0とP1にGPSのRXとTXをつないでいるので、これとM5StackのRX2とTX2とを配線。VccとGNDをつないで書き込んでみると、なんとそのままデータが出力してくれました。M5StackにはUSBシリアル以外に、ハードウェアシリアルが2系統あるのですね。

 これでは、GPSデータがベタでみにくいので、整形します。もう一つあるサンプルのFullExampleを読み込んで、必要なデータを扱うスクリプト以外を消して見やすくします。このスケッチにはTinyGPS++のライブラリが要るので導入しておきます。やってみた結果が下の画像。

 4本の配線で実現できるので、このGPSユニットを別売のM5Stackのプロトモジュールに入れて合体させたいね。(相変わらず、ブレッドボードからATP3011を外していませんね(^^;)