RaspberryPi 3 Model B+と長距離透過形フォト・マイクロセンサで通過数をカウントする
目次
長距離透過形フォト・マイクロセンサ
RaspberryPi 3 Model B+とオムロンの長距離透過型フォト・マイクロセンサ(EE-SPW311)を使って物体の通過検知のプログラムを作成した時の備忘録。
向かって左側の赤色のLEDが付いている方が受光器、右側が投光器になる。
以下の条件で動作するセンサーを探していた所、オムロンのEE-SPW311がヒットしたので試してみることにした。
- 通過検知が可能なセンサー
- 距離は1m弱
- RaspberryPiで使いたい
アマゾンで4,688円で購入した。
この手のセンサーとしては正直ちょっと高目だとは思ったが過去記事の赤外線センサー(TSSP77038)だと人が近くを通った時に誤検知をしてしまう事がまれにあるので2点間での通過検知の方がより精密なのではないかと思いIoTの勉強も兼ねて購入してみた。
IoTの勉強とは言ってもRaspberryPiに接続はするが今回のプログラムではインターネットに接続はしないので厳密に言うとIoT(Internet of Things)では無いので、そこはご了承ください。
やりたいこと
やりたいことのイメージ図は以下の通り。
通過検知センサーを使って物体が通過した件数をRaspberryPiでカウントしたい。
スペック
EE-SPW311の主なスペックは以下の通り。
データシートはこちらを参照のこと。
電源電圧 |
DC5(-5%)~24V(+10%) 5Vで動作するのでRaspberryPiに直接つなげることにした |
検出距離 |
1m |
検出物体 |
直径5mm以上 |
光源 |
GaAs赤外発光ダイオード |
動作モード |
しゃ光時ON 尚、入光時にONになるEE-SPW411もある |
端子配列
投光器
1 |
DC5~24V |
2 |
- |
3 |
0V |
受光器
1 |
DC5~24V |
2 |
OUTPUT RaspberryPiのGPIO5に接続する |
3 |
0V |
RaspberryPiとの接続
RaspberryPiとEE-SPW311との接続は以下の通り。
OutputはGPIO5に接続した。
プログラム
物体検出&カウントアップ用のPythonの簡易プログラムは以下の通り。
もう少しスマートな書き方はあるの思うのでソースの公開はちょっと恥ずかしいのだけれども同じようなことをやりたい人達に少しでも役に立つのであればと思い公開する。
# -*- coding utf-8 -*-
"""
Created on 2019-08-04
EE-SPW311 Test Program
"""
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM) # ピンをGPIOの番号で指定
SPW311 = 5 # ピンの名前を変数として定義
GPIO.setup(SPW311, GPIO.IN, pull_up_down=GPIO.PUD_UP) # GPIOセットアップ
#main
try:
if __name__ == '__main__':
find_flg = 0 # モノを見つけたフラグの初期化
counter = 0 # カウンターを初期化
while True:
if GPIO.input(SPW311) == GPIO.HIGH: # LOWからHIGHになる時にカウントアップ
if find_flg == 1: # 前回検知している
counter += 1
print("found",counter)
find_flg =0
else:
find_flg =1 # find(検知)
sleep(0.01)
except KeyboardInterrupt:
pass
GPIO.cleanup()
カウントアップの考え方
- 物体検出:GPIO5=Low
- 物体未検出:GPIO5=High
となっているがGPIO5がHIGHになった時にカウントアップしている。
これは物体がセンサーの前を通り過ぎた後のタイミングでカウントしたいのでこの仕様にしている。
0.01秒間隔でGPIOを監視しているのでHigh、High・・・High、Low、Low・・・、Low、High、Highの様に検出される。
基本的な考え方は以前のこちらの記事のGPIOの推移(イメージ図)を参照して欲しい。
プログラムの実行結果
プログラムの実行結果は以下の通り。
センサーの前を物体が横切るたびにカウントアップされる。
以上で今回の記事を終了とする。
この記事がどこかで誰かの役に立てば良いと願っている。
本ページを参考にさせて頂き、物体検知センサーを制作しようと試みているですが、
信号検知ができない状態でして、センサーはPTB-802 透過形光電センサというものを使用しています。
こちらで取り上げているセンサーとは配線方法異なるのか、ご教示いただけないでしょうか?
KKさん
コメントありがとうございます。
カタログを見る限りいけそうではありますね。
1)PTB-802ですが5Vと12Vがあるようです。5Vの方ですか
2)受光センサーのライトは光りますか(PTB-802-5DとPTB-802-5D1で動きが違うようです)
→まずはセンサーが正しく動作しているかの確認です
3)プルアップ抵抗ですがプルダウンを指定したらどうなりますか
GPIO.setup(SPW311, GPIO.IN, pull_up_down=GPIO.PUD_UP)
↓
GPIO.setup(SPW311, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
気がつくのはこれぐらいでしょうか。
souichirouさん
掲載プログラムそのまま使用したところ動作できました。
(プログラムは別に書いたものを使っていまして、早とちりな質問をしてしまいすみません。)
pull_up_down=の指定が必要なのですね。pull_up_down=GPIO.PUD_UPのままで動作しました。
DOWNに変えるとカウントしませんでした。
受光器は5v遮光時ONのPTB-802-5D1を使用していますが、この場合センサー内部スイッチのon/offと
GPIOへのhigh/lowは逆になるんですね。
それと投光器側はモバイルバッテリーから電源供給していましたが、
接続して何秒かで電源供給が遮断されることも改めてセンサーの動作確認でわかりました。
初歩的な質問ながらご丁寧に返答下さりありがとうございました。
KKさん
無事に動作したようで良かったですね。
pull_up_down指定は取得する電圧を安定化させる為の抵抗の指定です。
ほとんどのセンサーはPUD_UP指定で動作しますが、まれにPUD_DOWN指定が必要なセンサーがあるのでもしかしたらと思ったのですがUPで大丈夫だった様ですね。
後、遮光時ONとOFFではLOW、HIGHが逆になりますね。