2024年11月21日
008-1.EV3ソフトウェア入門-第10回「HiTechnic製カラーセンサについて」
新シリーズのレゴマインドストームである「教育用レゴマインドストームEV3」を使ったプログラミング環境「EV3ソフトウェア」について紹介していきたいと思います。(文/松原拓也)
◆ HiTechnic製カラーセンサの特徴

今回はHiTechnic(ハイテクニック)社が販売しているカラーセンサ「NXT Color Sensor V2」の使い方を紹介したいと思います。名前に「NXT」が入っていますが、NXTだけではなくEV3でも使うことができます。
HiTechnic社のカラーセンサとEV3基本セットに付属しているレゴ社純正のカラーセンサとを比較してみました。レゴ社が左側、HiTechnic社が右側です。
両者のカラーセンサは使用している部品が違います。 レゴ社では「フルカラーLED」と「(おそらく)フォトダイオード」を使っているのに対して、HiTechnic社では「カラーセンサ」と「白色LED」を使っています。

検出できる色の数も違います。
レゴ社のカラーセンサは「色がない」という状態を含めると8種類の色を検出できます。 一方、HiTechnic社のカラーセンサは18種類の色を検出できます。
判別できる色の種類は写真のとおりです。レゴ社製のように「色がない」という判別はありません。11~16番のように白っぽい色についても検出できるようです。

測定の方法も違います。実はこの違いが一番重要です。
レゴ社のカラーセンサーはLEDをR・G・B(赤緑青)に別々に光らせて、反射した量の差から色を読み取っています。3回測定して、1つの色を算出しています。
一方、HiTechnic社のカラーセンサは白色LEDを光らせて、反射した光をセンサー内でRGBに分解して色を検出しています。1回の測定で色を検出することができます。
測定方法の違いは性能にも表れます。
たとえば、測定の対象物が遠くにあったとして、 レゴ社のカラーセンサーの場合、フルカラーLEDの反射量が減ってしまって、色が正しく読めない可能性が高くなってしまいます。
一方、 HiTechnic社のカラーセンサの場合もLEDの反射量が減ってしまうのですが、周りからの光も反射して、補助光として働きます。 レゴ社のカラーセンサーはR・G・Bの差で色を読み取っていますので、外部からの光は除去されてしまいますが、HiTechnic社のカラーセンサーは外部からの光は除去されず上乗せされます。
「HiTechnic社のほうが遠くまで測れる」と言われるのはこのためです。ただし、光に色が付いているとそのまま測定の誤差になるので要注意です。

HiTechnic社のカラーセンサはそのままではEV3ソフトウェアでは使えません。使えるようにするには、カラーセンサ用のファイル(EV3 Color Sensor Block)が必要です。ファイルはHiTechnic社の専用ページをブラウザでダウンロードします。ファイルはzipで圧縮されていますので、ダウンロードが終わったら展開しておきます。 展開後にEV3ソフトウェアを起動して、「ブロック インポート ウイザード」を選択して、ファイルをインポートすれば完了です。インポートしたファイルの現時点での最新版は、(2014年2月公開)バージョン0.3でした。
◆ 色を判別するプログラム

それでは、カラーセンサーを使ってプログラムを作ってみましょう。測定モードは4つあります。
一番使い勝手が良さそうな「測定 - Color」モードを使ったプログラムがこちらです(htcolor_color.ev3)。
このプログラムでは、1~9の範囲までは色の名前が表示されるように作っています。スイッチブロックに思いつく限りの色の名前を入力してみました。

実行すると、0~17の範囲で色の番号が表示されます。
たとえば、赤色にセンサーを向けると、「8 AKA」と表示されました。正常に動作しました。

続いて、「測定 - RGB」モードを使ったプログラムがこちらです(htcolor_rgb.ev3)。

実行すると、R・G・Bの3色の値が表示されます。
よりきめ細かく色を検出したい場合にはこのモードを使います。
◆ 液晶画面の色を読み取れる

HiTechnic社のカラーセンサにはあって、レゴ社のカラーセンサにはない機能が「測定 - Passive(パッシブ)」モードです。 このPassiveモードを使ったプログラムがこちらです(htcolor_passive.ev3)。

Passiveモードでは白色LEDを消灯した状態で、RGBを読み取ることができます。周りにある光だけで対象物を照らすことになりますので、 そのままの色を測定できるのですが、誤差が大きくなりやすいです。

Passiveモードを使うと、反射しないものの色を検出することができます。
ここでは「携帯ゲーム機の液晶画面」を測定してみました。 まず、うまくいかない例として、レゴ社のカラーセンサーを画面に当てて、Portviewで測定をしてみました。結果は「1(黒色)」。どんな色を画面に出しても「1」になってしまいます。なぜかというと、液晶画面はバックライトが光っているので光を反射をしないからです。

続いてHiTechnic社のカラーセンサです。Passiveモード用のプログラムを使うと、きちんと赤色を検出できました。
Passiveモードはレゴ社のカラーセンサにはありませんので、 こういう場合にはHiTechnic社のカラーセンサを使いましょう。
◆ 差分で色を検出する

HiTechnic社のカラーセンサは検出できる色の種類が多いのですが、 誤認識も多いです。 たとえば、赤色のブロックをカラーセンサに向けてみた場合、7番(オレンジ)、8番(赤)、9番(マゼンタ?)、10番(マゼンタっぽい紫?)と約4パターンの値を検出しました。対象物とカラーセンサとの距離や角度によって、値はコロコロと変わってしまいます。
赤色と確実に検出したい場合には、検出する有効範囲を広げておかないといけないようです。たとえば、「値が7以上で10以下だったら赤」と比較すればいいはずです。

他に有効範囲を広げる方法として、考えてみたプログラムがこちらです(htcolor_rgbdiff.ev3)。
このプログラムではRGBモードを使って、赤色か青色かそうでないかを判定します。 赤色が青色の成分を比較して、赤色が50より大きい場合は「赤色」と認識します。青色が50より大きい場合は「青色」と認識します。緑色は見ていません。

実行中の様子です。
先ほどとは打って変わって、感度が良くなりました。 当然ですが、読み間違いも起こりません。
ただし、感度が良すぎるので、 簡単に赤色と判定されてしまいます。 感度を落とすには比較ブロックのしきい値を変更しましょう。
[DOWNLOAD]今回作成したプログラム(教育用EV3ソフトウェア用)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。