TOPに戻る

gpiozeroライブラリ入門⑱import LineSensor

 使用環境
  • 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は、入力デバイスやセンサ用です。

LineSensor

class gpiozero.LineSensor(pin, *, queue_len=5, sample_rate=100, threshold=0.5, partial=False, pin_factory=None)

 一般的なライン・センサは、VCC、GNDおよびOUTの三つのピンを備えている。 VCCは3V3ピンに接続し、GNDはグラウンド・ピンの一つに接続し、最後にOUTをコンストラクタのピン・パラメータの値として指定されたGPIOに接続する。 

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)

 センサから読み取られた値を格納するために使用されるキューの長さ。デフォルトは5。

sample_rate (float)

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

threshold (float)

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

(※)入手した二つのライン・センサ(TCRT5000 infra-red proximity sensor をキーに検索して探した)は、どちらも、反射物がデフォルト3cmより近づくとONになった。

  こちらのボードでは出力をD0ににした。A0の機能は不明。

partial (bool)

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

pin_factory(factoryまたはNone)

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

wait_for_line(timeout=None)

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

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

wait_for_no_line(timeout=None)

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

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

pin

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

value

 キューに入れられた値の平均を表す値を返す。 これは、センサの下が黒の場合は0に近く、センサの下が白の場合は1に近くになる。

when_line

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

when_no_line

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

 

配線

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

プログラム

 サンプルを動かします。


from gpiozero import LineSensor
from signal import pause

sensor = LineSensor(4)
sensor.when_line = lambda: print('Line detected')
sensor.when_no_line = lambda: print('No line detected')

pause()

 普通のdef文に書き換えました。


from gpiozero import LineSensor
from signal import pause

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

def nodetected():
    b = 'Line no detected'
    print(b)

sensor = LineSensor(4)

sensor.when_line = detected
sensor.when_no_line = nodetected

pause()

 threshold=0.1や0.8に設定しましたが、変化は見られませんでした。


from gpiozero import LineSensor
import time

sensor = LineSensor(4, threshold=0.8)
while 1:
    print(sensor.value)
    time.sleep(0.1)

 結果は、1もしくは0が返ってきました。白や黒とは関係ないようです。

連載 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