大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

ラズパイでスイッチを使おう(2)

著者:國松亜紗子
公開日:2019/05/30
最終更新日:2019/05/30
カテゴリー:技術情報

こんばんは。國松です。

今回は、イベントを利用してスイッチを制御してLEDをOn/Offしていきたいと思います。

用意するもの

・Raspberry Pi 3 Model B+

・ブレッドボード

・330Ωの抵抗×1

・LED×1

・タクトスイッチ×1

・ジャンパワイヤ×4

(ラズパイとの接続)

イベントによるLEDのOn/Off

前回はwhile文でスイッチの状態を監視していましたが今回はRPi.GPIOのイベント機能を使っていきたいと思います。イベントを使えば値が変化したときだけ指定した処理(関数)を実行できます。

イベントを検知する関数

add_event_detect(

    ポート番号,

  イベントの種類,

  callback = イベント発生時に実行する関数,

  bouncetime = ミリ秒で指定

)

イベントの種類に指定できる値は以下の3つです。

GPIO.RISINGポートの値がLOWからHIGHに変化したとき(ポジティブエッジ)
GPIO.FALLINGポートの値がHIGHからLOWに変化したとき(ネガティブエッジ)
GPIO.BOTHポートの値が変化したとき

bouncetimeはチャタリング防止のため指定した時間(ミリ秒)以内には連続でイベントが発生しないようにできます。

参考書籍&サイト

.やさしくはじめるラズベリー・パイ 電子工作でガジェット&簡易ロボットを作ってみよう【クジラ飛行机(著)】

Raspberry PiのGPIOをpythonから利用する

#ライブラリのインポート
import RPi.GPIO as GPIO
import time

#ポート番号の定義
SWITCH = 18
LED = 21
led_value = GPIO.LOW


#GPIOの初期化
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED,GPIO.OUT)
GPIO.setup(SWITCH,GPIO.IN, pull_up_down = GPIO.PUD_DOWN) #ラズパイの内部抵抗(プルダウン)を利用

#swith切り替えイベントの定義
def switch_change_callback(ch):
    global led_value
    if ch != SWITCH: return
    if led_value == GPIO.LOW:
        GPIO.output(LED,GPIO.HIGH)
        led_value = GPIO.HIGH
    else:
        GPIO.output(LED, GPIO.LOW)
        led_value = GPIO.LOW

#イベントの設定
GPIO.add_event_detect(
    SWITCH,
    GPIO.RISING, 
    callback=switch_change_callback,
    bouncetime= 200)

#LEDの消灯
GPIO.output(LED, GPIO.LOW)

try:
    while True:
        time.sleep(0.1)
except KeyboardInterrupt:
    GPIO.cleanup()

try:
    while True:
        GPIO.output(LED,GPIO.LOW)
        time.sleep(0.1)
except KeyboardInterrupt:
    GPIO.cleanup()

スイッチが押されるとLEDが点灯してもう一度押されるとLEDが消灯します。ラズパイの内部抵抗を利用しているのでスイッチに抵抗はなくても大丈夫です。

LEDを点灯させるのにスイッチを押し続ける仕事から解放されました。

 

    上に戻る