5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (11) 人感センサ2 PSUP7C-02-NCL-16-1
■人を検知する薄型の焦電型赤外線センサ
自動ドアなどで、人を感知するのに焦電型赤外線センサが使われます。センサ自体を駆動する回路は複雑ですが、回路を含めてモジュール化された製品が入手できます。人を検知できる範囲は、センサ自身の性能とレンズによって大きく異なります。
前回のPaPIRsと同じに使えます。
●日本セラミック PSUP7C-02-NCL-16-1 フラット・薄型
28×14mm、厚みは薄く約6mmとコンパクトなセンサ・モジュールです。検知範囲は2mです。秋月電子通商で入手しました。
- 動作電圧;3~5.25V
- 消費電流;450~3000uA
- 出力電流;10uA
- 出力電圧;非検知時Vcc*0.8V、検知時Vcc*0.2V
- 電源投入時回路が安定な出力をする待機時間;60秒
●接続
センサ・モジュールにはJSTのコネクタが付いていて、正面から見ると左から1ピンはGND、2ピンがDout、3番がVccです。ケーブルは付属していますが、いずれも同じ青色で配線を間違えそうだったので、シール用紙でラベルを付けました。
センサ・モジュールの端子 | ラズパイのピン番号 |
---|---|
Vcc | 1番 3.3V |
Dout | 40番 GPIO21 |
GND | 39番 GND |
動作確認用に、抵抗内蔵型LEDはGPIO17(11番ピン)につなぎました。 GPIO17やGPIO21はBCM名称で、CPU(SoC)のデータシートに書かれている名称です。
●プログラム例 ライブラリgpiozero
gpiozeroのライブラリにMotionSensorがあります。
2017年8月現在、RASPBIAN Stretch WITH DESKTOPのカーネルを確認します。8月16日にDebian version 9であるStretch に変更になりました。
uname -a
4.9.41
インストールされているPythonのバージョンを調べます。
python -V 2.7.13
インストールされているPython用ライブラリを調べます。
pip list gpiozero(1.4.0)
人を検知したら、LEDを光らせます。LEDは11番ピンのGPIO17につなぎます。焦電型赤外線センサの出力outをつないでいるGPIO21も、GPIOのどのピンでもかまわないようです。
非同期でセンサの状態を検知しています。while文のprintは、動作確認用です。センサの出力を確認したいとき、#を外してください。print文のインデントはtabを入れますが、表示の都合上スペースを8個入れてあります。このプログラムが動き始めるときには、OSが立ち上がるために60秒以上経過しているので、出力が安定する時間60秒を待ちません。
この焦電型赤外線センサは、前回利用したPaPIRsと異なり負論理の出力です。センサが人を検知したとき(=False=Low)にLEDを点灯します。「人がいないとき、人が微動だにしないとき」にはLEDを消灯させます。この焦電型赤外線センサは、赤外線を発生している物体が動かないと、出力はHigh(=True)です。
#!/usr/bin/env python
from gpiozero import LED,MotionSensor
from signal import pause
led = LED(17)
button = MotionSensor(21)
button.when_motion = led.off
button.when_no_motion = led.on
#while 1:
# print (button)
pause()
記述を変えてみました。焦電型赤外線センサが人を検知したときにTrueを返すmotion_detectedを使います。人を検知するとLEDが光ります。
#!/usr/bin/env python
from gpiozero import LED,MotionSensor
led = LED(17)
button = MotionSensor(21)
while 1:
if button.motion_detected == False :
led.on()
led.off()
センサの出力がディジタルなので、gpiozeroのライブラリでなくとも実現できますね。
●プログラム例 ライブラリRPi.GPIO
RPi.GPIOのバージョンは0.6.3でした。whileループが動いていると、CPUがほかの仕事ができないように見えます。ラズパイのOSは時間ごとやイベントがあるごとに、ほかのプログラムに制御を高速に切り替えているので、このプログラム以外が止まることはありません。
#!/usr/bin/env python
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.OUT)
GPIO.setup(21,GPIO.IN)
try:
while 1:
if GPIO.input(21) == False :
GPIO.output(17,GPIO.HIGH)
GPIO.output(17,GPIO.LOW)
except KeyboardInterrupt:
GPIO.cleanup()