※この記事は公開から時間が経っているため、現在の環境とは内容が異なる場合があります。
フォトリフレクタ(反射型フォトセンサ)の RPR-220 を、ラズベリーパイ(Raspberry Pi Zero WH)で使う方法を紹介します。
フォトリフレクタは、赤外線を出して、対象物から反射して戻ってきた光を受け取るセンサーです。
近くに白っぽいものがあると反射しやすく、黒っぽいものは反射しにくくなります。
その反射の違いを使って、物が近くにあるか、明るく反射しているか、黒いラインか白い面か、といったことを調べることができます。
ラズベリーパイの本やネットを見ても、フォトリフレクタをRaspberry Pi Zero WHでどうつなぐのか、初心者向けにまとまった情報が意外と見つかりにくくて、かなり調べながら進めました。
この記事では、フォトリフレクタのしくみ、抵抗の考え方、配線、動作確認、7セグメントLEDへの表示まで、できるだけ順番に整理していきます。
うさたんフォトリフレクタってなぁに?
まある近くにあるものが、白いとか、黒いとか分かるセンサーだよ
今回の制作内容
今回は、フォトリフレクタ RPR-220 をRaspberry Pi Zero WHにつないで、反射の違いを確認します。

大まかな流れは、次の通りです。
- フォトリフレクタのしくみを確認する
- LED側とフォトトランジスタ側の抵抗を考える
- Raspberry Pi Zero WHとブレッドボードに配線する
- カメラごしに赤外線LEDの点灯を確認する
- 白い紙、アルミホイル、赤いテープで反応を見る
- ADコンバータを使って値を読み取る
- 7セグメントLEDに数値を表示する
まずは確認用LEDで「反応しているか」を見て、次に7セグメントLEDで「どれくらい反応しているか」を見えるようにします。
赤いキラキラのテープが一番よく反応したので、最後の動作確認ではそのテープを使っています。
準備するもの
今回使うものは、次の通りです。
- Raspberry Pi Zero WH
- microSDカード
- microUSB電源ケーブル
- パソコン
- ブレッドボード
- ジャンパーワイヤー
- 抵抗
- LED
- フォトリフレクタ(RPR-220)
- 7セグメントLED
- ADコンバータ(MCP3002)
- 8ビットシフトレジスタ(74HC595)
準備するもの全体は、こちらの記事にもまとめています。


Raspberry Pi Zero WH
Raspberry pi zero WH は、初期設定と環境設定が済んだものを使います。



microSDカード
Raspberry PiのOSやプログラムを保存するために、microSDカード を使います。

8〜32GB程度のものを目安に使っています。
microUSB電源ケーブル
Raspberry Pi Zero WHの電源用に、microUSB電源ケーブルを使います。

パソコン
最初の設定や、パソコンのブラウザからの動作確認に使います。

この記事では、Raspberry Piの画面をVNC Viewerなどで表示しながら、フォトリフレクタの動作確認やPython3プログラムの実行を行います。
ブレッドボード
ブレッドボード は、はんだ付けをしなくても電子部品を差し込んで配線できるボードです。

ジャンパーワイヤー
ジャンパーワイヤー は、Raspberry PiのGPIOピンとブレッドボードをつなぐために使います。

抵抗
抵抗は、フォトリフレクタ内の赤外線LEDに流れる電流を制限したり、フォトトランジスタ側の電圧を決めたりするために使います。

この記事では、330Ωと30kΩの抵抗を使っています。
LED
LEDは、電流を流すと光る部品です。
最初の動作確認用にLEDを使います。

フォトリフレクタが反応すると、確認用LEDが点灯するようにします。
フォトリフレクタ(RPR-220)
今回使うフォトリフレクタ(反射型フォトセンサ) です。

7セグメントLED
7セグメントLED は、後半でフォトリフレクタの値を数字で表示するために使います。

ADコンバータ MCP3002
Raspberry Piはアナログ値をそのまま読み取れないため、ADコンバータ を使います。

