突然ですが、EV3ソフトウェアでEV3カラーセンサーを使ってみました。
▲EV3カラーセンサーはカラーモードにすると7種類の色(色なしを加えると8種類)を検出できます。暗い中で動かしてみると分かりますが、この白く照らされている部分が色の測定範囲です。良く見るとR/G/Bが少しズレて重なっているのですが、その3色が重なった部分に対象物が置かれていないと正しく測れません。
光の当たっている範囲から考えて、対象物が20mm四方くらいの大きさでないと、正しく色を読み取れないような気がします。今回、ブロック1個だけを読むというのは、ちょっと無理があります。
▲プログラム1。まずは色を認識して、その色を音声でしゃべるだけのシンプルなプログラムを作ってみました。
▲実行してみると、何色を当てても「Black」ばかりで、うまくいきません。色の誤認識です。
EV3カラーセンサーは距離の設定がシビアです。今回のように面積が小さい対象物の場合、15mm以内に近づけないと正しく読み取れないようです。信頼性を考えると10mmくらいに近づいたほうが良さそうです。
EV3カラーセンサーはLEDの光を反射させないと測定できないので、斜めに当てないで真正面から当てたほうがいいと思います。 HiTechnic製カラーセンサーは測定方法が違うので、斜めに当てても問題ありません。
▲続いて、移動中の色の認識に挑戦してみます。これも誤認識が起きやすいです。
▲プログラム2。移動しながら、色を読み取って、色があったら止まるというプログラムです。
このプログラムは失敗しやすいです。たとえば、赤色のブロックだと、茶色にご認識してしまいます。
対策としては、複数回色を読み取って多数決で決めてもいいのですが、ロボットが移動中だと、あまり読み取り回数を増やすことができません。そこで、最初の結果を読み飛ばすようにしてみました。
▲プログラム3。改良版です。最初に色を検出したら、意図的にオーバーランして、測定をやり直します。最初の測定結果は捨てます。
ブロックの長さが約31mmなので、オーバーランさせる距離は16mmとしました。
▲ブロックの中心でセンサーが止まって、「Red」と認識されました。成功です。
動画にしてみました。
撮影ではうまくいっていますが、ブロックの形状が細長いので、進入角度を間違えると、誤認識してしまいます。センサーを左右に振って読み直すっていう方法もありますが、時間がかかってしまいます。ガイドみたいなもので、ブロックの位置を直すといいでしょうか。
あとはプログラム内で「茶色→赤色」という扱うにして、補正してしまったほうがいいでしょう。
プログラムはこちら
◆HiTechnic製カラーセンサーとEV3カラーセンサーの違い
HiTechnic製カラーセンサーとEV3カラーセンサーでは色の測定方法が全く違います。HiTechnic製カラーセンサーは白色LEDで光を当てて、反射した光をカラーセンサーで読み取っています。
一方、EV3カラーセンサーはフルカラーLEDでR/G/Bを順番に当てて、その反射量をフォトダイオード(もしくはフォトトランジスタ)で読み取っています。R/G/Bの色を三回当てる必要があるので、動いているものの測定には向いてません。HDKの回路図によるとEV3カラーセンサーには「PD-33BRC」というセンサーが使われています。
HiTechnic製カラーセンサーは周りが明るいほうがセンサーに光が届きやすくなって反応が良くなるのですが、EV3カラーセンサーはLEDの光だけ読み取りますので、周りの明るさは測定結果に影響されません。遠くの色を読み取るならHiTechnic製のほうが有利です。
EV3ソフトウェアの機能としては、HiTechnic製カラーセンサーにはRGBで色を取り出す機能があるのですが、EV3カラーセンサーにはそうした機能がありません。反射光モードではLEDの色は赤色しか選べません。
応答速度の点ではEV3カラーセンサーのほうが勝っていますが、総合的な使い勝手では、HiTechnic製カラーセンサー のほうが優れているようです。