フォトリフレクタ(反射型フォトセンサ)のRPR-220をラズベリーパイ(Raspberry Pi Zero WH)で使う方法を紹介します。
ラズベリーパイ(Raspberry Pi Zero WH)で使用する際の注意点や、必要な抵抗の計算方法なども詳しく説明しています。
ラズベリーパイ(Raspberry Pi)の本やネットになかなか詳しい手順が載っていなくて、どうやって使うのかを調べるのに苦労しました。
なので、初心者にも優しい、なるべく分かりやすい説明をしていきたいと思います。
フォトリフレクタってなぁに?
近くにあるものが、白いか、黒いか 分かるセンサーだよ
準備するもの
1 | ラズベリーパイ(Raspberry pi zero WH) 詳しくは、こちらです。 初期設定・環境設定が済んだものを使用します。 | |
2 | microSDカード 8~32GB 詳しくは、こちらです。 | |
3 | microUSB電源ケーブル スマホの充電ケーブルでOKです。 詳しくは、こちらです。 | |
4 | パソコン microSDに書き込めるもの。 詳しくは、こちらです。 | |
5 | ブレッドボード 詳しくは、こちらです。 | |
6 | ジャンパーワイヤー 詳しくは、こちらです。 | |
7 | 抵抗 詳しくは、こちらです。 | |
8 | LED(発光ダイオード) 何色でもOKです。 詳しくは、こちらです。 | |
9 | フォトリフレクタ(反射型フォトセンサ) 詳しくは、こちらです。 | |
10 | 7セグメントLED 詳しくは、こちらです。 | |
11 | ADコンバータ MCP3002 詳しくは、こちらです。 | |
12 | 8ビットシフトレジスタ 74HC595 詳しくは、こちらです。 |
フォトリフレクタとは
フォトリフレクタは光の反射によって、近くにある物の有無や位置、色などを検知できるセンサです。
今回使用するローム株式会社(ROHM)のフォトリフレクタ(反射型フォトセンサ)RPR-220をベースに説明します。
フォトリフレクタの構造
フォトリフレクタは、LEDとフォトトランジスタがセットになったセンサーで、4本の端子がついています。
右側の透明な丸いガラスの方が入力発光ダイオード LEDで、左側の欠けのある方がフォトトランジスタです。
LEDから人間の目には見えない赤外線の光を発します。
近くに白い紙のような光を反射するものがあると、LEDからの光を反射して、その光をフォトトランジスタが受けることによって電流を流します。
この電流の流れで、近くのものが白っぽいか黒っぽいのかを、調べることができます。
しかも、磁石なども使わず、非接触(対象の物にさわらない)で調べることができるので、とっても便利です。
フォトリフレクタの使い方
下の図は、フォトリフレクタの内部構造です。
フォトリフレクタから出ている4本の端子には、それぞれ ①アノード ②カソード ③エミッタ ④コレクタという名前がついています。
①アノードと④コレクタをプラス側に、②カソードと③エミッタをマイナス側につなぎます。
*ブレッドボードに挿すときは、同じ列に挿さないように注意します。
*端子を無理に広げるとこわれてしまうので、気をつけてください。
回路図
ラズベリーパイ(Raspberry Pi Zero WH)とフォトリフレクタ、通電確認用のLEDを接続する回路図を作成しました。
ラズベリーパイ(Raspberry Pi Zero WH)の3.3V電源とフォトリフレクタを接続し、抵抗を入れます。また、動作確認用のLEDも接続しました。
抵抗の計算
ここで、どうして330Ωと30kΩの抵抗を使用したのか、その計算方法を説明します。
計算がいっぱいだね
細かい計算だから、興味がない人は
次の配線方法に進んでください
ROHM社の反射型フォトセンサ(フォトリフレクタ) – RPR-220で公開されている詳しい仕様やデータシートなどを参考にしました。
注意点は、ラズベリーパイ(Raspberry Pi Zero WH)の GPIOピン1本あたりに流せる電流は8mAまでという制限があるということです(詳しくはこちらを参照してください)。
LED側の抵抗値計算
まずは左側の入力用ダイオード LED側の抵抗を考えます。
通常のLEDと同じようにデータシートでVFの値を確認するとVF=1.34V であることが分かりました。
3.3V-1.34V = 1.96V なので、抵抗に1.96Vの電圧がかかることが分かります。
オームの法則を使って、抵抗の値を計算していきます。
オームの法則 V(電圧) = I(電流) × R(抵抗) から
R(抵抗) = V(電圧) ÷ I(電流)
= 1.96[V] ÷ 0.008[A]
= 245 [Ω]
LEDの抵抗計算について詳しくは、「ラズベリーパイ(Raspberry Pi Zero WH)でPython3 Lチカ(LED点滅)させる方法」で紹介していますので、よかったら見てみてください。
なので、245Ωより大きい抵抗を使う必要があることが分かります。
今回は手元にある330Ωの抵抗を使用します。
250Ωくらいの抵抗がないか、秋月電子通商で探してみましたが、240Ωの上は300Ω、330Ωだったので、こちらを使うことにしました。
330Ωの抵抗を使用した場合、どのくらいの電流が流れるのか計算してみます。
オームの法則から、I = V ÷ R = 1.96V ÷ 330Ω = 0.006A = 6mA となり、6mAの電流が流れることが分かります。
フォトトランジスタ側の抵抗値計算
次にフォトトランジスタ側の抵抗値を計算していきます。
ROHM社の反射型フォトセンサ(フォトリフレクタ) – RPR-220ページにデータシートなどと一緒に不可抵抗算出例が載っているので、これを参考に計算しました。
データシートからIF=10mAのときに、コレクタ電流ICの最小値「IC Min」が0.08mAであることが分かります。
今回の回路では、6mAの電流が流れるので、6mAでのIC Minを求めます。
IC Min = 0.08mA × ( 6mA / 10mA ) = 0.048mA
ここで、不可抵抗算出例では、経時変化を考慮して10年使用で約50%減するというマージンをとっていますが、あまりに小さな値になってしまいますし、10年も使用しないので省略します。
次にスレッシュホールド電圧を使用して計算します。
スレッシュホールド電圧とは、この電圧以上ならHi、この電圧以下ならLoと判断する電圧のしきい値です。
ラズベリーパイ(Raspberry Pi)のスレッシュホールド電圧を調べました。
Raspberry Piにローと認識させるには0.8V以下の電圧にします。ハイと認識させるには1.3V以上の電圧にします。
引用元:Raspberry Piにハードウエアをつなぐための資料を集めてみる
ということなので、V HI=1.3V、 V LO = 0.8Vで計算します。
抵抗の最小値を求めます。
V HI < IC Min × RL Min という式が成り立ちます。
計算していくと
1.3V < 0.048mA × RL Min
RL Min > 1.3V ÷ 0.000048A
RL Min > 27KΩ となります。
次に抵抗の最大値を求めます。
データシートから、暗電流 I CEO Maxが、0.5μAであることが分かります。
V LO > I CEO Max × RL Max という式が成り立ちます。
計算していくと
0.8V > 0.5μA × RL Max
RL Max < 0.8V ÷ 0.0000005A
RL Max < 1,600,000Ω = 1.6MΩ となります。
よって、27kΩ < RL < 1.6MΩ の抵抗を使用するという結果になりました。
27kΩより大きい抵抗ということで、30kΩを使用しました。
配線方法
配線図
配線の方法を、簡単な図で示します。
準備
まずは、図の一番上の部分を説明します。
ラズベリーパイ(Raspberry Pi Zero WH)の3.3V電源(ピン番号は1番)とブレッドボードの+(プラス)をつなぎます。
ラズベリーパイ(Raspberry Pi Zero WH)のグラウンドGND(ピン番号は6番)とブレッドボードの-(マイナス)もつなぎます。
次に、図の下から上に向かって接続を説明していきます。大きく3つの流れがあります。
①の流れ ブレッドボードのプラスから、フォトリフレクタのLED側のプラス(アノード)端子に接続し、LED側のマイナス(カソード)端子から、330Ωの抵抗をつないで、ブレッドボードのマイナスに接続します。
②の流れ もう1つの流れは、ブレッドボードのプラスから、フォトリフレクタのフォトトランジスタ側のプラス(コレクタ)端子に接続し、フォトトランジスタ側のマイナス(エミッタ)端子から、30kΩの抵抗をつないで、ブレッドボードのマイナスに接続します。
③の流れ さらに、フォトトランジスタ側のマイナス(エミッタ)端子と抵抗の間から分岐して、確認用LEDに接続してブレッドボードのマイナスに接続します。
配線の写真
写真で見るとこんなかんじです。
ブレッドボードの方をアップにします。
赤外線LEDの動作確認
配線ができたら、ラズベリーパイ(Raspberry Pi Zero WH)の電源を入れて、フォトリフレクタの赤外線LEDが点灯しているか確認してみます。
人間の目では見えませんが、カメラごしに見ると光っていることが確認できます。
ちなみに、テレビのリモコンなどもカメラごしに見ると、赤外線LEDが光っているのが見られておもしろいです。
テスターで電圧・電流を確認
動きはよさそうですが、ちゃんと想定通りの電圧・電流になってくれているのか心配です。
大きすぎる電流を流し続けていたら、ラズベリーパイ(Raspberry Pi Zero WH)が壊れてしまうかもしれません。
そこで、あちこちテスターで測ってみました。
測定結果
こちらの図の赤字が実際に測定した結果です。
0.1mAになっているところは、実際はもっと小さい値だと思います。テスターの最小値が0.1mAのようです。
誤差があるでしょうし、テスターもそんなに精密ではないと思いますが、問題なさそうなので安心しました。
実際、測って測定値を見てみるとまた楽しいのでおすすめです。
フォトリフレクタの動作確認
では、実際にうまく動いてくれるか、確認していきたいと思います。ドキドキ。
動作確認ー白い紙
白い紙をフォトリフレクタに近づけて、確認用LEDが点灯してくれれば成功です。
データシートによると6mmくらいの距離が一番反応してくれるそうなので、そのあたりを目指してかざしてみます。
わぁー、LEDが点いた!
こちら動画です。ちょっとLEDが暗いですけど、ちゃんと反応して点いてくれました。
動作確認ーアルミホイル
紙よりは光を反射してくれそうなアルミホイルでも試してみました。
紙よりも明るくLEDが点きました
こちらが動画です。
デコボコしてるから、
ちょっと不安定なかんじです。
動作確認ーピカピカの赤いテープ
たまたま手元に工作用のピカピカの赤いテープがあったので、これも試してみました。
ちょっと写真だと分かりにくいですが、今までで一番光りました!
こちら動画です。
わぁー。すごい光ってる。 ちょっと感動!
フォトリフレクタの値を表示
次にフォトリフレクタの出力値を7セグメントLEDに表示したいと思います。
ラズベリーパイは、アナログ信号を入力することができないので、アナログ信号をデジタル信号に変換するADコンバータをはさみます。
また、GPIOを節約するため、8ビットシフトレジスタも入れました。
回路図
ちょっと細かくなってしまったのですが回路図です。
配線図
線が多くて、見にくくなっちゃったかもしれません。配線図です。
配線の写真
写真で見るとこんなかんじです。
ブレッドボードの方をアップにします。
gpiozero
ADコンバータ(MCP3002)の値を読み取るため、SPI通信を行います(詳しくは、MCP3002を見てください)。
SPI通信用のモジュールはいくつかありますが、今回はgpiozeroというライブラリを使用します。
こちらの情報を参考にさせていただきました。ありがとうございます。
プログラム
Python3のプログラムです。
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()
動作確認
プログラムを動かして、フォトリフレクタに赤いピカピカのテープを近づけてみます。
7セグメントLEDにフォトリフレクタの値が表示されました。
こちらは動画です。LEDがきれいに見えるように、ちょっと暗めで撮影しました。
まとめ
フォトリフレクタは、コピー機に紙があるかをチェックしたり、黒いラインの上を走る車をつくったり、いろいろな場所で利用されています。
脈拍を測ることもできるというから驚きですね。
いろんな利用方法が考えられそうですが、あなただったら何を作りたいですか?
次は、このフォトリフレクタを使って、ハムスターの回転計に挑戦です。