8ビットシフトレジスタ 74HC595
8ビットシフトレジスタ は、7セグメントLEDを表示する際、GPIOを節約するために使います。

フォトリフレクタとは
フォトリフレクタは、光の反射によって、近くにある物の有無や位置、反射の強さを検知できるセンサーです。
今回使用するのは、ローム株式会社(ROHM)のフォトリフレクタ(反射型フォトセンサ) RPR-220 です。
フォトリフレクタのしくみ

フォトリフレクタは、赤外線LEDとフォトトランジスタがセットになったセンサーです。
赤外線LEDから、人間の目には見えない赤外線を出します。
近くに白い紙のような反射しやすいものがあると、その赤外線が反射して戻ってきます。
戻ってきた光をフォトトランジスタが受け取ることで、電気信号として変化が出ます。
反対に、黒い紙のように光を吸収しやすいものは、反射光が少なくなります。
この違いを使って、近くのものが白っぽいか黒っぽいか、反射しやすいかどうかを調べることができます。
しかも、対象物に触れずに検知できるので、回転しているものや動いているものを調べるときにも便利です。
RPR-220の構造
フォトリフレクタは、4本の端子があります。

右側の透明な丸いガラスのように見える部分が、赤外線を出すLEDです。
左側の欠けのあるように見える部分が、反射した光を受け取るフォトトランジスタです。
フォトリフレクタの端子
フォトリフレクタから出ている4本の端子には、それぞれ名前があります。

端子の名前は、次の通りです。
- アノード(赤外線LEDの+側)
- カソード(赤外線LEDの-側)
- エミッタ(フォトトランジスタのエミッタ)
- コレクタ(フォトトランジスタのコレクタ)
①アノードと④コレクタをプラス側に、②カソードと③エミッタをマイナス側につなぎます。
ブレッドボードに挿すときは、同じ列に挿さないように注意します。
端子を無理に広げると壊れてしまうことがあるので、扱うときは慎重に作業します。
回路図
Raspberry Pi Zero WHとフォトリフレクタ、通電確認用LEDを接続する回路図を作成しました。

Raspberry Pi Zero WHの3.3V電源とGNDを使い、フォトリフレクタの赤外線LED側とフォトトランジスタ側を接続します。
また、最初の動作確認用として、LEDも接続しています。
抵抗の計算
ここで、どうして330Ωと30kΩの抵抗を使ったのかを確認します。

うさたん計算がいっぱいだね
まある細かい計算なので、配線だけ確認したい場合は「配線方法」まで進んでも大丈夫です。
ここでは、ROHMのRPR-220のデータシートを参考にして抵抗値を考えます。
大事なのは、Raspberry PiのGPIOに大きな電流を流しすぎないことです。
この記事では、GPIOピン1本あたり8mA程度を目安に考えています。
LED側の抵抗値計算
まずは左側のフォトリフレクタ内の赤外線LED側の抵抗を考えます。

通常のLEDと同じように、LEDに流れる電流を制限するために抵抗を入れます。
データシートでVFの値を確認すると、順方向電圧 Vf は1.34V であることが分かりました。
Vf = 1.34V
Raspberry Piの3.3Vから、赤外線LEDの順方向電圧1.34Vを引くと、抵抗にかかる電圧が分かります。
3.3V - 1.34V = 1.96V
オームの法則は次の式です。
V(電圧) = I(電流) × R(抵抗)
抵抗を求める場合は、次のように変形します。
R(抵抗) = V(電圧) ÷ I(電流)
GPIOに流す電流を8mAとして計算します。
8mA = 0.008A
計算すると、次のようになります。
R = 1.96V ÷ 0.008A
= 245Ω
つまり、245Ωより大きい抵抗を使う必要があることが分かります。
今回は、手元にある330Ωの抵抗を使用します。
250Ωくらいの抵抗がないか、秋月電子通商で探してみましたが、240Ωの上は300Ω、330Ωだったので、こちらを使うことにしました。
330Ωの抵抗を使うと、流れる電流は次のようになります。
I = V ÷ R
= 1.96V ÷ 330Ω
= 0.006A
= 6mA
6mA程度なら、目安としている8mAより小さいので、今回の確認用としては扱いやすい値です。
LEDの抵抗計算については、ラズベリーパイでLチカさせる記事内の「抵抗の計算方法」でも紹介しています。
フォトトランジスタ側の抵抗値計算
次に、フォトトランジスタ側の抵抗を考えます。

