TOPに戻る

gpiozeroライブラリ入門⑲import MotionSensor

 使用環境
  • Raspberry Pi Raspberry Pi 4 Model B 2MB
  • OS Raspberry Pi OS(32ビット)5.10.17
  • Python3 3.7.3
  • gpiozeroライブラリ 1.5.1
  • エディタ Mu

 gpiozeroパッケージの基底クラスInput Devicesは、入力デバイスやセンサ用です。

MotionSensor

class gpiozero.MotionSensor(pin, *, queue_len=1, sample_rate=10, threshold=0.5, partial=False, pin_factory=None)

 パッシブ赤外線(PIR)モーション・センサは、日本では焦電型赤外線センサとか人感センサと呼ばれている。 一般的なPIRデバイスには、VCC、OUT、およびGNDの三つのピンを備えた小さな回路基板があり、センサの上面にレンズがついている。 VCCは5V(3.3V)ピンに接続し、GNDはグランド・ピンの一つに接続し、最後にOUTをコンストラクタのピンパラメータの値として指定されたGPIOに接続する。

 アマゾンから入手したのは、次のセンサです。

Ren He HC-SR501人体赤外線感応モジュール モジュール焦電型赤外線検出器PIRモーション 人体の赤外線の感応器 人感センサースイッチ ボディセンサーモジュール 3個

パラメータ;

pin (int or str)

 センサが接続されているGPIOピン。

pull_up (bool or None)

 True(デフォルト)の場合、GPIOピンはデフォルトでHighにプルアップされる。この場合、センサの反対側をアースに接続する。Falseの場合、GPIOピンはデフォルトでLowにプルダウンされる。この場合、センサの反対側を3V3に接続する。Noneの場合、ピンはフローティングになるため、外部でプルアップまたはプルダウンし、active_stateに応じてパラメータを設定する。

active_state(bool or None)

 Trueの場合、ハードウェア・ピンの状態がHigh場合、ソフトウェア・ピンはHigh。Falseの場合、入力極性が逆になる。ハードウェア・ピンの状態がHighの場合、ソフトウェア・ピンの状態はLow。このパラメータを使用して、プルアップされていないものとして構成する場合(pull_upがNoneの場合)に、基になるピンのアクティブ状態を設定する。 pull_upがTrueまたはFalseのとき、アクティブ状態を自動的に適切な値に設定される。

queue_len (int)

 センサから読み取られた値を格納するために使用されるキューの長さ。デフォルトは1。モーション・センサが特に「ぴくぴく」している場合は、この値を大きくする。

sample_rate (float)

 1秒あたりにデバイスから読み取る(および内部キューに追加する)値の数。デフォルトは10。

threshold (float)

 しきい値のデフォルトは0.5。内部キュー内のすべての値の平均がこの値を超えると、センサはis_activeプロパティによって「アクティブ」と見なされ、適切なすべてのイベントが発生する。

partial (bool)

 False(デフォルト)の場合、内部キューが値でいっぱいになるまで、オブジェクトはis_activeの値を返さない。オブジェクト構築の直後に値が必要な場合にのみ、これをTrueに設定する。

pin_factory(factoryまたはNone)

 詳細については、API –ピンを参照(これは、ほとんどのユーザが無視できる高度な機能)

wait_for_motion(timeout=None)

 デバイスが非アクティブ化されるか、タイムアウトに達するまで、スクリプトを一時停止する。

パラメータ: timeout(floatまたはNone)–続行する前に待機する秒数。これがNone(デフォルト)の場合 、デバイスがアクティブになるまで無期限に待機する。

wait_for_no_motion(timeout=None)

 デバイスがアクティブ化されるか、タイムアウトに達するまで、スクリプトを一時停止する。

パラメータ: timeout(floatまたはNone)–続行する前に待機する秒数。これがNone(デフォルト)の場合 、デバイスが非アクティブになるまで無期限に待機する。

pin

 デバイスが接続されているピン。 デバイスが閉じられている場合、これはNoneになる(close()メソッドを参照)。 GPIOピンを処理するときは、pin.numberを照会して、デバイスが接続されているGPIOピン(BCM番号付け)を見つける。

value

 デフォルトのqueue_lenが1の場合、これは事実上ブール値であり、0はモーションが検出されないことを意味し、1はモーションが検出されることを意味する。 1より大きいqueue_lenを指定すると、これは平均値になり、1に近い値はモーション検出を意味する

when_motion

 デバイスの状態がアクティブから非アクティブに変化したときに実行される関数。 これは、(必須)パラメータを受け入れない関数、または単一の必須パラメータ(必要な数のオプションのパラメータを含む)を受け入れるPython関数に設定できる。 関数が単一の必須パラメータを受け入れる場合、非アクティブ化されたデバイスがそのパラメータとして渡される。
 イベントを無効にするには、このプロパティをNone(デフォルト)に設定する。

when_no_motion

 デバイスの状態が非アクティブからアクティブに変化したときに実行される関数。 これは、(必須)パラメータを受け入れない関数、または単一の必須パラメータ(必要な数のオプションのパラメータを含む)を受け入れるPython関数に設定できる。 関数が単一の必須パラメータを受け入れる場合、それをアクティブにしたデバイスはそのパラメータとして渡される。
 イベントを無効にするには、このプロパティをNone(デフォルト)に設定する。

 

配線

 GPIO4に信号のOUT端子、隣のGNDにGND端子、3.3VにVcc端子をつなぎました。

 データシートによると、動作電圧は、4.5~20Vです。Vcc端子をラズパイの5Vにつなぐと出力端子には3.5Vが、Vcc端子をラズパイの3.3Vにつなぐと出力端子には2.8Vがでました。GPIOの電圧は最大3.3V*1.05とすれば3.465Vなので、多分壊れないと思いますが、高めです。なので、Vcc端子には3.3V電源を使います。

プログラム

 サンプルを動かします。


from gpiozero import MotionSensor

pir = MotionSensor(4)
pir.wait_for_motion()
print("Motion detected!")

 実行例です。

when_motion


from gpiozero import MotionSensor
from signal import pause
import time

print("Motion detected!")


def detected():
    a = 'Motion detected'
    print(a)

sensor = MotionSensor(4)

sensor.when_motion = detected

while 1:
    print('.')
    time.sleep(0.1)
pause()

  実行例です。while文で'.'を印字しています。センサの前を手が横切ると、Motion detectedと表示します。

連載 gpiozeroライブラリ入門

- OutputDevice -

(1) LED その1 (2) LED その2 (3) PWMLED (4) RGBLED

(5) Buzzer (6) TonalBuzzer

(7) Motor その1 BD65496 (8) その2 TB67H420FTG (9) その3 TB6612 (10) その4 MC33926 (11) PhaseEnableMotor DRV8835

(12) Servo (13) AngularServo

- SPI Device -

(14) 10ビットA-DコンバータMCP3001/MCP3002/MCP3004/MCP3008

(15) 12ビットA-DコンバータMCP3201/MCP3202/MCP3204/MCP3208

(16) 13ビットA-DコンバータMCP3301/MCP3302/MCP3304

- InputDevice -

(17) Button

(18) LineSensor

(19) MotionSensor