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()