Python
RaspberryPi
IoT
gpio

Raspberry Piと人感センサーで人の検知

授業でIoTを使ったシステムを作成したのでメモ.

センサー

今回用いた人感センサーはRaspberry Pi スターター学習キットに入っている人感センサーを用いた.
Amazon | Raspberry Pi スターターキット

humansensor.jpg

人感センサーを2つ下図のように取り付けることで,外のセンサー -> 内のセンサーの順で反応すると人が入って来た判定をし,逆の順番だと外に出たと判定する仕組みを作成する.

sensor_position.jpg

プログラム

このRasperry Pi スタータキットのサンプルコードが公式に上がっているので,以下を参照してコードを記述した.
Raspberry Pi Starter Kit Lesson 16: Raspberry Pi and PIR Motion Sensor | osoyoo

ライブラリ

以下のライブラリをインポートする.後で,センサーが反応した後に処理を実行する際に違うプロセスで実行するためにmultiprocessingを入れている.

import RPi.GPIO as GPIO
import time
import os
import pexpect # to automatically input password for scp
import getpass
from multiprocessing import Pool

GPIOの番号設定

人感センサーの値は,GPIOの16,17番に繋いでいるので,

PIRPinIn = 17
PIRPinOut = 16

とピンの番号を取得する.

main関数

main関数の動作としては,
* 初期化
* センサーの値取得
* Ctrl + C の時のKeyBoard Interrupt処理
の3つで構成されている.

if __name__ == '__main__':
    setup() # 色々初期化
    try:
            main()
    #when 'Ctrl+C' is pressed,child program destroy() will be executed.
    except KeyboardInterrupt:
        destroy()
        pass

setup関数

GPIO.setwarning(False)でWarningを表示しないようにし,GPIO.setmode(GPIO.BCM)でRaspberry Piで指定されたGPIOの番号でピンの指定を行うようになっている.``GPIO.setup([1],[2])の[1]で先ほど定義したピンの番号を格納した変数を指定.[2]でINなら入力モード,OUTなら出力モードになる.

def setup():
    GPIO.setwarnings(False)
    #set the gpio modes to BCM numbering
    GPIO.setmode(GPIO.BCM)
    #set BuzzerPin's mode to output,and initial level to HIGH(3.3V)
    #GPIO.setup(BuzzerPin,GPIO.OUT,initial=GPIO.HIGH)
    GPIO.setup(PIRPinIn,GPIO.IN)
    GPIO.setup(PIRPinOut,GPIO.IN)
def main():

    while True:
        #read Sw520dPin's level
        if(GPIO.input(PIRPinIn)!=0):
            starttime=time.time()
            runtime = 0
            print ('********************')
            print ('*     In Sensor!     *')
            print ('********************')
            print ('\n')
            while(runtime < 3):
                runtime = time.time() - starttime
                if(GPIO.input(PIRPinOut)!=0):
                    print("=============")
                    print("    Out    ")
                    print("=============")
                    time.sleep(5)
                    setup()
                    break
            time.sleep(1)

        elif(GPIO.input(PIRPinOut)!=0):
            starttime=time.time()
            runtime = 0
            print ('*******************')
            print ('*    Out Sensor    *')
            print ('*******************')
            print('\n')
            while(runtime < 3):
                runtime = time.time() - starttime
                if(GPIO.input(PIRPinIn)!=0):
                    print("===============")
                    print("     In      ")
                    print("===============")
                    time.sleep(5)
                    break
            time.sleep(1)
        else:
            #print ('====================')
            print ('=     Not alarm...  =')
            #print ('====================')
            print ('\n')
        time.sleep(1)

プログラムのフローは下図である.
片方のセンサーが反応してから,3秒間もう片方のセンサーが反応をするのを待ち,反応したら,入室/退室判定を行う.

flow.jpg

実行結果

画像が小さいが,入り口を出ると,"In Sensor" -> "Out Sensor"の順に反応して,Out判定を行う.

demo.gif

まとめ

今回は,Raspberry Piで人感センサーで人の入退出の検出を行なった.今回は,デバイス等のリソースに制限があったので,こんな構築になりましたが,実際は,カメラ2台やRaspberry Pi2台のほうが,高精度の検出が可能な感じがします.