ROHM社の反射型フォトセンサ(フォトリフレクタ) – RPR-220ページにデータシートなどと一緒に不可抵抗算出例が載っているので、これを参考に計算しました。
フォトトランジスタ側では、反射光を受けたときの電流変化を電圧の変化として読み取れるようにします。
この抵抗は、プルアップ抵抗として働きます。
RPR-220の資料から、IF=10mAのときのコレクタ電流 IC の最小値「IC Min」が0.08mAであることが分かります。
IC Min = 0.08mA
今回の回路では、赤外線LED側の電流を約6mAとしているため、6mAでのIC Minを求めます。
IC Min = 0.08mA × (6mA ÷ 10mA)
= 0.048mA
ここで、不可抵抗算出例では、経時変化を考慮して10年使用で約50%減するというマージンをとっていますが、あまりに小さな値になってしまいますし、10年も使用しないので省略します。
次に、Raspberry PiがHIGH / LOWとして判断するしきい値「スレッシュホールド電圧」を考えます。
この記事では、次の値を参考にします。
Raspberry Piにローと認識させるには0.8V以下の電圧にします。ハイと認識させるには1.3V以上の電圧にします。
引用元:Raspberry Piにハードウエアをつなぐための資料を集めてみる
HIGHとして認識される目安 V HI:1.3V以上
LOWとして認識される目安 V LO:0.8V以下

抵抗の最小値を求めます。
VHI < IC Min × RL Min
という式が成り立ちます。
計算していくと
1.3V < 0.048mA × RL Min
RL Min > 1.3V ÷ 0.000048A
RL Min > 27kΩ
となります。
次に抵抗の最大値を求めます。
データシートから、暗電流 ICEO Max が、0.5μAであることが分かります。
ICEO Max = 0.5μA
なので、
VLO > ICEO Max × RL Max
0.8V > 0.5μA × RL Max
RL Max < 0.8V ÷ 0.0000005A
RL Max < 1,600,000Ω
RL Max < 1.6MΩ
となります。
計算上は、次の範囲の抵抗を使うことになります。
27kΩ < RL < 1.6MΩ
今回は、27kΩより大きい抵抗として 30kΩ を使いました。
配線方法
ここから、Raspberry Pi Zero WHとフォトリフレクタを配線します。
配線図
配線の方法を、図で確認します。

まずは、Raspberry Pi Zero WHの3.3V電源とGNDを、ブレッドボードにつなぎます。
Raspberry Piの3.3V(ピン1) → ブレッドボードの+
Raspberry PiのGND(ピン6) → ブレッドボードの-
次に、フォトリフレクタまわりを接続します。
大きく分けると、次の3つの流れがあります。
- フォトリフレクタ内の赤外線LED側
- フォトリフレクタ内のフォトトランジスタ側
- 動作確認用LED側

① 赤外線LED側
ブレッドボードのプラスから、フォトリフレクタのLED側のプラス(アノード)端子へ接続します。
LED側のマイナス(カソード)端子から、330Ωの抵抗を通して、ブレッドボードのマイナスへ接続します。
② フォトトランジスタ側
ブレッドボードのプラスから、フォトリフレクタのフォトトランジスタ側のプラス(コレクタ)端子へ接続します。
フォトトランジスタ側のマイナス(エミッタ)端子から、30kΩの抵抗を通して、ブレッドボードのマイナスへ接続します。
③ 動作確認用LED側
フォトトランジスタ側のマイナス(エミッタ)端子と30kΩ抵抗の間から分岐して、確認用LEDへ接続します。
確認用LEDの反対側は、ブレッドボードのマイナスへ接続します。
配線の写真
写真で見ると、このような感じです。

