クラシックマウスを作ろう!(8)〜壁センサ用回路〜
初めましての方は初めまして。
そうでない方はお疲れ様です。
前回までは連続してマイコンの機能の話でしたが、今回は具体的な回路について述べていきたいと思います。まずは1番お世話になってる壁センサ用回路から。
…ステッパー完走者向けに書き始めてたのに指針ずれてない???ま、いっか
目次はこちら。
壁センサの概要
まずはマイクロマウスで一般的な赤外線/可視光LEDとフォトトランジスタ(以下、フォトトラ)を用いた壁センサについて述べます。
フォトトラは聴き馴染みがない素子かもしれませんが、使うのは簡単です。トランジスタのベース部分が電流ではなく、光になったものと考えればオッケーです。
反射して帰ってきた光が多ければ電流が沢山流れ、少なければ電流が少なくなります。
それに伴って電圧も変化するので、この電圧をAD変換すればマイコンで反射光の量(=壁までの距離)を取得できます。
この場合、トランジスタはスイッチング素子というよりも電流増幅素子と捉えれば理解が進むかなと思いますが詳細は後述します。
したがって壁センサとしては次の手順で機能していると言えます。
- LEDで任意の方向に光を当てる
- 障害物(壁と柱)に光が当たり反射する
- 反射光をフォトトラで電流(電圧)に変換する
- マイコンで電圧をAD変換で読み込む
前のシリーズでも述べたように、最近はToFセンサを利用する機体が増えています。
ToFセンサはレーザーを用いて入射と反射の位相差から距離を算出するセンサです。
これを回転させたりして周囲の2次元、又は3次元点群を作成するセンサはLidarやLRFと呼称されます。
位置精度はかなり高い反面、センサのサンプリングレート(取得する周波数)が低いことから高速走行時の姿勢制御に用いるのが難しく、様々な方が試行錯誤をしている最中といった感じです。
そんなわけで、工夫をされながらフォトトラ回路が広く利用されているわけです。
発光回路
LEDの発光部はクラシックで動かす回路図なら非常に簡単です。しかし、その運用については多少のバックボーンが必要ですし、どうせなら少し深く考えてみましょう。
LEDの光量は何で決まりますか?
まぁ素子や、周囲の明るさ、電圧、人間の目の個体差など様々な要素がありますが、同じ素子ならば「電流が大切」ですね
画像のソースはコチラ
http://rohmfs.rohm.com/jp/products/databook/applinote/opto/led/led_manual-j.pdf
LEDの光量と電流特性は厳密には線形ではないと述べることができます。これは壁制御に壁センサを使う場合の1つの悩みの種ですね…。まぁ、それでも線形に近い関係なので電流量が多いほど、光は強くなります。当然といえば当然ですね。
ですが1番の問題はマイコンの1ピンが供給できる電流はそこまで多くないことです。
しかもそれが壁センサの数、もしくはそれ以上となるとかなりの電流量を使います。
ではどうするか?
工夫としては次の2つが挙げられます。
両方やっている方も多いと思います。
- スイッチング回路
- パルス発光
スイッチング回路はFET等でよく用いられる典型的な回路ですね。Gateに電圧が印加されるとDrain Source間が導通するやつです。マイコンでは扱えない電圧を素子に供給して大きな電流を扱えるようになります。
Gateの電圧レベルを安定化させるためにプルダウン抵抗をつけたり、制限抵抗を付ける等のバリエーションもありますが原理はそんなものです。
パルス発光は瞬間の電流消費量を抑える工夫です。LEDの発光が必要なのはセンサ値を取得する僅かな時間だけですので、それ以外の時間は光らせずに電流消費量を削減しようって工夫です。他にも余計な方向の発光と反射光によって、ノイズとなることを避ける旨みもあります。
以上を踏まえてこんな回路図です。FETは電圧範囲さえちゃんとしてれば雑な素子選定でも動きはするはずです。(受光部も一体化しているのは責めないで)
さて、ここまでの説明での違和感に気がついていますか?
スイッチング回路はマイコンの電流消費を抑えるため、パルス発光も電流消費を防ぐため。
これならスイッチング回路だけでマイコンの消費電流は充分に低くなるはずです。FETを駆動させる電流は非常に小さいので、これをさらに小さくしても旨みは少なそうです。それなのになぜ2つともやるのか?
この旨味は世代(というより時代?)に左右される部分が大きいと思います。かつては素子の駆動そのものに大電流が必要だったりしたので、工夫無しにはロクに機能すらしない回路だったこともあるようです。
2020年10月時点、私個人の考えですが、機体全体の電流消費を抑える事が1番のメリットかと思っています。
板のクラシックマウスでも機体重量の1〜3割はバッテリーです。マイクロマウスならもっと割合は大きくなるでしょう。したがって、電流消費の低減は機体重量の低減、すなわち加速性能の向上に繋がるはずです。
もちろん、理論計算をすればその効果が微小なものかクリティカルなものかは明らかになりますがまだやっていません…推測です。
定電流回路とコンデンサ
本項ではマイクロマウスで多く見られる発光回路の工夫を覗き見してみます。
クラシックマウスで使うような現代の素子では過剰な対策と言われたりもしていますが、マイクロマウスでは常識のように使われており、知っておくのはいいと思います。
あんまり下手な事を書くと地雷踏み抜きそうですが、怖がってたら何も始まらないので概略について述べていきます。
定電流回路の詳細についてはリンクを参考に。
これは少しアドバンスドな話の気もしますが、再現性を得るための工夫と捉えています。
LEDは電流で発光量が決まると述べましたが、この電流量は必ずしも同じとは限りません。
「いや、制限抵抗つけてオームの法則で光らせれば電流量同じやんwww」
はい、その通りですがそれはLEDが理想的なものと考えられる時のみです。
発光に伴って発熱すると、LED自体の順電圧が減少し、電流量が増加、それによりまた発熱する無限ループで電流量が増えていったりもします。
また、部品毎の個体差やパターンの微妙な違いによるバラツキも吸収したい。
ってなわけで定電流回路が用いられたりするわけです。
それ以外の工夫としては瞬間的な電流量を増加させるためにコンデンサを用いた、いわゆるチャージポンプ回路が有名です。
マウスでは森永式発光回路として知られています。
原典:
http://www8.big.or.jp/~morinaga/basicmouse/frame_basicmouse.htm
分かりやすそうな解説(?):
これはFETがオフのときはコンデンサに電荷を蓄え、オンの時は溜まった電荷によって電流量を一時的に増加させる回路です。
コンデンサの容量や充電時間にもよりますが、通常の電流より遥かに大きな電流を流せます。
自分が初めて作ったステッパー、WMMC標準マウスの壁センサでは5倍近いピーク電流値を得ていました。
ちなみに充電時間と放電時間をソフトウェア的に制御する試みも確認できています。
この方のマウスは非常に刺激的で、自分も大変勉強させてもらっています。
受光回路
さてさて発光部だけひたすら話していましたがフォトトラの受光回路も同等かそれ以上に重要なので述べていきます。
原理としては、トランジスタやFETのゲート電流やDS間電圧に当たるものが「光」になり、反射光を使っているだけでしたね。ある意味で光センサなわけです。
またフォトトランジスタには受光する波長と電圧の間に強い関連性があり、使用するLEDとフォトトランジスタの波長が大きく異なると使い物にならない可能性が高いです。
誰もが1度はお世話になるコーデンシ製st-1kl3aの特性だと受光感度が1番良い(=センサ値が1番高く出る) 波長は赤外線辺りなんですね。
ボクは可視光領域で使ってたりしてますが、それでも充分に走れるので「ピークに合わせないと絶対ダメ!!」というわけでもないです。
しかし、突き詰めるなら知っておかないとですね。
話は変わって、センサにはノイズが必ずあります。
それは当たり前の大原則でありますが、以外と忘れがちです。精度の高いセンサーは「ノイズの影響を無視できるほど小さくしている」だけです。
したがってノイズ成分を考えることが非常に重要です。
では、受光回路のノイズとは何でしょうか?
…概ね2系統だと思っています。
- 照明やシャッター等による外乱光
- 発光回路による不必要な反射光
まず外乱光ですが、当たり前と言えば当たり前ですね。光の強さを測っているなら避けられないです。照明設備によって波長が異なるため、中々苦しむ問題かと思います。
この対策として、パルス発光とハイパスフィルタの組み合わせが挙げられます。
パルス発光で1kHz周期の発光であれば、一般的な照明の周波数である50〜60Hzをカットオフ(遮断)するように閾値を決めてハイパスフィルタを組んであげると、ハードウェアフィルタで照明による外乱の影響を消せます。
ハイパスフィルタについては後述で詳しく。
次に無駄な反射光です。
例えば左と左前方のLEDを同時に付けると、左壁からの反射光が左前方のLEDに入ってきますね?これによって
「前に壁が無いにも関わらず、壁があるようなセンサ値となる」
みたいな現象が起こりやすくなるわけです。
それと、壁以外にも基板自体に当たって反射した光が下から入ってきたりもするわけです。
この対策としては次の2つが有名です。
- センサ値の取得タイミングをズラす
- 受光部の周囲を黒いもので覆う
取得タイミングは下のように2つを順番に発光させて取得すれば反射光の影響が少なくなりますね。
受光部は砲弾型のものが多いので横から光が入りやすいです。円周を覆うようにセンサホルダーであったり、黒いビニールテープなりを巻くと良いでしょう。
製品によっては既に横のシールドがなされていたりして大変便利です。
フィルタ回路とソフトウェアフィルタ
前提として、センサ取得の回路では何かしらのフィルタ回路なりフィルタ処理が必ず必要かと思います。ノイズは常に潜んでいますから。
モジュールであれば回路として含んでいたり、ソフトウェア的なフィルタが既に搭載されていたりします。
回路については前述のRC回路によるハイパスフィルタに加えて、配置を少しだけ変えたローパスフィルタ、これらを組み合わせたバンドパスフィルタがよく使われます。
Resister(抵抗)とCapacitor(コンデンサ)で作られるのでRC回路ですが、コイルを用いたRL回路でも等価のものが作れます。
カットオフ周波数も素子の値で定まるので楽々です。
理論としては1次遅れ系の代表としてよく扱われる題材で、ネットや本に沢山記述があると思います。
個人的に実用によっている以下のサイトは分かりやすいと思っています。
余談ですが、2次遅れ系や1次遅れ系はロボットのどの分野でも顔を出してきます。ばねマスダンパ、RLC回路、PID制御は全て2次遅れ系です。逆に言えば1つでも理解できれば他に流用できるので、どこかで式を触る経験は大事かと思います。
次にソフトウェアフィルタですが、様々なものがあります。ただ、そんなに難しくない処理にしないと計算量が多くてマイコン君が参るので比較的簡単なものだけ述べます。
主に2つですね。
- 無発光との差分取得
- 移動平均フィルタ(ガウシアンフィルタ)
差分はLED発光時と無発光時のセンサデータで差分を取ったものをセンサ値とする考え方です。
照明などの外部環境ノイズは無発光時でもセンサデータに含まれているはずです。
では、発光時のセンサデータから差分を取ればノイズ成分は消えるはずですね。
無発光のセンサデータはスタート時に自動で取得したり、割込で逐次取得したり人それぞれですが基本的な考えは同じかと思います。
移動平均フィルタは少し前の割込で取得したセンサデータと現在取得したセンサデータで平均を取って、その平均値を現在のセンサデータと考える手法です。
例えば1ms毎に取得しているなら、
2つ前、1つ前、今で3つのセンサデータがあるので3つの平均を取る感じです。
「え?そんな事して大丈夫なの???」って考えた方は察しがいいと思います。
これは割込周期がそれなりに高いから通じる方法です。移動平均フィルタは現状の変化に対して鈍感になる、ローパスフィルタ的な特性を併せ持つことで知られています。
この鈍感さは平均を取る個数で調整可能です。
また、現在の時間に重きを置きたいなら、各時間毎に重みを掛けて平均化する事でも調整可能です。一般的には「ガウシアンフィルタ」と呼ばれる手法みたいです。
例としては、
2つ前×0.6, 1つ前×0.9, 今×1.5を足して3で割れば平均値(みたいな何か)が計算できますね。パラメータが多くなるので調整の手間を考えると導入するかどうかは微妙なところですが…
以上、壁センサでした。
これらを全て実装するかはさておき、自分が導入を考えたものは全て書いたので思案してみるのもいいでしょう。
いつにも増して長かったですが、ここまでお付き合いいただいた方々には感謝を。
それでは、また。