Arduino カラーセンサープロトタイプ — ニューラルネットで色名を識別・表示
概要
RGB LED と CdS セル(フォトレジスタ)を遮光チューブ内で組み合わせ、赤・緑・青の各光を対象物に照射・反射光を測定して RGB 値を取得。事前学習済みの多層パーセプトロン(MLP)で 10 色(赤、緑、青、黄、シアン、マゼンタ、白、黒、オレンジ、紫)を分類し、LCD に色名を表示するプロトタイプです。ニューラルネットライブラリ Neurona を Arduino 上で動作させます。
原理:RGB 色空間と MLP 分類
- RGB 各成分 0-255 の 3 次元空間(1677 万色)において、学習データで各色領域を超平面で分離
- ネットワーク構成:入力 3(R/G/B 正規化 0-1)、隠れ層 6 ニューロン、出力 10(色クラス数)
- 出力は最大値を 1、他を 0 に二値化(argmax)してクラス決定
- 学習データ:75 サンプル(各色複数)、0-255 を 255 で除算し 0-1 正規化
電子回路
- Arduino UNO
- RGB LED(共通アノード)+ 抵抗:赤 150 Ω、緑/青 100 Ω ×2(アノード共通に 1 本で代用可能だが、正確性重視なら各カソードに個別抵抗)
- CdS セル(光センサー)+ 10 kΩ プルダウン → アナログピン
- 16x2 LCD(LiquidCrystal ライブラリ互換)
- タクトスイッチ(校正/測定トリガー用)+ 10 kΩ プルダウン
- 重要: RGB LED と CdS セルを古いフィルムケース等で完全遮光し、外乱光を排除
動作シーケンス
- 校正(初回のみ): 白色物体・黒色物体を順に提示し、各 RGB 光での最大/最小反射値を取得 → 0-255 / 0-1 へのスケーリング係数を決定
- 測定: 赤→緑→青の順に LED 点灯、CdS 値安定待ち(500 ms 程度)後アナログ読み取り → 正規化 → MLP 推論 → 色名表示
- スイッチ押下で校正・測定モード切替(LCD プロンプトに従う)
ソフトウェア構成
- Arduino IDE ライブラリマネージャから Neurona をインストール
- 学習済み重み・バイアスをスケッチ内配列として埋め込み(
Neurona::MLPで初期化) - GitHub リポジトリ:moretticb/ColorSensor に全コード・学習用データセット・MLP Topology Workbench 用ファイルを公開
テスト結果(抜粋)
インクジェット印刷色紙で評価。75 サンプル中、誤分類は僅少(黄↔オレンジ、シアン↔青 等、スペクトル隣接色で発生)。マット紙・均一照明下では高精度。
既知の制限・改善余地
- 共通アノード 1 本抵抗駆動のため、色再現性にばらつき → 各カソード個別抵抗化推奨
- 遮光不十分で外乱光混入 → 3D プリント遮光ケースやブラックボックス化で改善
- 光沢面・透明物体は鏡面反射で誤動作 → 拡散反射面のみ対象
- 学習データ領域外の色入力時の挙動未定義 → 信頼度閾値導入や「不明」クラス追加で対処可能
- Neurona ライブラリは float 演算使用、UNO (2 KB RAM) でギリギリ動作 → より大規模ネットなら ESP32 等推奨
応用アイデア
- 色選別機(コンベア+エアジェット)への組み込み
- 塗料調色支援ツール
- 色覚サポートデバイス(音声出力付き)
- MLP を CNN や決定木に置き換え、精度・速度向上
製造プロセス
- スマート渇きアラート植物アラーム – 最適な水やりタイミングを知らせるDIYセンサー
- イタリア語ワードクロック自作:Arduino Nano、NeoPixel、LCD、RTCで時刻を文字で表示
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- Arduino MKR Fox 1200で作る信頼性の高いSigfox kWhメーター
- Bluetooth対応温度モニター:Arduino NanoとHC-06でスマホ監視
- 非接触ジェスチャー錠: APDS-9960とArduinoでセキュアアクセス
- Arduino Nanoコンパニオンキット – 電子工作に必須の部品とツールを搭載した多機能IC型デバイス
- Arduino Micro/Leonardo用 USB-MIDIアダプタキット – 完全パーツリストと実装ガイド
- Arduino用絶縁アナログ入力回路の設計:LM331 V-F変換+フォトカプラでノイズ耐性を確保
- Arduino UNOで作る精密反応速度テスター
- 抵抗器カラーコード完全ガイド:値、公差、Eシリーズ規格のデコード