ブレッドボード部分をアップにすると、このようになります。

赤外線LEDの動作確認
配線ができたら、Raspberry Pi Zero WHの電源を入れて、フォトリフレクタ内の赤外線LEDが点灯しているか確認します。
赤外線は人間の目では見えませんが、カメラごしに見ると光っていることが確認できる場合があります。

テレビのリモコンなどもカメラごしに見ると、赤外線LEDが光っているのが見られることがあります。
テスターで電圧・電流を確認
動きはよさそうですが、想定通りの電圧・電流になっているか確認します。
大きすぎる電流を流し続けると、Raspberry Pi Zero WHや部品を壊してしまう可能性があります。
そのため、テスターを使って各所を測定しました。
測定結果
こちらの図の赤字が、実際に測定した結果です。

0.1mAになっているところは、実際はもっと小さい値だと思います。
テスターの最小表示が0.1mAだったため、そのように見えている可能性があります。
誤差はあると思いますが、大きく危険な値にはなっていなさそうなので安心しました。
実際に測って数字を見ると、机上の計算だけでは分からなかった部分も見えてきます。
まある計算だけで終わらせずに、実際に測ってみるとかなり安心できます。
フォトリフレクタの動作確認
では、実際に反応するか確認します。
白い紙、アルミホイル、赤いキラキラのテープを近づけて、確認用LEDの光り方を見ます。
白い紙
白い紙をフォトリフレクタに近づけて、確認用LEDが点灯すれば成功です。
データシートによると、RPR-220は6mmくらいの距離で反応しやすいようなので、そのあたりを目安に近づけます。
まあるLEDが点いた!
こちらの動画では、少しLEDが暗いですが、ちゃんと反応して点灯しています。
アルミホイル
次に、紙よりも光を反射してくれそうなアルミホイルでも試してみました。

うさたん紙よりも明るくLEDが点きました
アルミホイルは反射しやすいですが、表面がデコボコしているため、少し不安定な反応にも見えました。
ピカピカの赤いテープ
たまたま手元に工作用のピカピカの赤いテープがあったので、これも試してみました。

写真だと少し分かりにくいですが、試した中ではこの赤いテープが一番よく反応しました。
まあるすごく光ってる。これはちょっと感動します。
フォトリフレクタの値を表示
次にフォトリフレクタの出力値を7セグメントLEDに表示します。


Raspberry Piは、アナログ信号をそのまま入力することができません。
そのため、フォトリフレクタの出力をADコンバータでデジタル信号に変換してから読み取ります。
さらに、7セグメントLEDを表示するために多くのGPIOを使うため、GPIOを節約する目的で 8ビットシフトレジスタも使います。
構成
構成は、次のようになります。

流れとしては、次の通りです。
フォトリフレクタ
→ ADコンバータ(MCP3002)
→ Raspberry Pi Zero WH
→ シフトレジスタ(74HC595)
→ 7セグメントLED
回路図
細かくなりますが、回路図はこちらです。

配線図
配線図はこちらです。

配線の写真
写真で見ると、このような配線になります。

ブレッドボード部分をアップにすると、このようになります。

