2024年11月19日
005-2.カラーセンサ入門-第3回「物体に近づいた時だけ色を検出する」
教育用レゴ マインドストームNXT用センサの一つ、「カラーセンサ」を使ったロボットの作り方を紹介します。(文/松原拓也)

繰り返しになりますが、こちらがレゴ社純正の「カラーセンサ」です。
3つの丸い窓が付いていますが、そのうち2つはフルカラーLEDと光センサです。LEDから出た3色(赤・緑・青)の光が対象物に当たって、戻ってきた量によって色を判別しています。
なお、カラーセンサは色を検出できる色センサモードの他に、明るさを検出できる光センサモードがあります。

カラーセンサの欠点として、たまに色を読み間違えてしまうということがあります。
たとえば、写真のような状態では、カラーセンサから物体が3cm離れただけで、正しく色を検出できていません。「赤」のはずが「黒」と認識されています。 物体が一定の距離より近づかないと、カラーセンサは正しく動作しないわけです。

では、どうやってカラーセンサを正しく検出できるのか? 信頼性を高める方法を考えてみましょう。
ここでは一つのアイデアとして、「光センサモードで距離を測って、近づいたときだけ色センサモードとして使う」 という制御を行ってみたいと思います。
・センサと物体との距離が遠い→なにもしない。
・センサと物体との距離が近い→色を検出する。
、、、という制御です。はたして、うまくできるでしょうか。

そのためには、まず「光センサで距離を測る」ということができるか検証してみましょう。 距離に対する光センサモードの測定値の関係を調べてみようと思います。

写真ようにカラーセンサとブロックを配置します。 距離が分かるようにノギスも置きます。

光センサモードの照明は赤色にしますので、ブロックの色も赤に合わせました。こうすると反射量が大きくすることができます。 物体がセンサ側に近づくほどに反射量は増えるはずです。

センサの値を表示するプログラムを作ってみました(Program-1.rbt)。

プログラムを実行してみました。
光センサモードとして測定値が画面に表示されます。ただ、測定値が「7」だったり「6」だったり小刻みに変わりすぎて、 読み取りにくいです。

そこで、対策として、100回センサを読み取って、値の平均値を表示するようにしました(Program-2.rbt)。
100回分の平均値を求めるには、次の手順で処理を行います。
・「合計値」という変数を作って0を入れます。
・センサの測定値を変数「合計値」に加算します。この処理を100回繰り返します。
・変数「合計値」の中身を100で割ります。出た答えが平均値です。

プログラムを実行してみました。
測定した平均値が表示されました。100で割っていますので、値は少数になっています。ここでは、少数を切り捨てて、 整数だけ読み取ることにします。

ブロックを10cm離れたところ置いてから、1cmずつ近づけていって測定していきます。

距離が「0cm」の時は、LEDの光をふさいでしまいますので、測定値が減ってしまうようです。

一連の測定結果をグラフにまとめてみました。表計算ソフトにセンサの値を入れて、グラフに描いています。
ここでは、市販の表計算ソフトを使わずに、「Googleドライブ」の機能の一つ「スプッドシート」を使ってみました。 こうすれば、Webブラウザだけで表計算ソフトと同じことができてしまいます(無料で)。
グラフの結果によると、10cm手前の場合と、1cm手前の場合では測定値が10倍くらい違っていました。 この差を比較すれば対象となる物体が「近い」か「遠い」かどうかを判別できるのではないでしょうか。

距離を判別するプログラムを作ってみました(Program-3.rbt)。

まずは、ブロックを置かない状態で、プログラムを実行します。 ここで最初に光センサの初期値を学習します。
そして、ブロックを置いて、だんだんと近づけていきます。

写真の距離まで近づくと、インテリジェントブロックから音が鳴りました。
「測定値が5倍に増えたら音が鳴る」という設定をしていたのですが、 その結果、2cm手前で音が鳴りました。 先ほどのグラフと照らし合わせても理論どおりの結果となりました。
2cm手前だったら、色センサモードとしても正常に動作できる距離です。

先ほどのプログラムを改造して、「音が鳴る」処理を「色センサモードで測定する」処理に変更しました。

プログラムを実行してみます。
光センサモードでブロックとの距離を測ります。

ブロックが一定の距離(およそ2cm)以内に入ると、色センサモードに切り替わります。色の検出が終わると、また光センサモードに戻ります。

画面の結果です。色の番号に対応して、色の名前が英語で表示されました。
以上の方法を使えば、ブロックが近づいたときだけ色センサモードになりますので、これによって、正確に色を検出することができます。
ただし、この方法の場合、毎回センサのモードを切り替える必要がありますので、 余分な時間がかかってしまいます。これを解決するためには、もう一つ別のセンサで距離を測ったほうがいいかもしれません。
[DOWNLOAD]今回作成したプログラム(教育用レゴマインドストームNXT2.0以上推奨)
当ブログの内容は、弊社製品の活用に関する参考情報として提供しております。
記載されている情報は、正確性や動作を保証するものではありません。皆さまの創意工夫やアイデアの一助となれば幸いです。