TinyMLキーワード検出でRGBライトを音声制御 - Arduino Nano 33 BLE Sense活用
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Nano 33 BLE Sense | 1 | マイク、IMU、環境センサー、APDS-9960内蔵 |
使用アプリとオンラインサービス
- Edge Impulse Studio(機械学習モデル構築・デプロイ)
プロジェクトのねらい
エッジデバイスでの機械学習(TinyML)を活用し、従来の複雑なロジック不要で「インテリジェント」なキーワード検出を実現。特定の言葉を認識したらオンボードRGB LEDの色を変えるデモを作成しました。
ハードウェア
Arduino Nano 33 BLE Sense単体で完結。nRF52840(64MHz、1MB Flash、256KB RAM)搭載。オンボードマイクで音声収録、オンボードRGB LEDで結果表示。外部部品不要。
Edge Impulseのセットアップ
- Edge Impulseで新規プロジェクト作成
- CLIツールインストール、ボードをブートローダーモード(リセットボタン二回押し)にしてファームウェア書き込み(
flash_windows.bat実行) edge-impulse-daemon実行でウィザードに従い設定。デバイス一覧にNanoが表示されるようになる
データ収集(学習用サンプル録音)
以下5クラスのキーワードを各約1分ずつ録音(1-2秒間隔で繰り返し発話):
- 「On」(点灯)
- 「Off」(消灯)
- 「Red」(赤)
- 「Green」(緑)
- 「Blue」(青)
背景雑音や未知単語への耐性を持たせるため、Edge Impulse提供の「Noise」と「Unknown」データセットも追加アップロード。学習:検証 = 80:20 に再バランス調整。
モデル訓練
インパルス設計:
- 入力:音声時系列データ(ウィンドウ1秒、ストライド500ms)
- 前処理:MFCCブロック(メル周波数ケプストラム係数)でスペクトログラム生成
- 学習:Kerasニューラルネットワークブロック
設定調整:信頼度閾値を0.80→0.70に緩和、データ拡張(ノイズ付加、タイムマスキング)を有効化して過学習を抑制。
Arduinoへのデプロイ
- 学習済みモデルをArduinoライブラリ形式でダウンロード
- Arduino IDEでライブラリ追加、サンプルコードをコンパイル・書き込み
Nano 33 BLE Senseは常時マイク録音し、キーワード検出時に該当する色インデックスに変換してRGB LEDを制御。「On/Off」は白/消灯、「Red/Green/Blue」は各色に対応。
提供コード(RGBLEDKeywordDetection.ino)
/* Edge Impulse Arduino examples ... ライセンスヘッダー省略 */
#define EIDSP_QUANTIZE_FILTERBANK 0
#define EI_CLASSIFIER_SLICES_PER_MODEL_WINDOW 3
#include <PDM.h>
#include <keyword_detection_inference.h>
#include <map>
#define CONFIDENCE_THRESHOLD 0.7
static const uint32_t colors[] = {0x00ff0000, 0x0000ff00, 0x000000ff}; // R, G, B
enum Actions { LED_ON = 1, LED_OFF = 0, LED_RED = 2, LED_GREEN = 3, LED_BLUE = 4, NONE = 5 };
enum Functions { CHANGE_LED_ON_OFF = 0, CHANGE_LED_COLOR = 1, CHANGE_LED_NONE = 2 };
static const uint8_t redPin = 22, greenPin = 23, bluePin = 24;
const std::map<Actions, Functions> actionToFunctionMap = {
{LED_ON, CHANGE_LED_ON_OFF}, {LED_OFF, CHANGE_LED_ON_OFF},
{LED_RED, CHANGE_LED_COLOR}, {LED_GREEN, CHANGE_LED_COLOR}, {LED_BLUE, CHANGE_LED_COLOR},
{NONE, CHANGE_LED_NONE}
};
const std::map<const char*, Actions> labelToActionMap = {
{"on", LED_ON}, {"off", LED_OFF}, {"red", LED_RED}, {"green", LED_GREEN}, {"blue", LED_BLUE},
{"unknown", NONE}, {"noise", NONE}
};
// 推論用バッファ構造体・PDMコールバック・推論ループ等の実装が続く
// 主な関数:
// - setup(): PDM初期化、推論エンジン初期化
// - loop(): 音声スライス録音 → run_classifier_continuous() → 閾値超えラベルがあれば performAction()
// - performAction(): ラベル→アクション→LED色変更
// - setPixelColor(): RGB LED出力(アノードコモン想定で反転出力)
// - PDM割り込みでサンプルバッファ充填、ダブルバッファリングで連続推論実現
ポイントと注意
- マイク感度は
PDM.setGain(80)で設定(デフォルト20) - スライス数(
EI_CLASSIFIER_SLICES_PER_MODEL_WINDOW)はメモリとレイテンシのトレードオフ。3スライス=約333msごとに推論 - 信頼度閾値
CONFIDENCE_THRESHOLDで誤検知を抑制 - モデルはマイク入力専用(
EI_CLASSIFIER_SENSOR_MICROPHONE)
応用アイデア
この仕組みを外部LEDストリップやリレー制御に拡張すれば、音声で家電操作するスマートホームデバイスのプロトタイプが短時間で作れます。Edge Impulseで単語を追加学習するだけで語彙拡張可能。
製造プロセス
- スマートファクトリーにおけるエッジコンピューティング成功のための4つの実証済みステップ
- ガス検知装置を万全の状態に保つべき3つの必須理由
- Arm、Cortex-M55とEthos-U55を発表——低消費電力エンドポイントでTinyMLを強化する新IPコア
- 超高感度化学兵器検知システム「CIDAS」─ 低濃度でも確実検知、酵素ポリマー技術で環境干渉に強い
- 産業用IoTセキュリティ:2020年の主要トレンドとベストプラクティス
- IoTにおけるエッジ・クラウド・コンピューティング:簡潔な進化の概観
- エッジ・コンピューティングがIoT成功に不可欠な理由
- Kontron KBox A-150-WKL:産業オートメーション向け高性能・低消費電力IoTエッジPC
- エッジコンピューティング:ネットワーク境界でのAI展開を加速
- Microsoft、5G対応IoTとAIワークロードを強化するAzure Edge Zonesを発表
- オープンソースがエッジでのイノベーションを駆動する理由──必携eBook