はじめに
Node-RED MCUを使ったセンサデバイス開発と、Raspberry Pi上のNode-REDを中心としたエッジコンピューティングが最近の私の定番になっています。ちょうど先日、12/17に大阪南港の大阪産業局ソフト産業プラザTEQSで参加いただいた方々(9名)と一緒にデバイスを作ってセンサデータをエッジで処理するプロトタイプを製作するイベントを行いましたので、その概略を紹介します。
### システム構成
市販の加速度センサモジュールを使ったウェアラブルデバイスを作って加速度とジャイロの値をモニタし、行動検知や姿勢推定を行います。クラウドでの管理も意識して、各段階でデータ量を減らすことと、各デバイスやエッジサーバの識別情報も取得してメッセージに含めるようにしています。
MCUとしてxiao ESP32S3を使用しています。このサイズでWiFiが使えてLiPoバッテリーマネジメント機能も含んでいるのでウェアラブルデバイスにはピッタリです。

### デバイスのハードウェアを作る
その場で電子工作をするために、少し小さめのブレッドボードを使用して配線し、ブレッドボードとバッテリーごとケースに入れる構成としました。ケースはサイズと部品配置に合わせて3Dプリンターで作成しています。
加速度センサモジュールはアマゾン等でも良く見かけるMPU-6050モジュールですが、今回はこれに少々引っかかってしまいました。同じMPU-6050搭載のモジュールですが、最初新規購入したもの(右)が動作せず、以前購入したもの(左)を試したら問題なく動作しました。
良く見るとチップサイズが異なるのですが、今回は深追いせず動作したチップの大きなものを手配して使用しました。

### デバイスのフロープログラムを作る
今回はこのようなフローを用意しています。一応加速度センサのオフセット調整にも対応しています。オフセット調整はエッジサーバのダッシュボード画面からもコントロールできるように、デバイスに向かうMQTTのパスも用意しました。
Node-RED MCUプラグインからxiao ESP32S3に書き込みを行います。
### エッジサーバのフロープログラムを作る
エッジサーバをWiFiアクセスポイントとして先に作ったデバイスから接続に行きますが、その内容は別記事にしています。
このエッジサーバ用のRaspberry Piにaedes mqtt brokerをセットして、センサデータを扱う次のフローをセットします。

クラウドとの接続は想定していますが、今回は準備していないのでノードを無効化しています。
おもな処理の内容
他にもやり方はあると思いますが、今回の実装内容です。
センサモジュールのデバイス内部では50Hz(1秒間に50回)で加速度センサMPU-6050からデータを取得しますが、このレートで全てのデータをMQTTでエッジサーバに送ると流石に厳しいので、1秒間ごとに(50サンプル)の統計情報として送信します。

これを受信したエッジサーバ内では、ファンクションノードで行動検知ノードを用意したり、姿勢推定を用意して分析した結果を出力します。
・AIによるファンクションノードのコード生成
実は、この部分は入力の統計情報の構造と検知したい内容を生成AIに伝えてファンクションノード内のコードを生成しています。
その結果をダッシュボードのノードを使用して表示したり、クラウドに送るメッセージを作ったりします。
生成AIでコード生成すると、なかなかまともに動くものが出来なくて面倒見るのが大変という話もありますが、Node-REDを使ってデータの処理の流れを決めたうえで、入力メッセージの構成を示して必要な処理を指示すると、かなり上手く生成してくれます。他の検出項目が必要な場合も、加速度センサの統計情報を使って検出できるものであれば生成してくれると思います。
そういえば、もともとNode-REDはノーコード・ローコードという印象が広く伝わっているようですが、このようにファンクションノードを多用して内部をAIで生成するのにはすごく向いていると思うので、こういった使い方が広まれば「ノードを使ったメッセージ駆動型のソフトウェアがAIで作りやすいツール」というように認知が進むかもしれませんね。
ちなみに、今回のデバイス側フローもエッジサーバ側フローも、ファンクションノードを多用していますが、ほとんどAIで生成したコードを入れています。
動作確認
1.軸変換とオフセット調整動作
今回のモジュールは左上腕にラバーバンドで取り付ける想定で、ケースの方向が図のように縦になっている状態で鉛直上向きの方向がZ+として使用します。
そのため、加速度センサのデータを受信した直後に軸変換を行っています。
その後、オフセット調整コマンドを受信すると、その方向の重力加速度の値を目標値としてオフセット補正値を取得します。
取得したオフセット補正値は、デバイスのフラッシュメモリ領域に保存して起動時に取得できるようにしています。

加速度のチャートでは、Z+軸が地球の重力加速度の9.8m/s^2(1G)に調整され、X軸Y軸は0に調整されます。ジャイロのX,Y,Z軸も0に合わせて調整されています。
2.動作検出
転倒時などの強い衝撃があったり、運動中などの動作を検出して表示します。

3.姿勢推定
今回は簡易的に加速度センサのX,Y,Z軸のどこが地球の重力加速度を検知しているかで姿勢を推定しました。

さいごに
今回は午後の4時間という限られた時間でNode-REDのフロープログラミングの基本的な所からNode-RED MCU,そしてハードウェアの電子工作と3Dプリンタ製ケースへの組み込みというプロトタイプの製作に関する部分を詰め込んだ形になったのですが、最終的に実動作するプロトタイプ的なものを持ち帰ってもらう事が出来たので満足度は高かったようで良かったです。またアイデアをだしながら少しづつでもこういった活動ができればいいなと思います。



