赤外線LEDとフォトトランジスタで障害物検知

わざわざ改造しなくても、プログラミング可能な プログラミング・フォロ が存在するのですが・・・ (;^ω^)
書店で見つけて衝動買いしてしまったので仕方ない。
▼こんな状態で、本屋で売られてました。


まずは、フォロの目になっているセンサーを模倣してみます。
見た感じ、赤外線LEDとフォトトランジスタのように思えますので
赤外線LEDとフォトトランジスタを使った障害物検知を試してみます。
使用したのは
赤外線LED 5mmタイプ 940nm OSI5LA5113A グレー
フォトトランジスタ 5mm丸型 940nm L-51ROPT1D1
どとらも1個20円位のパーツです。
赤外線LEDとフォトトランジスタを並べて使ってみる

フォトトランジスタはベース側が省略されたエミッタ接地の回路だと思えば良いです。
赤外線を受けると、コレクタエミッタ間に電流が流れます。
LEDで照らした赤外線が物体に当たって反射
反射してきた赤外線をフォトトランジスタで受光。
物体が近ければ反射する赤外線も強くなるので流れる電流が大きくなり
コレクタ側に付けている抵抗に掛かる電圧が大きくなる
・・・と言う簡単な原理です。
抵抗が小さいと反応が良くなる代わりに変化範囲が小さく、検知が難しくなります。
抵抗を大きくすると変化範囲は大きくなる代わりに流れる電流が小さくなるので
より強い赤外線を必要とします・・・端的に行って近眼になります。

分かり易いようにシリアルプロッタで変化をみます。
抵抗値を変えて実験してみましたが・・・
単純に赤外線LEDとフォトトランジスタを並べただけだと
なかり近眼になってしまうようです。
ライントレーサーなど超近距離での判別用とならコレで行けそうですが
フォロの目としては、コレではダメっぽいです。
トランジスタで増幅してみた

フォトトランジスタの出力を増幅してみます。
増幅用のトランジスタには電子工作では定番の2SC1815を使用しました。
コレはhFE=250 ですが、適当に増幅出来れば何でも良いです。
もうちょっと大きい(コレクタ電流の大きい)トランジスタの方が良いかも。
これも抵抗値は値を変えて実験してみて良さげな感じの所で決めています。

変化の幅も大きくなっています。

近づくとLEDが付きます。
うまいアイディアがあれば色々できそうです。
スケッチ
今回のスケッチは掲載する程のモノではないですね。int sensorPin = A0;
void setup() {
Serial.begin(9600) ;
}
void loop() {
sensorValue = analogRead(sensorPin);
Serial.print("0,1024,") ; // グラフの下限と上限を固定するためのダミー出力
Serial.println(sensorValue) ;
delay(100) ;
}