UNO Q & Zephyr RTOSでエッジAIをしてみた

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

Arduino® UNO Qは、高性能なLinux側だけでなく、超省電力で動作するマイコン側(STM32U585)も魅力です。

今回は、マイコン側でリアルタイムOS「Zephyr RTOS」を動かし、SPIカメラ(Arducam Mega)とPIRセンサーを用いた、省電力なエッジAI(デバイス識別)の実行例を紹介します。

 

スポンサーリンク

Arduino® UNO Q & Zephyr RTOS でエッジAI!【SPIカメラ & FOMOによるデバイス識別編】

Arduino® UNO Qは、高性能なLinux側だけでなく、超省電力で動作するマイコン側(STM32U585)も魅力です。

今回は、マイコン側でリアルタイムOS「Zephyr RTOS」を動かし、SPIカメラ(Arducam Mega)とPIRセンサーを用いた、省電力なエッジAI(デバイス識別)の実行例を紹介します。

 

 

プロジェクト・GitHubのリンク先

コンテストに提出したプロジェクトのリンク先は下記です

Attention Required! | Cloudflare

 

GiHubのリンク先は下記です

GitHub - iotengineer22/unoq-edge: This repository present solution for the Invent the Future with Arduino UNO Q and App Lab
This repository present solution for the Invent the Future with Arduino UNO Q and App Lab - iotengineer22/unoq-edge

 

STM32U585でZephyr RTOSを動かすメリット

Arduino® UNO Qは、強力なマイコンであるSTM32U585(Cortex-M33、2MB Flash、768KB SRAM)を搭載しています。

Zephyr RTOSを採用することで、以下の恩恵を受けられます。

 

* デバイス木(Device Tree)によるすっきりした物理ピン管理

* 省電力管理(Power Management)が容易
PIRセンサー信号でスリープから復帰し、実行後に再びアイドルに戻る処理が簡単に書けます。

* Edge Impulse C++ SDKとの高い親和性
TinyMLモデルをRTOSのタスクとして安全に実行可能です。

 

SPI接続カメラのデバイスツリー設定(Device Tree Overlay)

SPIカメラをSTM32U585に認識させるため、デバイスツリーオーバーレイ(app.overlay)を作成します。

SPI2ポートの物理ピンを設定し、CSピンにD10(PB9)を割り当てます。

デバイスツリーのソースコードは、下記GitHubで公開しています。

Unicorn! · GitHub

 

 

Edge Impulse C++ SDKのZephyrへの組み込み

ディレクトリ構成

Edge Impulse Studioで学習したFOMOのC++ライブラリを、Zephyrのアプリケーション構成内に配置します。

 

 

CMakeLists.txtの設定

静的メモリ割り当てフラグを設定し、モデルソースコードをリンクします。

CMakeLists.txtのソースコードは、下記GitHubで公開しています。

Unicorn! · GitHub

 

 

メモリ(SRAM 768KB)の制約とAverage Poolingリサイズ

STM32U585のSRAMは768KBとマイコンとしては大容量ですが、320x320ピクセルのRGB565画像は1フレームで約200KBを消費します。

ダブルバッファやTFLiteのワークメモリを合わせると、メモリが枯渇します。

そこで、キャプチャしたフレームをAverage Pooling(平均化プーリング)アルゴリズムにより、RAM上でノイズを抑えつつ 96x96 ピクセルに縮小して入力します。

これによりSRAMを大幅に節約し、RTOS上で安全に推論を実行可能です。

 

実際のデモ動画は下記です。

 

PIR人感センサーの割り込みと省電力ライフサイクル

センサーが検知した時だけ動作させるため、PIRセンサーとカメラの制御を連動させます。

PIR割り込みのC++実装

D7(PB2)ピンをエッジトリガーの割り込みとして設定します。

検知するとセマフォ pir_sem が解放され、ループが起動します。

PIRセンサー割り込みのコードの詳細は、下記GitHubで公開しています。

unoq-edge/src/spi-cam/sensor-camera/src at main · iotengineer22/unoq-edge
This repository present solution for the Invent the Future with Arduino UNO Q and App Lab - iotengineer22/unoq-edge

 

 

Edge Impulse 推論ループ

検知されたらカメラを起動し、フレームを取得して推論します。

識別結果(pico, xiao, nrf54l15, fpc)をオンボードのRGB LEDで表示し、再びカメラを省電力モードにして停止します。

 

 

まとめ

Zephyr RTOSの割り込み機能を活かし、無駄な電力を徹底的に排除した、イベント駆動型のデバイス識別ユニットが完成しました。

次回は、マイコン側での各種設定や、Linux側でのMIPIカメラ制御、画質調整および検証結果を紹介します!

コメント