ラズパイでLED点灯のプログラム、タクトスイッチをトグルにする | そう備忘録

ラズパイでLED点灯のプログラム、タクトスイッチをトグルにする

トグルとは

Raspberry PiとLEDとタクトスイッチでLEDの点灯を制御するプログラムの4回目。

前回までの記事ではタクトスイッチを押した時にLED点灯、離したら消灯という動作だったがこの操作だとLEDを点灯させる為にはずっとタクトスイッチを押し続けていなければならない。

今回はタクトスイッチをトグルにしてみる。

トグルとは2つの状態が交互に現れる状態を表しており、

  1. スイッチを押して離したら点灯
  2. 次にまたスイッチを押して離したら消灯

上記の1.と2.が交互に現れるようにプログラミングをする。

参考にした書籍

参考した書籍はいつもの「Raspberry Piで学ぶ電子工作」金丸隆志さんの書籍だ。

自分が持っているのはRaspberry Pi 3+で書籍もRaspberry Pi 3+内容だ。

今ラズパイを購入するのならRaspberry Pi 4だと思うが今回の回路図では3と4の違いはない。

一応Raspberry Pi 4対応の書籍も出版されているの紹介しておく。

回路図

回路図は以前の「タクトスイッチによるLEDの点灯」と同様でブレッドボード上に10kΩの抵抗は配置せずにラズパイ内部のプルダウン抵抗を使用する。

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のアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。