カラーセンサーでロボットカーを制御する

光センサーには可視光・赤外線などいくつも種類があります。電子工作でよく使う光センサー(フォトトランジスタ、CDS)は可視光の強弱を取得できるものです。赤外線センサーは測距や人感センサー、テレビなどのリモコンにも使われています。
さらに、可視光のRGB別に強弱を取得して、色の識別ができるようにしたのがカラーセンサーです。
カラーセンサーは生産工程の品質管理や、液晶モニターの自動カラーバランスなどの用途に使われています。

カラーセンサーは色を識別できますので、読み取った色の違いでコンピュータに違った命令をすることができます。例えば、ロボットに赤い色を見たら止まれ、緑を見たら進めと命令できます。

浜松ホトニクスのS11059-02DT

手頃で実績のあるカラーセンサーに、浜松ホトニクスのS11059-02DTがあります。チップのフットプリントが独特の寸法のため、秋月電子通商で販売されている4ピンSIPモジュールが便利です。


このチップはI2Cでマイコンから制御でき、自動的にRGBと赤外線の明るさレベルをそれぞれ16ビットの数値として取得できます。アナログセンサの場合必要な、信号の増幅やAD変換を省けて大変便利です。

I2Cのレジスタは下図のようになります(データシートより)

データシートにあるプログラム例どおりにすれば、とりあえず動作させられます。

最初に初期設定をします。
I2Cのアドレス0x2Aを指定、続けてコントロールレジスタのアドレス0x00を指定します。
次のコマンド0x89を与えます。これはレジスタマップによると、リセット・スリープ解除・Highゲイン指定・積分時間1.4msにする設定です。
続けて再度、アドレス0x2Aのコントロールレジスタ0x00に対して、0x09のコマンドを与えます。これは直前のコマンドと同じ条件で、リセットを解除して動作をスタートさせるコマンドです。

動作が始まると、積分時間のサイクルでデータ用のレジスタにRGBと赤外のデータが入ってきますので、これを取得する処理になります。
アドレス0x2Aの0x03はRデータの上位バイトのレジスタですが、ここを指定して連続的に読み出すと、RGBと赤外のデータが、それぞれ上位バイト、下位バイトの順で自動的に読み出されます。

micro:bitで使う

このセンサーはmicro:bitのカードエッジに出ているI2Cに接続して使えますが、いくつかポイントがあります。
コマンドを送る時、1バイトごとに送信するのではなく、I2Cアドレスからコマンド全部をまとめて16ビット整数として送る必要があります。以下が実際に動作させた例です。

「最初だけ」の初期化では、2つのI2Cの送信ブロックを使っていますが、最初のブロックはI2Cアドレス42(0x2A)を設定します。
送信する数値は、レジスタアドレスとコマンドの0x00,0x8B(積分時間179.2msの設定)の2バイト分を16ビット整数にしてから10進数に変換した139を送信します。
データの形式は符号なし16ビット整数で、上位バイトから送るためビッグエンディアンしますので、UInt16BEという形式になります。
「つづく」は後続のデータがなければ「偽」あれば「真」にします。
初期化の後半も同様に、動作開始のコマンドを16ビットにまとめて送信します。

「ずっと」のループには、データのレジスタ読み出しのプログラムを入れます。
最初にI2Cアドレス42に、データレジスタを指定する0x03を送信しますが、この場合は1バイトのデータなので、形式はUInt8BEになります。

RGBのデータを取得する変数を用意しておき、I2Cアドレスを指定してレジスタを読み出して行きます。
読み出しも16ビットデータで、上位、下位バイトをまとめて取得するため、データ形式はUInt16BEを選択する必要があります。

RGBの感度には差があるので、色の識別に使う場合は補正してホワイトバランスを取る必要があります。

ロボットカー(micro maqueen)に取り付けて走らせた例がこちら。緑色で左に方向転換、赤色で停止するようにしたものです。
(画像のクリックで動画がみられます)