EV3 カラーセンサー向けの拡張ブロックを公開しました。標準のカラーセンサーブロックでは取得できない RGBデータ や 生の反射光の強さ を取得できます。以下のリンクから入手できます。
技術的な解説
拡張ブロックを作成する過程で得られた知見を簡単にまとめておきます。
カラーセンサーのモードについて
LEGO公式では、EV3カラーセンサーのモードとして以下の3つが紹介されています。
- 色モード(COL-COLOR)
- 反射光モード(COL-REFLECT)
- 周辺光モード(COL-AMBIENT)
しかし実際には、これらに加えて以下の3つのモードが存在しています。
- キャリブレーションモード?(COL-CAL)
- RGBモード(RGB-RAW)
- 生の反射光モード(REF-RAW)
今回の拡張ブロックでは、このうち RGBモード と 生の反射光モード に対応しています。各モードの詳細な仕様については、センサーが出力するデータを解析することで知ることができます。
カラーセンサーが送信するデータ
EV3の標準センサーは、電源投入直後から UART(2400 bps)通信で自身の情報(センサーIDやモード構成など)を自動的に送信し始めます。この通信をマイコン等で受信・解析することで、センサーの内部仕様を詳細に把握することが可能です。
詳しい解析方法やプロトコルの内容については、別の記事で紹介する予定です。
ここでは、実際に解析して得られた結果を簡単にまとめておきます。
解析結果
- センサーID:29
- モード数:6
- ポートビューで表示されるモード数(View数):3
- 同期後の通信速度:57600 bps
モード番号 | モード名 | 生の値の範囲 | SI単位系での値の範囲 | SI単位 | データの数 | データの型 | 表示桁数 | 小数桁 |
---|---|---|---|---|---|---|---|---|
0 | COL-REFLECT | 0 ~ 100 | 0 ~ 100 | pct | 1 | 8bit 整数 | 3桁 | 0桁 |
1 | COL-AMBIENT | 0 ~ 100 | 0 ~ 100 | pct | 1 | 8bit 整数 | 3桁 | 0桁 |
2 | COL-COLOR | 0 ~ 8 | 0 ~ 8 | col | 1 | 8bit 整数 | 2桁 | 0桁 |
3 | REF-RAW | 0 ~ 1023 | 0 ~ 1024 | なし | 2 | 16bit 整数 | 4桁 | 0桁 |
4 | RGB-RAW | 0 ~ 1023 | 0 ~ 1024 | なし | 3 | 16bit 整数 | 4桁 | 0桁 |
5 | COL-CAL | 0 ~ 65535 | 0 ~ 65535 | なし | 4 | 16bit 整数 | 5桁 | 0桁 |
各モードの動作について
生の反射光モード(REF-RAW)
解析結果から、REF-RAWでは2つの値が送られていることがわかります。
このモードでは赤色LEDを高速にオン・オフし、それぞれの状態でフォトダイオードから取得したADC値を送信しています。LEDオフ時のADC値をambient
、LEDオン時のADC値をred
とした場合、反射光の強さreflect
は以下の式で求められます。
reflect = red - ambient
ただし、黒い物体などで red < ambient となる場合があるため、拡張ブロックでは以下のような処理を行っています。
if red >= ambient:
reflect = red - ambient
else:
reflect = ambient - red
RGBモード(RGB-RAW)
RGBモードでは、赤・緑・青の3色LEDを高速に切り替えながら、以下の値を測定していると考えられます。
- 赤色LEDオン時の値:
red
- 緑色LEDオン時の値:
green
- 青色LEDオン時の値:
blue
- 全てのLEDオフ時の値:
ambient
しかし、RGBモードではambient
は送られてこないことから、あらかじめambient
を分が差し引かれた状態で値が送信されている気がします。
キャリブレーションモード(COL-CAL)では4つの値が送られるようなので、これがambient
を含めた値なのでしょうか?この辺りはまだ詳しく調べていません。
EV3 拡張ブロックの構築
さて、各モードの動作がわかったので、これで拡張ブロックを作れそうです。
拡張ブロックは、EV3のサポートページにあるEV3 ブロックデベロッパーキットを使って作成できます。
EV3 LabはLabViewというグラフィカル・プログラミング環境がベースになっており、各ブロックの中身はLabVIEWのプログラムとして構成されています。例えば範囲ブロックは以下のような構成になっています。
このように、LabVIEW上でロジックを組むことで、センサーの生データや独自の処理を含む拡張ブロックを自由に作成できます。
ただし、ブロックのアイコン設定やブロック名の定義、パラメータの構成など、細かい仕様が多く、慣れるまではやや複雑です。デベロッパーキットには簡単なチュートリアルも含まれていますが、情報が限られているため、実際の構築には多少の試行錯誤が必要になります。
こうした構築手順や注意点については、今後別記事で詳しく解説する予定です。
生の反射光モードとRGBモードのブロック構成は以下のとおりです。どちらも処理自体は非常にシンプルです。
生の反射光モードでは、red
と ambient
の値を比較し、差が正の値になるように大きいほうから小さいほうを引いて出力しています。
一方、RGBモードでは、取得した red、green、blue の各値をそのまま出力しています。
終わりに
かなり大雑把な紹介になってしまいました。元気があれば、もう少し詳しい解説記事も書いていくつもりです。