TOPに戻る

gpiozeroライブラリ入門⑰import Button

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

Button

class gpiozero.Button(pin, *, pull_up=True, active_state=None, bounce_time=None, hold_time=1, hold_repeat=False, pin_factory=None)

 ボタンの一方の側をアース・ピンに接続し、もう一方の側を任意のGPIOピンに接続する。または、ボタンの一方の側を3V3ピンに接続し、もう一方の側を任意のGPIOピンに接続しButtonコンストラクタでpull_upをFalseに設定する。

pin(intまたはstr)

 ボタンが接続されているGPIOピン。

pull_up(boolまたはNone)

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

active_state(boolまたはNone)

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

bounce_time(floatまたはNone)

 None(デフォルト)の場合、ソフトウェア・バウンス補正は実行されない。それ以外の場合、これは、コンポーネントが最初の変更後の状態の変更を無視する時間の長さ(秒単位)。

hold_time(float)

 ボタンが押されてからwhen_heldハンドラが実行されるまで待機する時間の長さ(秒単位)。デフォルトは1。

hold_repeat(bool)

 Trueの場合、when_heldデバイスがアクティブである限り、hold_time 秒ごとにハンドラが繰り返し実行される。False(デフォルト)の場合、when_heldハンドラはホールドごとに1回だけ実行される。

pin_factory(factoryまたはNone)

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

wait_for_press(timeout=None)

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

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

wait_for_release(timeout=None)

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

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

held_time

 デバイスが保持されている時間の長さ(秒単位)。これは、デバイスがアクティブ化されたときではなく、active_timeとは対照的にwhen_heldイベントの最初の実行からカウントされる。デバイスが現在保持されていない場合はNone。

hold_repeat

 Trueの場合、when_heldは、各呼び出しの間にhold_time秒を使用して繰り返し実行される。

hold_time

 デバイスがアクティブ化されてからwhen_heldハンドラが実行されるまで待機する時間の長さ(秒単位)。 hold_repeatがTrueの場合、これはwhen_heldの呼び出し間の時間の長さでもある。

is_held

 Trueの場合、デバイスは少なくともhold_time秒間、アクティブになっている。

is_pressed

 デバイスが現在アクティブな場合はTrueを返し、それ以外の場合はFalseを返す。 このプロパティは通常、 valueから派生する。 valueとは異なり、これは常にブール値。

pin

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

pull_up

 Trueの場合、デバイスはプルアップ抵抗を使用してGPIOピンをデフォルトでHighに設定する。

value

 ボタンが現在押されている場合は1を返し、押されていない場合は0を返す。

when_held

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

when_pressed

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

when_released

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

 

配線

 GPIO4と隣のGND間にスイッチをつなぎました。1.8kΩを直列に入れてあります。

プログラム

 wait_for_press()は、ずっとボタンが押されるのを待っています。ほかに何もしません。


from gpiozero import Button

button = Button(4)

while 1:
    print('.')
    button.wait_for_press()
    print("The button was pressed!")

 実行例です。

 ボタンが押されたらメッセージを出すように変更しました。


from gpiozero import Button
import time

button = Button(4)

while 1:
    print('.')
    if button.value:
        print("The button was pressed!")
    time.sleep(0.1)

 実行例です。valueはis_pressedでも同様に動作しました。

when_pressed

 ボタンが押されたイベントにコールバック関数hello()を割り当てます。


from gpiozero import Button
from signal import pause

def hello():
    print("Hello")

button = Button(4, bounce_time=0.05)
button.when_pressed = hello

pause()

 ボタンを押すと、Helloと表示します。pause()がないと終了してしまいます。

短く押したときと長く押したときを判別

 ボタンを軽く押したときは、「button was pressed just a bit」、3秒以上長押ししたときは、「button was over 3 seconds held」を表示します。


from gpiozero import Button
from signal import pause

Button.was_held = False

def held(btn):
    btn.was_held = True
    print("button was over 3 seconds held")

def released(btn):
    if not btn.was_held:
        pressed()
    btn.was_held = False

def pressed():
    print("button was pressed just a bit")

btn = Button(4, hold_time=3, bounce_time=0.05)

btn.when_held = held
btn.when_released = released

pause()

(参考)https://gpiozero.readthedocs.io/en/stable/faq.html

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