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()