マイクロマウスで壁検出に用いている赤外線センサの環境光による影響をまとめたいと思います。
背景
東北地区大会(2018年)は照明から発せられる赤外線がとても多く、さらには照明ムラもひどく、私も含め多くのマウサーが完走できませんでした。毎年使っていた部屋が使えず、いつもと異なった環境だったようです。
しかし、そのような中でも上位に入る人たちは問題なく動作しているところも見られ、しっかり織り込まなければな-と反省しています。
環境光による影響については以前簡単に調べていたこともあったけれど、新型機だったこともあり作りこみが甘く織り込めていませんでした。今回改めて新型機を使って外光による影響を実験したので記そうと思います。
センサの構成と環境光の排除方法
使用しているセンサは下記です。
- 赤外線LED(940nm):OSI5FU3A11C
- フォトトランジスタ(940nm):LTR-4206
- オペアンプ:LMR344FVJ
- 微分回路:3.6kΩ、0.022uF
センサのデータシートの特性から光の強さにより電流の変化は線形的になることが読み取れます。
LEDを発光していないときのセンサ値は環境光を測定していることになるため、LEDの発光前後をそれぞれ測定し、単純に差をとることで、環境光の影響を排除したセンサ値を取得でき、安定した観測ができると考えられます。
(環境光を排除したセンサ値) = (LED発光後のセンサ値)ー(LED発光前のセンサ値)
フォトトランジスタの立ち上がり
次にセンサ値を取得するタイミングを考えます。
LEDを発光させて、壁で反射した光をフォトトランジスタが感知します。
フォトトランジスタは光を受けてから立ち上がるまでに数十us程度の時間が必要になります。(データシートに参考値がのっているため、大体の時間はわかります)
機体で検証した結果を記載します。
実験方法
外光がない(微小)の環境でAD変換するタイミングを変えて測定します。
タイミング変えはfor文を何回ループさせるかで実現します。
機体はコース上に置き、両サイドの壁は閉じた状態で前壁に近づけていきます。
測定結果
下記のグラフは前壁と機体の距離が0.5マス~2マスまでを測定した結果です。AD変換するタイミングによってフォトトランジスタの電圧が変わっていくさまが見られます。
距離に関わらず、for文で約300回ループの時間(約30us)が経過したところでフォトトランジスタの電圧がピークを迎えることがわかります。
ピークを迎えたのちに値が減少していっているのは微分回路を組んでいるからだと思われます。(微分回路無しのセンサ値を検証したことがないので推測ですが)
このグラフからわかる環境光により問題になること
ここで環境光で問題となるのは前壁が近い0.5マス前(マウスがマスの中央にいる)のときです。
forループ300のところで考えると、AD値が約4000となっており、最大値AD12bit(4096)に対してほとんど余裕がありません。ここで環境光が強くなると、簡単にセンサ値が飽和してしまい距離の測定ができなくなってしまいます。
これを解決するにはLEDの電流値を下げるか、オペアンプの増幅を調整するかなどして、光に対する電圧の関係を変えなければなりません。
しかし「素子を張り替えるなんて面倒だわ」なんて考えると、このグラフからは
・for文のループ数を減らす or 増やせばセンサ値が減少すること
・for文のループ数を減らした場合、待ち時間も少なくなること
に気づいてしまいます。
ここで0.5マス付近で制御をおこなうため、待ち時間が少なくなるほうがいいからとループ数を減らし、センサ値の立ち上がり途中の値を採用してしまうと、自宅ではうまく走っていても、大会の場ではセンサ値が大きくずれ、うまく走らない結果になる可能性があります。
また、0.5マス付近では制御しないと決めて、センサ値がピークで飽和しているように見える待ち時間が一番短いforループ数300を採用しても残念ながらうまくいきません。
環境光の強さによるセンサ値の変化
なぜうまくいかないのかを見るために、実際に環境光の強さを変えてみてセンサの出力値を観察してみます。同じ待ち時間(forループ数)でも環境光の変化によってどの程度値が変化するのかを調べます。
実験方法
機体を1マス先に前壁があり、左右仕切られた迷路内に置いた状態で、白熱電球のついたランプで照らします。ランプを近づけたり、遠ざけたりして外光の出力が変わるようにします。
その時のセンサ値を取得し、環境光の変化による変化を評価します。データ処理がしやすいように、ランプを機体にゆっくり近づけて、徐々に環境光を強くするとよいです。
環境光の強さの範囲は、東北地区大会で実測した環境光のセンサAD値(約300)を参考にして、0~350にしています。
ちなみに、使用するランプですがLED照明のものはNGです。照明方法によって光の波長分布が異なります。今回使用しているフォトトランジスタは赤外線を検出しているため、赤外線のでるランプを選びます。
測定結果
測定結果は下記になります。
・横軸:LED発光後値 – LED発光前値 (=環境光を排除したセンサ値)
・縦軸:環境光値(=LED発光前値)
・項目:forループ数
この結果からループ数が300(青)では、環境光が0~50付近で変化すると大きく値が変化してしまうことがわかります。室内の蛍光灯照明下では環境光は0~5程度ですが、少し変わるだけで30,40変わるため、環境光の揺らぎによって値が安定しません。壁の誤検知などを起こしやすくなります。
センサの立ち上がり時間の点から考えてみると、forループ300(約30us)あれば、データシートより立ち上がり時間(20us程度(RL = 1.5kΩ))を超えているため、センサ値は立ち上がりきっていて安定しているはずで、光の強さの変化によるセンサ値は線形的になると判断してしまいそうですが、立ち上がり時間分だけでは十分に時間を確保できているわけではなさそうです。
一方、ループ数が700,800,900は、待ち時間が長いほどセンサ値が環境光の変化に対して安定している結果となっています。どれもそこまで大きな違いでないことと、待ち時間を短くしたいことから、私の機体ではループ数を700(約80us)に設定しています。
これで、実験写真のようなスポットライトが当たっている環境でも問題なく壁検出をして迷路の探索ができるようになりました。
まとめ
以上、環境光によるセンサ値の影響とその排除方法について書きました。
センサ値を適切なタイミングで取得して処理することで、環境光によらない安定した走行ができるようになります。
自宅では同一照明下で、ほぼ同じ環境光で開発が進むため気づきにくいところだと思います。
大会のたびにセンサ値が全然あわない、壁の読み間違えをしやすいなどならないようにしましょう。