光センサーのLEDを明滅させることで外乱光(太陽光)の影響を取り除く、まいまい式。各所で取り上げていただいていますが、いまだ未解決の課題が残っています。そこで、まいまい式の改良のポイントを解説します。信じるか信じないかは、あなた次第! ^_^;
まいまい式のサンプルコードは20ミリ秒ごとに照明用の赤色LEDを明滅させてコースラインのエッジ判定を行っています。しかし滑らかなライントレースのためには20ミリ秒のラインエッジ判定周期では遅すぎます。このラインエッジ判定の処理周期の遅さがまいまい式の最大のウィークポイントになっています。
しかし、欠点を嘆いていても始まりません。幅2センチのコースラインのエッジをミリメートル単位の精度で滑らかに辿るには、それ相応の処理速度が求められます。
上のグラフは16ミリ秒ごと(32ミリ秒周期)にLEDを明滅させて、コース(白エリア)から反射した光をNXTの光センサーで測定した結果です。このグラフからLEDの明滅周期の高速化を阻む3つの要素が見て取れます。
明るさの変化(立ち上がりと立ち下り)がゆっくりである
明るさが俊敏に変化し、グラフが矩形を描くことが望まれるのですが、実際の測定結果は緩やかに明るさが変化しています。デバイスとしてのLEDは白熱灯や蛍光灯と比較して、もっと急峻に明るさが変化するはずなのですが、NXTのI/Oの電気的特性で変化が鈍ってしまっているようです。
ここで1つ目の改善ポイント!光の強さが同じであれば明るさの変化率(グラフの傾き)も同じはずです。明るさが一定になるまで待たずに明滅の山と谷を計算で予測できれば、より速い周期でラインエッジの判定ができるはずです。
明るさの変化(立ち上がりと立ち下り)のタイミングが不規則に遅れる
タスクからは16ミリごとに明滅を切り替えているのですが、測定結果をみると時々このタイミングが遅れます。まだ原因を絞り込めていないのですが、「メインマイコン(ARM)からサブマイコン(AVR)への通信が他の割込みを受けて遅れた」、「サブマイコンの処理が別の処理のために後回しになった」などの要因が考えられます。サンプルコードの明滅周期は、このタイミング遅れのためにマージンを取って長めになっています。2つ目の改善ポイントはタイミング遅れを回避して、マージン分の時間を短縮することにあります。
明るさの測定が抜ける
グラフを見ると明るさの測定値が2回続けて全く同じ値という状態が時々出現します。前後の測定値から明るさが偶然同じだったということは考えにくく、測定が抜けて前回の測定値が反映された、という理由のほうが得心がいきます。やはり原因を特定できていないのですが、測定抜けを回避することで明滅の周期を短縮することが可能です。これが3つ目の改善ポイントです。
3つの改善ポイントはお互いに関連を持っているため一気に解決するのは難しいと思いますが、プログラムの工夫で上手に切り抜けることができれば、ライン判定周期を短縮して、ライントレースの精緻化に寄与させる効果が期待できます。
いつも楽しみに拝見させていただいています。
僕も調べてみましたので、情報を記載します。
MindstormのサポートページからダウンロードできるHardware Developer Kitを見てみると、Active Sensorsの章にAVRでは3ms間隔で測定している
ような記述がありました。
サポートページではOpen Source Firmwareもダウンロードすることが
できて、ATmega48\Source\c_armcomm.cの90行は以下のように
なっています。
#define INPUTPOWER_ONTIME 3000
// [uS] time between input A/D samples
英語の読み間違いかもしれませんが、RCXとの互換性のために
3msにしているようなので、この部分を変更したファームウェアを
作成できたら性能が上げられそうです。
しかし、ファームウェアの作成方法は見つけられていません。
ON-OFFしているのは照射系(J1 pin 5)だけで、測定系(J1 pin 4)の方は、
常に電源を入れっぱなしにして待機していても、安定するまで、10mSもかかるのですよね?
はい、レベルが安定するまでに10ミリ秒程度かかります。素子の立ち上がり時間云々と言う理由ではなく、意図的にローパスフィルターを回路に組込んでいるようです。