M5StickC Plus用に制作したログストレージハットにGPSモジュール(NEO-6M)を組み合わせて、GPSロガを作って見たいと思います。
まずは、設計完了した回路図を示します。
I2C EEPROM(24C256)周りの回路は、こちらで制作したログストレージハットを使います(下図)。
残りの回路はジャンパ線×3本で、ログストレージハットのピンソケット(PS)からGPSモジュール(下図)へ接続するだけです。
装置はGPS受信機としても使える様、M5StickC PlusのTFTディスプレイへ位置情報と日時を表示しようと思います(下図)。
ログストレージハット基板上に設けた書き込み禁止(WP)スライドスイッチを使って、ログ記録の可/否を選択可能にしておきたいと思います。例えば、以下の様な用途を想定する物です。
ログストレージの容量を超えて記録し続けると古いデータから順に上書きされる仕様なので、上例の様に手動で制御できる機構も必要だと考えました。
TFTディスプレイの描画処理やI2C EEPROMへの書き込み処理などで、GPSモジュールからのデータ受信を干渉しないよう、2つの仕事の一方はFreeRTOSのサブスレッドに任せる、等と言うカッコ良い仕様も考えました。ですが、GPSモジュールからは1秒毎にNMEA形式のテキストデータが送られてくるだけなので処理量は多くなく、シングルタスクで充分であろうと見込みました。
仮に、1回や2回受信損ねたとしても、バッファに溜まっている内に追いつけるはずです。マルチタスクの面倒なプログラムにしなくても、充分ハンドリングできるでしょう。
CPUの動作周波数を低下させて低消費電力化を実施する場合にも、デュアルコアCPUの1個しか使用しないシングルタスクの方が有利(対処容易)だと考えられます。
こちらの回路を参照していただくと解る通り、M5StickC Plusの内蔵バッテリ(120mAh)で、I2C EEPROMおよびGPSモジュールの電源も支える必要があります。それでも1時間くらいは持つかもしれませんが、帰って確認したらバッテリ不足で電源が切れていた、なんて締まりませんから、念のためモバイルバッテリ(下図等)で強化しておいた方が良いでしょう。
上図のモバイルバッテリはUSB出力型(5V)なので、そのままM5StickC PlusのUSB端子と接続すれば、システム全体に電源を供給可能です。
アプリケーションに要求される稼働時間次第では、CPUの動作クロック周波数を下げたりする必要があるかもしれません(下図、Arduino IDE)。
CPUクロック周波数はパフォーマンスに影響する重要なパラメータなので、変更した場合、本当に処理速度が足りているか?の検証が必要です。その様な方法で対処するより先に、外部モバイルバッテリを接続して電源を増強する方が、余計な心配をする必要も無くお手軽です。
こちらの記事にて、データをレコードと言う単位で記録する仕様を策定しました。1レコード当たり16バイト、その内データ本体は12バイトです。
今回のGPSロガでは、日付、時刻、緯度、経度、標高を記録したいと思います。これだけのデータ量を記録するのに1レコード(12バイト)では不足なので、以下の如く2レコードセットで1回分のログを記録する事にしました。
GPSロガのレコード仕様:
記録する数値データは全て、int32(32ビット整数型)で、ビッグエンディアンです。
GPSモジュールからのデータ送信間隔は約1sなので、最短では1s間隔でのログ取得が可能です。一方、ログストレージとして使用するI2C EEPROMには容量の制限があるので、ログ間隔を短くするとログ容量が増大して、記録可能な時間が短くなります。
移動速度を考慮に入れて見ましょう。ログ周期=1分だと、徒歩でも約80m進めてしまいます。車で移動する場合、法定速度60[km/h]なら、1分で1kmも移動することになります。もう少し短い周期に設定したいですか??
例)ログ容量
例示した通り、ログを取得しようとする場合の移動手段なり、その後のログ利用方法なりで、適切なログ間隔は異なります。一意に決められるものではないので、以下の通り、定数として設定可能としておきます。
const int gps_sec_log_itvl=10; // eep: log interval [s]
デフォルトでは、上コード例の通り10s間隔としてあります。
M5StickC Plusの内蔵バッテリ容量などを勘案すると、充分な時間だと考えられますが、長時間給電可能な電源を確保してログを取得する用途では、EEPROMの容量を考慮の上、ログ間隔を設定する必要があるでしょう。
その他のヒント:
プログラムの改修は皆様の発想(と必要性)にお任せ致します。
以上でシステム全体の設計が終わったところです。今回は、ここで締めて、次回、完成させようと思います。