公開日:2025/06/14
title.png

35th Season


#35-2 GPSロガ(作ろう)

 M5StickC Plus用に制作したログストレージハットGPSモジュール(NEO-6M)を組み合わせて、GPSロガを作って見たいと思います。

システム設計

 まずは、設計完了した回路図を示します。

a352_schem.png

 I2C EEPROM(24C256)周りの回路は、こちらで制作したログストレージハットを使います(下図)。

a351_expr.jpg

 残りの回路はジャンパ線×3本で、ログストレージハットのピンソケット(PS)からGPSモジュール(下図)へ接続するだけです。

a34a_gpsneo6m.jpg

U/I設計

 装置はGPS受信機としても使える様、M5StickC PlusのTFTディスプレイへ位置情報と日時を表示しようと思います(下図)。

a352_uigps.png

書き込み禁止スイッチ

 ログストレージハット基板上に設けた書き込み禁止(WP)スライドスイッチを使って、ログ記録の可/否を選択可能にしておきたいと思います。例えば、以下の様な用途を想定する物です。

 ログストレージの容量を超えて記録し続けると古いデータから順に上書きされる仕様なので、上例の様に手動で制御できる機構も必要だと考えました。

シングルタスク

 TFTディスプレイの描画処理やI2C EEPROMへの書き込み処理などで、GPSモジュールからのデータ受信を干渉しないよう、2つの仕事の一方はFreeRTOSのサブスレッドに任せる、等と言うカッコ良い仕様も考えました。ですが、GPSモジュールからは1秒毎にNMEA形式のテキストデータが送られてくるだけなので処理量は多くなく、シングルタスクで充分であろうと見込みました。
 仮に、1回や2回受信損ねたとしても、バッファに溜まっている内に追いつけるはずです。マルチタスクの面倒なプログラムにしなくても、充分ハンドリングできるでしょう。

 CPUの動作周波数を低下させて低消費電力化を実施する場合にも、デュアルコアCPUの1個しか使用しないシングルタスクの方が有利(対処容易)だと考えられます。

モバイルバッテリ(オプション)

 こちらの回路を参照していただくと解る通り、M5StickC Plusの内蔵バッテリ(120mAh)で、I2C EEPROMおよびGPSモジュールの電源も支える必要があります。それでも1時間くらいは持つかもしれませんが、帰って確認したらバッテリ不足で電源が切れていた、なんて締まりませんから、念のためモバイルバッテリ(下図等)で強化しておいた方が良いでしょう。

ar66_mbatt.jpg

 上図のモバイルバッテリはUSB出力型(5V)なので、そのままM5StickC PlusのUSB端子と接続すれば、システム全体に電源を供給可能です。

 アプリケーションに要求される稼働時間次第では、CPUの動作クロック周波数を下げたりする必要があるかもしれません(下図、Arduino IDE)。

a233_fcpumenu.png

 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の容量を考慮の上、ログ間隔を設定する必要があるでしょう。

  その他のヒント:

 プログラムの改修は皆様の発想(と必要性)にお任せ致します。


 以上でシステム全体の設計が終わったところです。今回は、ここで締めて、次回、完成させようと思います。


btn_arduino.png

btn_prev.png btn_next.png

home