
M5StackでGPSロガーを作ろう(ソフトウェア開発編)
(これまでのあらすじと経過報告)
オールインワンマイコンモジュール「M5Stack」でGPSロガーを作ろうとしていた俺は、
付属の開発環境であるUIFlowが高度をサポートしていないことに不満を覚えていた。
公式に突撃したところ"Fix soon..."との回答を得られたが、いつまで経ってもサポートされない。
思わず俺はスン…となってしまったのだった。
しかし指をくわえて待っていても仕方がない。
ひとまず手を動かすことにしたのだが、それは俺の生活に暗い影を落としたのであった。
ともあれ手を動かすよりに他はないのだ。
俺はarduinoでソフトを作ることにした。
が…
遅い…
あまりにもarduinoのコンパイル速度が遅い。
まるでハエがとまるようだ。
これではちょっとした修正でも気軽に行えない…
そこで調べてみた結果、PlatformIOという開発環境に行き着いた。
そういえばこの前、कोष्ठकाःがそんなことを言っていたきがする…
このPlatformIOはVS Codeの拡張機能として提供されている。
さっそくVS Codeにインスコしてみた。

なんかアイコンが蜂だかアリみたいでキモい。
しかし、そのキモさとは裏腹にコンパイル速度が劇的に向上した。
30分くらいかかっていたコンパイルが2分程度で完了する。
素晴らしい…
だが、ここで気になることが発生した。
画面表示がチカチカしてしまうのだ。
調べてみたところすぐに原因がわかった。
バッファリングを行っていなかったのだ。
つまり、描画が画面表示処理についていっていない。
なので、一旦メモリエリアに書き出して、ある程度たまったところで画面に描画する、いわゆるダブルバッファリングを実装した。
これはLovyanGFXライブラリのLGFX_Spriteクラスを利用することで簡単に実装できる。
なんかプログラムがいい感じになってきたので、調子に乗ってGPSロガーにおしゃべりしてもらおうと画策する。
これも前にdấu ngoặcからSkebで依頼できるよ!
と聞いたので早速skebを見てみると…ほんとだ…
すげえ…なんでもあんだなskeb。
俺はサンプルボイス(エロボイス)の海で頭の中をピンクにしながら、依頼する声優さんを一生懸命選んだのだった。
なにはともあれGPSロガーは外で使用するものだ。
なのでなによりも聞きやすい声が優先される。
聞きやすい声!聞きやすい声!エロボイス…エロボイス!エロボイス!!
というわけで俺が選んだのは白樺玲奈さん(https://skeb.jp/@ReinaShirakaba)だ。
姉ちゃんいい声しとるけん…これに声ば入れてくれんね…グヘヘヘ…
とお願いしたところあっさり受けて頂けた。
天使かよ…本当にありがとうございました…
思えばこのときが一番楽しかった。
ここで余談だが、なぜ俺が高度にこだわるか、その理由を話しておきたい。
まず、速度や位置情報などは車ならカーナビやスピードメーターをみれば事足りる。
だが、高度という情報はなかなか目にすることができない。
それに高度を知っておけば「俺はいま標高XXXXmにいるが貴様は?」とマウントを取ることが可能だ。
なので高度が一番重要である。
さて、skebで依頼していた声が納品されたので、MP3再生機能を実装していく。
MP3再生はESP8266Audioというライブラリを使用することで実装できる。
が…
うまくいかない。
再生されない。
なんでだ…とおもったらこれも簡単にわかった。
GPSの処理とMP3再生処理を同時に行おうとしたためだ。
CPUは当然ながら一回に一個の命令しか処理できない。
そのため両者を別々に行う必要がある。
幸いM5StackはESP32のデュアルコア。
さらにM5Stackのプログラムは、FreeeRTOSという身も蓋もない名前のリアルタイムOS上で動作している。
FreeeRTOSはマルチタスクをサポートしている。
以上を踏まえてそれぞれの機能を別々のCPUに振り分ける。
図にするとこんな感じ。

多少処理がめんどくさくなるが仕方ない。
ここからが地獄だった。
最初数日まではこの処理でうまく行っていた。
だが突然その日が訪れた。
いきなりMP3の再生速度が0.5倍くらいになってしまった。
なんで!?
俺はパニックに陥った。
いったん処理をすべて見直した。
問題はなさそうである。
MP3再生サンプルプログラムを見つけて入れてみたが、これもだめ。
組み込み屋をやっている友人を巻き込みいろいろ相談してみた。
がそれもだめ。
うまくいかないときは何をやってもダメ。
このあたりで俺は若干不眠症になってきた。
自分で書いたプログラムでここまでドはまりしたのは初めてだ。
苦しい…マジで苦しい…なんだこれ。
俺はコロナになっていた。
ビジネスホテルに一週間の引きこもり生活をエンジョイした俺は、
ひとまずMP3再生機能を置いておくことにする。
最低限の機能を実装せねば意味はない。
というわけでロガー機能を実装した。
次はデバッグである。
M5Stackを車に載せて走ってみることにした。
せっかくなので家族に同行をお願いしたところ二つ返事で了承してくれた。
目的地は福島県の猪苗代湖としてデータ採集を行う。
家を14時に出発し18時猪苗代湖についた。
すげえ真っ暗でなんも見えねえ。
だが助手席の家族は不満げな表情すら見せなかった。

ありがてえ。
疲れたがデータ分析である。
まずは位置情報。
すげえちゃんととれてる。

次に高度。
走ったところの大体の地形がわかる。
なかなかおもしろい。

最後に速度。
ギザギザしているがこれは赤信号や買い物で停止した箇所だ。
自分の運転の癖などを知ることができる。

以上、結構正確なデータを取得できたのでロガー機能は満足。
MP3再生機能しばらくペンディングにしておく。
もしなにかいいアイディアがあったら教えてほしい。
ご清聴ありがとうございました!

【ソースコード】
https://github.com/gratingBoy/M5stack-GPSDisplay-
【音声提供】
白樺玲奈 さま
https://skeb.jp/requests/839667
【参考文献】
M5Stack ドキュメント
FreeRTOSドキュメント
TinyGPS++
http://arduiniana.org/libraries/tinygpsplus/
ESP8266Audio
https://github.com/earlephilhower/ESP8266Audio