今度はNXT用のライトセンサのソフトウェアの技術について紹介します。
最初にRobolabを用意します。
Robolabの「検出」機能を使うとライトセンサの「ログ」を取ることができます。
そして、Robolabでロギングするためのプログラムを作ります。
このプログラムを実行すると、画面に輝度のカウントが表示されます。
ライトセンサをポート1に接続してください。
プログラムを実行して、センサを読みとってみます。
辺りを暗くしてセンサを測定してみました。赤色LEDは点灯させています。
センサを5mmほど浮かせた状態で、白い紙(普通誌)を読んでみました。
NXTインテリジェントブロックの電源を切らずパソコンにつなぎ、「検出」画面で「データログ」のボタンを押します。ログがパソコンに読み取られます。
見たところカウント値は安定しています。
特に変わりがありませんでした。
蛍光灯の照明を付けて周りを明るくしたり、真っ暗にしても変化ありませんでした。
直射日光だとどうなるかは確認してません(興味の有る人はやってみてください)。
さらに、いじわるをしてモータBを回しながらライトセンサのログを集めてみました。
電流の消費に応じてライトセンサの値が変わってしまうのではないかと思っていたのですが、、、。
モータの動作にライトセンサは影響されないようです。
ライトセンサと床面の距離は完全に固定しています。
距離によってライトセンサの値が変わるかどうかチェックをしてみました。
ライトセンサを床面に向けて、読み取ります。
床面には白い紙(普通紙)を使いました。
ライトセンサと床との距離を少しずつ変えて測定します。
結果、センサの値は大きく変わりました。
ライトセンサを近づけると意外なことに、一気に40ほどカウント値が下がりました。LEDの光がさえぎられるようです。
逆に遠ざけても、1ポッチ(7mm)あたりに10カウントくらい減っていきました。
距離が5mmくらいの時が最もLEDの反射が大きくなる(反応がいい)ようです。ただし、1~2mm近付くだけで値が変動してしまうので、実際に使うにはシビアすぎるかもしれません。
ちなみに5mmの状態で、紙の「白」は約60カウント、「黒」は30カウントでした。
輝度の差はたったの30カウントしかありません。
もし、センサと床面の距離が間違って近付き過ぎた場合、それだけで白い床面を「黒」と誤認識する可能性があります。
ライントレースロボットを作ってみました。
うまくいかない場合、ロボットはコースアウトします。
なぜうまくいかないのか?
その原因はロギング機能で検証できます。
読み取ったログの画面です。
輝度が20~60カウントくらいの範囲で変動していることがわかります。
細かいタイミングまでは分かりませんが、どうやら白を検出できずにコースアウトしたようです。
いろいろ思考錯誤して作ってみたライントレースのプログラムです。
白い床面で実行させると、その輝度を元にして「白」「黒」を判定します。
白の検出と黒の検出には別々に「しきい値」をもうけています。
センサのロギングをするようプログラムをしています。実行後にデータログを見ることができます。
センサの平均値を求めて採用する方法を考えてみたのですが、レスポンスが悪くなってしまって、うまくいきませんでした。