フォトリフレクタの感度をソフトで調整
こんにちは。けりです。
今回は、マイクロマウスに使っているフォトリフレクタのお話です。
フォトリフレクタの感度は悩みの種
僕自身、フォトリフレクタの感度にはかなり悩まされました。
探索で前壁を判定するにはある程度の輝度が必要
マウスを小型化すると、壁からの距離が遠くなります。特に探索走行中の前壁は結構遠く、赤外線LEDを強めに光らせないと届きません。
LEDを強く光らせると問題が発生
光を強くすると、近くで飽和してしまったり、光が散乱して異なる方向からやってきたりします。
また、LEDに大電流を流すと、電源に負担がかかり、様々な部分に影響を及ぼします。
ハーフサイズのマウスではバッテリーの持ち時間にも大きな影響を与えるでしょう。
LEDの明るさを変えるのは大変
一般的な発光回路では、抵抗や定電流回路を使うので、明るさは固定になります。しかも、ハードウェアなので、パラメータチューニングは大変です。
今回考えること
ソフトウェアで赤外線LEDの明るさを調整する方法
ハードウェアは固定でも、ソフトウェアでLEDの明るさを調整できれば、これらの問題を解決することができます。
ソリューション
森永式発光回路を使う
まずはこちらの回路図をご覧ください。
こちらは森永式と呼ばれる発光回路で、電源Vから直接LEDを光らせるのではく、少し大きめのコンデンサに充電して、その電気でLEDを発光させるというものです。
FETがオフのとき、LEDは消灯しコンデンサが充電されます。
FETがオンになると、コンデンサからLEDに一気に電流が流れ、一瞬だけLEDが明るく光ります。
ソフトウェアでの調光
森永式発光方法では、充電時間によりLEDの明るさが決まります。充電時間はソフトウェアで設定できるので、調光可能というわけです。
サンプルコード
こんな感じで充電時間を引数に取る関数で計測すればできます。
delayの部分は適宜タイマー割り込みなどを使用するとよいでしょう。
/** フォトリフレクタのサンプリング関数.
@param charge_time_us コンデンサへの充電時間[us]
@return 測定データ
*/
uint16_t sampling(const int ch, const int charge_time_us = 1000) {
digitalWrite(tx_pins[ch], LOW); //< コンデンサへの充電開始
delayMicroseconds(charge_time_us); //< 波形がピークになるまで待つ
digitalWrite(tx_pins[ch], HIGH); //< 充電終了 & 放電開始
delayMicroseconds(10); //< 波形がピークになるまで待つ
return analogRead(rx_pins[ch]); //< ADC結果を返す
}
まとめ
この発光方法を考えた森永さんはすごいですね。
僕は2つのレンジを用意して、壁検出用と壁制御用に使い分けています。