🫖

Raspberry Pi Picoでフォトリフレクタを使う

2024/02/18に公開

フォトリフレクタとは

赤外線LEDとその反射光を検出するフォトトランジスタを1つのユニットにしたものである。反射光の有無を検出することで、物体の存在やその色(白か黒かくらいだが)を検知できる。


フォトリフレクタの回路記号と一般的な外見

  • 赤外線LEDはその名の通り、赤外線を出すLEDである。人間の目には見えないが、スマートフォンのカメラ越しに見ると点灯していることを確認できる場合がある。
  • フォトトランジスタはベースがないBJTのような構造になっている。ベース電流の代わりに光が当たるとコレクタ電流が流れるようになる。
  • 素子の足の並びが回路図と一致しているとは限らないので注意。さらにメーカーによっても異なるので、データシートで良く確認すること(例えば、PRR-220なら上の並びではない)。

今回使用したフォトリフレクタはLBR-127HLD。LEDの最大電流は60mAであるが、データシートに記載の典型値であるI_F= 20mA、V_F= 1.2Vで使用する。この場合、センサから数mmとのところに白い物体があれば、フォトトランジスタのコレクタ電流はI_C= 0.4mA程度が期待できる。

https://akizukidenshi.com/catalog/g/g104500/

Raspberry Pi Picoへの接続

回路図と実装


回路図とブレッドボード上への実装

抵抗値の計算

普通のLEDやトランジスタの場合と同様に考える。
https://zenn.dev/ythk/articles/ythk-raspico-led01

赤外線LEDに関して、V_F= 1.2V、I_F= 20mAとするために、R_1は以下のように計算できる。

V_F + I_F R_1 = 3.3 \qquad \Rightarrow \qquad R_1 = \frac{3.3 - 1.2}{0.020} = 105 \,\mathrm{\Omega}

フォトトランジスタに関して、I_c= 0.4mAが流れた際に、GPIOへ3.3Vに近いの電圧がかかるようにしたい。そこで、R_2は以下のように計算できる。

R_2 I_c = 3.3 \qquad \Rightarrow \qquad R_2 = \frac{3.3}{0.0004} = 8.3 \,\mathrm{k\Omega}

この抵抗が大きすぎると感度が高くなりすぎ、小さすぎると感度が低くなりすぎる。デジタル入力をするのならば、ここを可変抵抗にするのも良いだろう。

PicoにはA/Dコンバーター[1]が搭載されているので、ここでは感度をプログラム上で調整することにしよう。従ってR_2の値に対して神経質になる必要はない。R_1は計算通り100ΩR_2は入手しやすい10kΩを選ぶことにする。

A/Dコンバーターについて

Picoのピン配置に記載の通り、GPIOの26〜28がそれぞれADC0〜3という3つのA/Dコンバーターの入力を兼ねている。仕様は以下の通りである。

  • 0V〜3.3Vの範囲の電圧を読み取り、0〜65535の整数に変換する。つまり分解能は12bitである。
  • アナログ入力専用の正電位とグランドとしてADC_VREFとAGNDがある。これに接続することで、入力の精度を向上させることができる。

https://zenn.dev/ythk/articles/ythk-raspico-pins

プログラム

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くらい

近接センサーやライントレーサーとして機能することが確認できる。部屋の照明には影響されないが、灯油ストーブに向けたら誤作動した。

脚注
  1. アナログの入力をデジタルに変換して受け取る機能 ↩︎

Discussion