ラズパイでLED点灯のプログラム、タクトスイッチをトグルにする
Contents
トグルとは
Raspberry PiとLEDとタクトスイッチでLEDの点灯を制御するプログラムの4回目。
前回までの記事ではタクトスイッチを押した時にLED点灯、離したら消灯という動作だったがこの操作だとLEDを点灯させる為にはずっとタクトスイッチを押し続けていなければならない。
今回はタクトスイッチをトグルにしてみる。
トグルとは2つの状態が交互に現れる状態を表しており、
- スイッチを押して離したら点灯
- 次にまたスイッチを押して離したら消灯
上記の1.と2.が交互に現れるようにプログラミングをする。
参考にした書籍
参考した書籍はいつもの「Raspberry Piで学ぶ電子工作」金丸隆志さんの書籍だ。
自分が持っているのはRaspberry Pi 3+で書籍もRaspberry Pi 3+内容だ。
今ラズパイを購入するのならRaspberry Pi 4だと思うが今回の回路図では3と4の違いはない。
一応Raspberry Pi 4対応の書籍も出版されているの紹介しておく。
回路図
回路図は以前の「タクトスイッチによるLEDの点灯」と同様でブレッドボード上に10kΩの抵抗は配置せずにラズパイ内部のプルダウン抵抗を使用する。
プログラム
ソースコード
タクトスイッチがトグルになるプログラムは以下の通り。
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 6 20:21:55 2020
@author: Souichirou Kikuchi
"""
import RPi.GPIO as GPIO
from time import sleep
LED_GPIO = 4 # LEDに接続するGPIO番号
TACT_GPIO = 17 # Tack Switchに接続するGPIO番号
def toggle_switch(channel):
global ledState # Global変数
if channel == TACT_GPIO:
ledState = not ledState # 現在のledStateを反転させる
if ledState == GPIO.HIGH:
GPIO.output(LED_GPIO, GPIO.HIGH)
else:
GPIO.output(LED_GPIO, GPIO.LOW)
GPIO.setmode(GPIO.BCM)
GPIO.setup(LED_GPIO, GPIO.OUT, initial=GPIO.LOW) # 初期状態はLOW
GPIO.setup(TACT_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(TACT_GPIO, GPIO.RISING, callback=toggle_switch, bouncetime=200) # GPIOがRIGINB(LOW→HIGH)の時にtoggle_switchを呼び出して200ミリ秒は間隔をあける
ledState = GPIO.LOW
try:
print('--- start program ---')
while True:
sleep(0.01)
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
print('--- stop program ---')
補足説明
callback関数
ポイントは26行目のadd_event_detectでcallback関数としてtoggle_switchを指定している。
タイミングにはGPIO.RISINGが指定されており、RISINGとはGPIOがLOWからHIGHに変わる瞬間、つまりタクトスイッチが押された瞬間にtoggle_switch関数が呼び出される。
逆にHIGHからLOWに変わる瞬間を指定したい場合はGPIO.FALLINGとなり、これはタクトスイッチが押された状態から元に戻る瞬間となる。
またその際にbouncetime=200を指定しているが、これはGPIOの電圧がLOWからHIGHには一直線には上がらずに波をうちながら上昇するので電圧の上昇をトリガー(きっかけ)にすると何回もtoggle_switch関数が呼び出されてしまう。
上記の誤動作を防ぐためにLOWからHIGHになった瞬間から200ミリ秒間は次のイベントを受け付けないようにしている。
toggle_switch関数
14~21行目はタクトスイッチが押された瞬間に呼び出される関数。
15行目にグローバル変数としてledStateを指定しているがこの変数は関数外でも値を設定されるので(初期処理でLOWにしている)グローバル変数として定義している。
関数内でやっていることはHIGHとLOWをトグルで切り替えてLEGのGPIOを制御している。
以上で今回の記事は終了とする。
この記事が何処かで誰かの役に立つことを願っている。
尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。
最近のコメント