Raspberry Pi 3のGPIOのエッジ検出を、Python言語のライブラリ「RPi.GPIO」を使用して、コールバック関数で処理します。このコールバック関数は、別スレッドで処理され、コールバック関数を呼び出すスレッドは単一のため、各コールバック関数は同時ではなく順次呼び出されます。
GPIOエッジ検出コールバック関数
GPIOエッジ検出コールバック関数を使用したプログラム「gpiodemo.py」を次に示します。
- setmode
- チャンネルモードを指定します・
BOARD:P1から始まるボード上の物理的なピン番号をチャンネルとして扱います。
BCM:チップから見たGPIOピンの番号(GPIO12など)をチャンネルとして扱います。 - setup
- チャンネルを設定します。
GPIO.IN または GPIO.OUT
そのほか、initialで初期値、pull_up_downでGPIOのプルアップ抵抗、プルダウン抵抗を指定できます - add_event_detect
- イベント検知を可能にします。立ち上がりエッジはGPIO.RISING、立ち下がりエッジはGPIO.FALLING、両方の場合はGPIO.BOTHで、検出をしたらcallbackで指定されたコールバック関数を呼び出します。bouncetimeでは、チャタリング防止のため、イベントを検出すると、指定時間(単位:ミリ秒)は次のイベントを呼び出さないように制御しています。
- remove_event_detect
- イベント検知を解除します。
- cleanup
- スクリプト終了時の後始末を行います。これを忘れると再度スクリプト実行したときに失敗します。
上記メソッドを使用して次のプログラムを作成します。
# -*- coding: utf-8 -*- import time import RPi.GPIO as GPIO def event_callback(gpio_pin): print "GPIO[ %d ]のコールバックが発生しました" % gpio_pin GPIO.setmode(GPIO.BCM) GPIO.setup(14, GPIO.IN) GPIO.add_event_detect(14, GPIO.RISING, callback=event_callback, bouncetime=200) try: while True: time.sleep(1) except KeyboardInterrupt: print '\nbreak' GPIO.remove_event_detect(14) GPIO.cleanup()
KeyboardInterruptは、ユーザが割り込みキー (通常は Control-C または Delete) を押した場合に送出されます。実行中、割り込みは定期的に監視されます。ここでは、Deleteキーによりプログラムを終了させます。
作成したプログラム「gpiodemo.py」を実行すると次のように表示されます。
$ python gpiodemo.py GPIO[ 14 ]のコールバックが発生しました
アナログ出力
アナログ出力では周波数とデューティ比を指定して、モータ制御などに使うPWM制御ができます。Raspberry Pi 3では、GPIO18がPWMとして使用できます。
まずピンに対して周波数を設定してpwmオブジェクトを取得します。
pwm = GPIO.PWM([チャンネル], [周波数(Hz)])
次にpwmオブジェクトに対してデューティ比を指定して出力を開始します。
pwm.start([デューティ比])
例えば、ピン18に周波数1KHz、デューティ比50%でPWM出力する場合は以下のように書きます。
pwm = GPIO.PWM(18, 1000) pwm.start(50)
途中で周波数を変更する場合は以下の関数を使用します。
pwm.ChangeFrequency([周波数(Hz)])
途中でデューティ比を変更する場合は以下の関数を使用します。
pwm.ChangeDutyCycle([デューティ比])
PWM出力を停止する場合は以下の関数を実行します。
pwm.stop()