M5Stackの加速度センサ値をEdge Impulseにアップしてみた

本サイトはアフィリエイト広告を利用しています。
Zephyr

M5Stackの加速度センサ値をEdge Impulseにアップしてみました。

Edge ImpulseでCoreS3用のエッジAIモデルを作成してみました。

データアップロード方法含めて、概要ですが紹介します。

 

スポンサーリンク

M5Stackの加速度センサ値をEdge Impulseにアップしてみた

M5Stackの加速度センサ値をEdge Impulseにアップしてみました。

Edge ImpulseでCoreS3用のエッジAIモデルを作成してみました。

データアップロード方法含めて、概要ですが紹介します。

 

今回紹介するのはZephyr(RTOS)を使っての手法です。少し特殊なVerのためご注意ください。

 

Edge Impulseが学習できるデータに変換

下記記事でも加速度センサのサンプルをZephyr(RTOS)で動かす方法を紹介しています。

M5Stack CoreS3でZephyr(RTOS)を始めてみた

M5Stack CoreS3でZephyr(RTOS)を始めてみた
M5Stack CoreS3でZephyr(RTOS)を始めてみました。M5Stackも多くの機種がZephyr(RTOS)サポートされています。購入して、簡単なテストをしてみた内容を紹介します。M5Stack CoreS3でZephyr(...

 

サンプルプログラムを使って、加速度とジャイロのセンサ値が、下記のように直に読めました。

 

今回は、M5Stack CoreS3とZephyr RTOSを組み合わせて、内蔵されている6軸IMUセンサー「BMI270」から加速度データを取得する方法を紹介します。

取得したデータは、最終的に「Edge Impulse」に送ってエッジAI(機械学習)の学習データとして活用することを目的としています。

 

開発環境とベースとなるサンプルコード

今回使用する環境は以下の通りです。

  • デバイス: M5Stack CoreS3
  • OS: Zephyr RTOS
  • センサー: BMI270 (M5CoreS3に内蔵)

M5CoreS3向けにビルドするためのコマンドは以下のようになります。

west build -p -b m5stack_cores3/esp32s3/procpu

 

Zephyrのセンサー値取得における落とし穴(マイナス表示問題)

Zephyrでは、センサーの値を struct sensor_value という構造体で保持します。この構造体は、浮動小数点演算(FPU)を持たないマイコンでも小数を扱いやすくするため、以下のように2つの整数で構成されています。

  • val1: 整数部
  • val2: 小数部(100万分の1単位)

通常、これを printf で表示する場合、%d.%06d のように指定して val1 と val2 を結合して出力します。

しかし、値がマイナスになった時にそのまま表示すると以下のような表示崩れが起きてしまいます。

  1. -0.5 のような場合 整数部(val1)は 0、小数部(val2)は -500000 となります。これをそのまま出力すると 0.-500000 となり、マイナス記号が小数点の後に来てしまいます。
  2. -1.5 のような場合 整数部(val1)は -1、小数部(val2)も -500000 になるため、-1.-500000 とマイナスが重複してしまいます。

Edge ImpulseのCLI(Data Forwarder)等でデータを読み込ませる場合、このフォーマット崩れは致命的で、正しくデータが認識されません。

 

解決策:printfのフォーマットを修正する

実際のC言語の修正コードはこちらです。

  • %s を先頭に追加し、val1 == 0 かつ val2 < 0 の条件を満たした時のみ "-"(マイナス記号の文字列)を出力させています。
  • val2 を表示する箇所では、acc[0].val2 < 0 ? -acc[0].val2 : acc[0].val2 として、値がマイナスの場合は符号を反転させて正の数として出力しています。

 

下記のように取得できるようになりました。

 

実際のEdge Impulseのデータアップロード

Edge Impulseにアップロードするには環境構築する必要があります。

詳細は下記記事を参照ください。

デバイスは違えど、具体的な学習方法含めて紹介しています。全く同じ手順です。

Edge Impulseで加速度センサ値を学習(XIAO nRF54L15 Sense編)

Edge Impulseで加速度センサ値を学習(XIAO nRF54L15 Sense編)
Edge Impulseで加速度センサのデータを学習させました。XIAO nRF54L15 Senseを使用しています。プログラムから、Edge Impulseへのデータのアップ含めて紹介します。Edge Impulseで加速度センサ値を学...

 

今回はデフォルトの加速度センサの周波数が100Hzのため、その設定で取得しています

edge-impulse-data-forwarder --frequency 100

あとはM5Stackを使って、好きなデータを取得するだけです。

今回はIdle, UpDown, Flick, Knockの4種類のデータを各3分集めてみました。

 

デバイスの設定に関しては、ESP32を選び240MHzに設定しておきました。

CoreS3のRAM_8MB、ROM_16MBにしています。

C++用にデプロイして、モデルを取得できました。

 

まとめ

M5Stackの加速度センサ値をEdge Impulseにアップしてみました。

Edge ImpulseでCoreS3用のエッジAIモデルを作成してみました。

データアップロード方法含めて、概要レベルですが紹介しました。

コメント