gpiozeroライブラリ入門⑲import MotionSensor
使用環境
|
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 –ピンを参照(これは、ほとんどのユーザが無視できる高度な機能)
|
●配線
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と表示します。