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)を始めてみた

サンプルプログラムを使って、加速度とジャイロのセンサ値が、下記のように直に読めました。
|
1 2 3 4 5 6 7 |
---- シリアル ポート COM3 を開きました ---- AX: 0.-69433; AY: 0.-143057; AZ: 9.765049; GX: 0.001331; GY: 0.010919; GZ: 0.001331; AX: 0.-62849; AY: 0.-152635; AZ: 9.747092; GX: 0.-00798; GY: 0.010652; GZ: 0.000266; AX: 0.-71828; AY: 0.-140065; AZ: 9.760859; GX: 0.000532; GY: 0.011718; GZ: 0.-01065; AX: 0.-77813; AY: 0.-143057; AZ: 9.749486; GX: 0.-01331; GY: 0.010919; GZ: 0.001597; AX: 0.-60455; AY: 0.-143656; AZ: 9.755472; GX: 0.000000; GY: 0.010919; GZ: 0.000266; AX: 0.-62251; AY: 0.-150839; AZ: 9.751282; GX: 0.000532; GY: 0.012250; GZ: 0.000532; |
今回は、M5Stack CoreS3とZephyr RTOSを組み合わせて、内蔵されている6軸IMUセンサー「BMI270」から加速度データを取得する方法を紹介します。
取得したデータは、最終的に「Edge Impulse」に送ってエッジAI(機械学習)の学習データとして活用することを目的としています。
開発環境とベースとなるサンプルコード
今回使用する環境は以下の通りです。
- デバイス: M5Stack CoreS3
- OS: Zephyr RTOS
- センサー: BMI270 (M5CoreS3に内蔵)
M5CoreS3向けにビルドするためのコマンドは以下のようになります。
Zephyrのセンサー値取得における落とし穴(マイナス表示問題)
Zephyrでは、センサーの値を struct sensor_value という構造体で保持します。この構造体は、浮動小数点演算(FPU)を持たないマイコンでも小数を扱いやすくするため、以下のように2つの整数で構成されています。
val1: 整数部val2: 小数部(100万分の1単位)
通常、これを printf で表示する場合、%d.%06d のように指定して val1 と val2 を結合して出力します。
しかし、値がマイナスになった時にそのまま表示すると以下のような表示崩れが起きてしまいます。
- -0.5 のような場合 整数部(
val1)は0、小数部(val2)は-500000となります。これをそのまま出力すると0.-500000となり、マイナス記号が小数点の後に来てしまいます。 - -1.5 のような場合 整数部(
val1)は-1、小数部(val2)も-500000になるため、-1.-500000とマイナスが重複してしまいます。
Edge ImpulseのCLI(Data Forwarder)等でデータを読み込ませる場合、このフォーマット崩れは致命的で、正しくデータが認識されません。
解決策:printfのフォーマットを修正する
実際のC言語の修正コードはこちらです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// 加速度データのX, Y, Z軸の値を綺麗にフォーマットして出力 printf("%s%d.%06d %s%d.%06d %s%d.%06d\n", // X軸 (acc[0].val1 == 0 && acc[0].val2 < 0) ? "-" : "", acc[0].val1, acc[0].val2 < 0 ? -acc[0].val2 : acc[0].val2, // Y軸 (acc[1].val1 == 0 && acc[1].val2 < 0) ? "-" : "", acc[1].val1, acc[1].val2 < 0 ? -acc[1].val2 : acc[1].val2, // Z軸 (acc[2].val1 == 0 && acc[2].val2 < 0) ? "-" : "", acc[2].val1, acc[2].val2 < 0 ? -acc[2].val2 : acc[2].val2); |
%sを先頭に追加し、val1 == 0かつval2 < 0の条件を満たした時のみ"-"(マイナス記号の文字列)を出力させています。val2を表示する箇所では、acc[0].val2 < 0 ? -acc[0].val2 : acc[0].val2として、値がマイナスの場合は符号を反転させて正の数として出力しています。

下記のように取得できるようになりました。
|
1 2 3 4 5 6 |
---- シリアル ポート COM3 を開きました ---- -0.080208 -0.056864 9.784802 -0.089785 -0.072426 9.768042 -0.087391 -0.073623 9.766246 -0.089186 -0.065243 9.769239 -0.077813 -0.077215 9.778816 |
実際のEdge Impulseのデータアップロード
Edge Impulseにアップロードするには環境構築する必要があります。
詳細は下記記事を参照ください。
デバイスは違えど、具体的な学習方法含めて紹介しています。全く同じ手順です。
Edge Impulseで加速度センサ値を学習(XIAO nRF54L15 Sense編)

今回はデフォルトの加速度センサの周波数が100Hzのため、その設定で取得しています
あとはM5Stackを使って、好きなデータを取得するだけです。
今回はIdle, UpDown, Flick, Knockの4種類のデータを各3分集めてみました。

デバイスの設定に関しては、ESP32を選び240MHzに設定しておきました。
CoreS3のRAM_8MB、ROM_16MBにしています。
C++用にデプロイして、モデルを取得できました。

まとめ
M5Stackの加速度センサ値をEdge Impulseにアップしてみました。
Edge ImpulseでCoreS3用のエッジAIモデルを作成してみました。
データアップロード方法含めて、概要レベルですが紹介しました。

コメント