gpiozeroでADコンバータの値を読む
ADコンバータ(MCP3002)の値を読み取るため、SPI通信を行います(詳しくは、MCP3002で紹介しています)。
SPI通信用のモジュールはいくつかありますが、今回はgpiozeroというライブラリを使います。
こちらの情報を参考にさせていただきました。ありがとうございます。
プログラム
ここでは、フォトリフレクタで読み取った反射の強さを、7セグメントLEDに数字で表示するPython3のプログラムを使います。
フォトリフレクタの出力は、そのままではRaspberry Piで読み取りにくいため、ADコンバータ(MCP3002)を使って値を読み取ります。
読み取った値は0〜1の範囲で取得されるので、100倍して見やすい数値に変換し、7セグメントLEDに表示します。
このプログラムで行っている主な処理は、次の通りです。
- ADコンバータ(MCP3002)からフォトリフレクタの値を読み取る
- 読み取った値を100倍して、表示しやすい数値に変換する
- 100の位・10の位・1の位に分ける
- シフトレジスタ(74HC595)を使って、7セグメントLEDに数字を表示する
Ctrl + Cが押されたら、GPIOの設定をリセットして終了する
コードが長いので、全体はアコーディオンの中に入れています。
フォトリフレクタの値を7セグメントLEDに表示するPythonプログラムを見る
import RPi.GPIO as GPIO
from gpiozero import MCP3002
from time import sleep
# A/Dコンバータ チャンネル0を指定
ch0 = MCP3002(channel=0)
# シフトレジスタ GPIO番号設定
SCK = 17 # シフトレジスタクロック
RCK = 18 # ラッチクロック
SER = 27 # シリアルデータ入力
# 7セグメントLED 各桁のアノード GPIO番号
# DIG1 DIG2 DIG3
dig_anode = [ 4, 3, 2 ]
# 7セグメントLED 桁表示パターン
dig_ptn = [
[1,0,0], # DIG1
[0,1,0], # DIG2
[0,0,1], # DIG3
]
# 7セグメントLEDに数字を表示するパターン
disp_ptn = [
#a,b,c,d,e,f,g,p
[1,1,1,1,1,1,0,0], #0
[0,1,1,0,0,0,0,0], #1
[1,1,0,1,1,0,1,0], #2
[1,1,1,1,0,0,1,0], #3
[0,1,1,0,0,1,1,0], #4
[1,0,1,1,0,1,1,0], #5
[1,0,1,1,1,1,1,0], #6
[1,1,1,0,0,1,0,0], #7
[1,1,1,1,1,1,1,0], #8
[1,1,1,0,0,1,1,0], #9
]
#GPIO番号の指定モードを設定(BCM:役割ピン番号)
GPIO.setmode(GPIO.BCM)
# 出力として使用するように設定
GPIO.setup(SCK, GPIO.OUT)
GPIO.setup(RCK, GPIO.OUT)
GPIO.setup(SER, GPIO.OUT)
GPIO.setup(dig_anode[0], GPIO.OUT)
GPIO.setup(dig_anode[1], GPIO.OUT)
GPIO.setup(dig_anode[2], GPIO.OUT)
# 7セグメントLEDに数字を表示する
def disp_num(no, dig):
# GPIOをLOWにリセット
GPIO.output(SCK, GPIO.LOW)
GPIO.output(RCK, GPIO.LOW)
GPIO.output(SER, GPIO.LOW)
# 7セグメントLED 各桁のアノード ON/OFF切り替え
for i in range(3):
if dig_ptn[dig-1][i] == 1:
GPIO.output(dig_anode[i], GPIO.HIGH)
else:
GPIO.output(dig_anode[i], GPIO.LOW)
# 7セグメントLEDに数字を表示
for dp in reversed(disp_ptn[no]):
if dp == 1:
# アノードコモン(シンク電流)なのでLOWで点灯
GPIO.output(SER, GPIO.LOW)
else:
GPIO.output(SER, GPIO.HIGH)
# シフトレジスタ 最下位ビットにSERの内容を追加
GPIO.output(SCK, GPIO.HIGH)
GPIO.output(SCK, GPIO.LOW)
# シフトレジスタから出力
GPIO.output(RCK, GPIO.HIGH)
GPIO.output(RCK, GPIO.LOW)
# ちょうどチラつかない値を設定
sleep(0.008)
try:
while True:
# A/Dコンバータから読み込み 値を100倍に
val = int(ch0.value * 100)
# 100の位を表示
if val//100:
disp_num((val//100), 1)
val %= 100
# 10の位を表示
if val//10:
disp_num((val//10), 2)
val %= 10
# 1の位を表示
disp_num(val, 3)
#キーボードからCtrl+C割込みが入ったら
except KeyboardInterrupt:
pass
#GPIOの設定をリセット
GPIO.cleanup()このプログラムのポイントは、ADコンバータから読み取った値を、7セグメントLEDで表示できる形に変換しているところです。
ch0 = MCP3002(channel=0)この部分で、ADコンバータ MCP3002 のチャンネル0を読み取るように設定しています。
フォトリフレクタの値は、次の部分で読み取っています。
val = int(ch0.value * 100)ch0.value は0〜1の範囲で取得されるため、100倍して、7セグメントLEDに表示しやすい数値にしています。
7セグメントLEDは3桁で表示するため、値を100の位・10の位・1の位に分けて表示しています。
# 100の位を表示
if val // 100:
disp_num((val // 100), 1)
val %= 100
# 10の位を表示
if val // 10:
disp_num((val // 10), 2)
val %= 10
# 1の位を表示
disp_num(val, 3)disp_num() は、指定した数字を7セグメントLEDの指定した桁に表示するための関数です。
7セグメントLEDは、各桁を高速に切り替えながら表示しています。人の目には、3桁が同時に点灯しているように見えます。
また、シフトレジスタ(74HC595)を使うことで、Raspberry PiのGPIOを節約しながら7セグメントLEDを制御しています。
GPIO.output(SCK, GPIO.HIGH)
GPIO.output(SCK, GPIO.LOW)このようにクロック信号を送ることで、シフトレジスタへ1ビットずつデータを送っています。
プログラムを止めるときは、Ctrl + C を押します。
最後に GPIO.cleanup() を実行して、GPIOの設定をリセットしています。
GPIO.cleanup()Raspberry Piで電子工作をするときは、プログラム終了時にGPIOをリセットしておくと安心です。
動作確認
プログラムを動かして、フォトリフレクタに赤いキラキラのテープを近づけてみます。
7セグメントLEDに、フォトリフレクタの値が表示されました。

こちらは動画です。
LEDがきれいに見えるように、少し暗めで撮影しています。
反射が強いものを近づけると値が大きくなり、反射が弱いものを近づけると値が小さくなります。
うまく動かないときに確認したいこと
フォトリフレクタの向きは合っているか
RPR-220は端子の向きが重要です。
アノード、カソード、エミッタ、コレクタを間違えると、うまく動きません。
ブレッドボードの同じ列に挿していないか
フォトリフレクタの端子をブレッドボードに挿すとき、同じ列に挿してしまうと意図しない接続になります。
端子の列をよく確認します。
抵抗値は合っているか
この記事では、LED側に330Ω、フォトトランジスタ側に30kΩを使っています。
違う値を使う場合は、電流や読み取り値が変わります。
赤外線LEDは光っているか
赤外線LEDは目では見えません。
スマホやデジカメのカメラごしに見て、点灯しているか確認します。
反射させるものとの距離は近すぎないか、遠すぎないか
RPR-220は、対象物との距離によって反応が変わります。
近づけすぎても遠すぎても、思ったような値にならない場合があります。
まとめ
フォトリフレクタ(反射型フォトセンサ)RPR-220を、Raspberry Pi Zero WHで使う方法を確認しました。
今回行ったことは、次の通りです。
- フォトリフレクタのしくみを確認する
- RPR-220の端子を確認する
- LED側の抵抗330Ωを計算する
- フォトトランジスタ側の抵抗30kΩを計算する
- Raspberry Pi Zero WHとブレッドボードに配線する
- カメラごしに赤外線LEDの点灯を確認する
- 白い紙、アルミホイル、赤いテープで反応を見る
- ADコンバータと7セグメントLEDを使って値を表示する
フォトリフレクタは、コピー機で紙の有無を検知したり、黒いラインを追いかける車を作ったり、回転を検知したり、いろいろな場面で使われています。
今回のように、まずは「白いものと黒いものの反射の違いを見る」ところから始めると、しくみが理解しやすいです。
次は、このフォトリフレクタを使って、ハムスターの回転計に挑戦します。

関連するラズベリーパイ記事や制作記録はこちらです。





