Raspberry Pi Picoでフォトリフレクタを使う
フォトリフレクタとは
赤外線LEDとその反射光を検出するフォトトランジスタを1つのユニットにしたものである。反射光の有無を検出することで、物体の存在やその色(白か黒かくらいだが)を検知できる。
フォトリフレクタの回路記号と一般的な外見
- 赤外線LEDはその名の通り、赤外線を出すLEDである。人間の目には見えないが、スマートフォンのカメラ越しに見ると点灯していることを確認できる場合がある。
- フォトトランジスタはベースがないBJTのような構造になっている。ベース電流の代わりに光が当たるとコレクタ電流が流れるようになる。
- 素子の足の並びが回路図と一致しているとは限らないので注意。さらにメーカーによっても異なるので、データシートで良く確認すること(例えば、PRR-220なら上の並びではない)。
今回使用したフォトリフレクタはLBR-127HLD。LEDの最大電流は60mAであるが、データシートに記載の典型値である
Raspberry Pi Picoへの接続
回路図と実装
回路図とブレッドボード上への実装
抵抗値の計算
普通のLEDやトランジスタの場合と同様に考える。
赤外線LEDに関して、
フォトトランジスタに関して、
この抵抗が大きすぎると感度が高くなりすぎ、小さすぎると感度が低くなりすぎる。デジタル入力をするのならば、ここを可変抵抗にするのも良いだろう。
PicoにはA/Dコンバーター[1]が搭載されているので、ここでは感度をプログラム上で調整することにしよう。従って
A/Dコンバーターについて
Picoのピン配置に記載の通り、GPIOの26〜28がそれぞれADC0〜3という3つのA/Dコンバーターの入力を兼ねている。仕様は以下の通りである。
- 0V〜3.3Vの範囲の電圧を読み取り、0〜65535の整数に変換する。つまり分解能は12bitである。
- アナログ入力専用の正電位とグランドとしてADC_VREFとAGNDがある。これに接続することで、入力の精度を向上させることができる。
プログラム
from machine import ADC # A/Dコンバーターを使えるように
from time import sleep # 処理を一時中断する「sleep」を使えるように
photoref = ADC(0) # ADC0を使う。()内はGPIOの番号ではない
while True:
photoref_out = photoref.read_u16() / 65535 # 0〜1の範囲に正規化
print(photoref_out)
sleep(1)
もし電圧測定がしたいのならば、photoref.read_u16() / 65535 * 3.3
などとすれば良い。
実行結果
状態 |
photoref_out の値 |
---|---|
遮るもの無し | 0.015くらい |
1cmの所に黒い紙 | 0.25くらい |
1cmの所に白い紙 | 0.95くらい |
近接センサーやライントレーサーとして機能することが確認できる。部屋の照明には影響されないが、灯油ストーブに向けたら誤作動した。
-
アナログの入力をデジタルに変換して受け取る機能 ↩︎
Discussion