【ラズパイ電子工作】スイッチ押すたびにLEDの点灯/消灯を切替える方法

RPD012_【ラズパイ電子工作】スイッチ押すたびにLEDの点灯消灯を切替える方法

ラズベリーパイは基板上に「GPIO」と呼ばれる、ラズベリーパイ上で作成したプログラムから信号の入力信号の出力が行えるピンが存在します。

信号の入力とは「スイッチのON/OFF」「温度計で室温の計測」といった、ラズベリーパイの外の情報を入力(インプット)してプログラム上で使用することです。

対して、信号の出力とは「LEDを点灯させる」「モータを回す」といった、ラズベリーパイで制御した結果を外に出力(アウトプット)することです。

この記事では、ラズベリーパイのプログラム(Python)を用いてスイッチを押すたびにLEDの点灯/消灯を切替える方法について解説します。

注意
この記事中に記載されている内容はソースコード含めて電気設計人が自己流で行ったものです。一般的な方法とは相違がある可能性がありますので予めご了承ください。
メモ
Pythonで作成したプログラムは『4.プログラム(Python)』で解説しております。

他にもスイッチやLEDを用いて色々なことが可能です。基本的な内容ですが以下のページで解説しております。

RPD001_【ラズパイ電子工作】LEDを点灯させる方法(GPIO使用)【ラズパイ電子工作】LEDを点灯させる方法(GPIO使用) RPD002_【ラズパイ電子工作】スイッチのON/OFF状態を読み取る方法【ラズパイ電子工作】スイッチのON/OFF状態を読み取る方法 RPD003_【ラズパイ電子工作】LEDをチカチカ点滅させる方法(while文で無限ループ)【ラズパイ電子工作】LEDをチカチカ点滅させる方法(while文で無限ループ) RPD006_【ラズパイ電子工作】LEDをチカチカ点滅させる方法(for文で回数指定)【ラズパイ電子工作】LEDをチカチカ点滅させる方法(for文で回数指定) RPD005【ラズパイ電子工作】スイッチを押している間だけLEDを点灯させる方法(GPIO使用)【ラズパイ電子工作】スイッチを押している間だけLEDを点灯させる方法(GPIO使用) RPD020_【ラズパイ電子工作】LEDの明るさを制御する方法【ラズパイ電子工作】LEDの明るさを制御する方法

1. 完成イメージ(LEDの点灯/消灯を切替える)

この記事で完成するものは以下のようになります。

10_完成イメージ

スイッチを押すたびにLEDの点灯/消灯が切替わります。

メモ
LEDが切替わる動作を無限に繰り返します。

2. 使用する部品

今回使用する部品は以下の通りです。

ラズベリーパイ本体(モデル3B+)

20_ラズベリーパイ3B+

『Raspberry Pi 3 Model B+』を使用します。※2020年4月時点で最新はRaspberry Pi 4になります。

ブレッドボード

20_ブレッドボート

LEDや抵抗といった各種部品や(後述する)ジャンパ線などを穴に差し込み、部品間を電気的に接続する板(ボード)です。

電子工作をする上で必須の部品です。

ジャンパ線

20_ジャンパ線

ブレッドボートに差し込み、電子部品の間を電気的に接続します。

↑の写真では両側が「ピン」になっており、ブレッドボートの穴に差し込んで使用します。

LED(発光ダイオード)

20_LED

日常生活でも馴染みがある方も多いLEDは「Light emitting diode」の略で、発光ダイオードと呼ばれています。

電子工作で頻繁に使用するLEDは極性があり、プラスとマイナスを逆に接続しても光りません。プラス側をアノード(Anode)、マイナス側をカソード(Cathode)とも呼びます。

今回は赤色を使用します。

メモ
LEDの足が長い方がプラス側(アノード)、マイナス側(カソード)です。逆に接続しないように注意してください。

カーボン抵抗器

20_抵抗器

LEDなど電子部品は適した電圧と電流が決められており、それ以上の電流を流してしまうと壊れてしまう場合があります。

抵抗は電流の流れを抑えることで、部品に流れる電流を抑える役割を担います。

今回は220Ω(オーム)の抵抗器を使用します。

タクトスイッチ

20_タクトスイッチ

スイッチを押すと、内部の回路が繋がり電流を流します。

↑のタクトスイッチの場合、黒い部分を指などで押します。

メモ
電気的に繋がっている状態を「導通している」と表現することもあります。

オススメの電子工作セット

電子工作をするため、これまで解説した部品の他にもスイッチやセンサなど、色々な部品が必要になってきます。個々で購入するには手間がかかるため、最初はセット品を購入することをおススメします。

電気設計人
電気設計人

私は以下のセット品を購入しました!

また、これからラズベリーパイを購入する場合、ラズベリーパイ本体を含めたセット品を購入することをおススメします。

ラズベリーパイ本体を収めるケースや、OSをインストールするためmicroSDカードなど必要なものを個々に購入する手間を省くことができます。

3. 回路図・配線の様子

ラズベリーパイのプログラム(Python)を用いてスイッチを押すたびにLEDの点灯/消灯を切替える回路を解説します。

回路図

回路図は以下のようになります。

30_回路図

ラズベリーパイの3.3Vをタクトスイッチの片側に接続します。(赤色のジャンパ線)

「GPIO 23番ポート」とタクトスイッチのもう一方に接続します。(白色のジャンパ線)

「GPIO 25番ポート」と赤LEDのプラス側(アノード)を接続します。(オレンジ色のジャンパ線)

LEDのマイナス側(カソード)と抵抗(220Ω)を接続して、抵抗とGNDを接続します。(黒色のジャンパ線)

メモ
抵抗器に極性はありませんので、プラスとマイナスは気にしなくてOKです。

配線の様子

配線の様子です。こんな感じになりました。

31_配線の様子

↑では、フラットケーブルでGPIOの全ピンをブレッドボードに接続しています。回路図と実際の配線は異なる部分がありますがご了承ください。

※電気的には「回路図」と同じ意味です。

4. プログラム(Python)

スイッチを押すたびにLEDの点灯/消灯を切替えるプログラム(Python)は以下のようになります。

ソースコード

#必要なモジュールをインポート
import RPi.GPIO as GPIO             #GPIO用のモジュールをインポート
import time                         #時間制御用のモジュールをインポート
import sys                          #sysモジュールをインポート

#ポート番号の定義
Sw_pin = 23                         #変数"Sw_pin"に23を代入
Led_pin = 25                        #変数"Led_pin"に25を代入

#初期化処理
Status = 0                          #変数"Status"に0を代入

#GPIOの設定
GPIO.setmode(GPIO.BCM)              #GPIOのモードを"GPIO.BCM"に設定
#GPIO23を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Led_pin, GPIO.OUT)       #GPIO25を出力モードに設定

#while文で無限ループ
while True:
    try:
        if(Status == 1):
            GPIO.output(Led_pin, GPIO.HIGH)     #GPIO25の出力をHigh(3.3V)にする
            Status = 0                          #変数"Status"に0を代入
        else:
            GPIO.output(Led_pin, GPIO.LOW)      #GPIO25の出力をLow(0V)にする
            Status = 1                          #変数"Status"に1を代入
        time.sleep(1)                           #1秒間待つ
        while(GPIO.input(Sw_pin) == 0):
            time.sleep(0.1)                     #0.1秒間待つ

    except KeyboardInterrupt:                   #Ctrl+Cキーが押された
        GPIO.cleanup()                          #GPIOをクリーンアップ
        sys.exit()                              #プログラムを終了

while文を用いて、GPIO 25番ポートの電圧をHigh(3.3V)にしてLEDを点灯、Low(0V)にしてLEDを消灯します。変数”Status”を設け、その値によってLEDをどちらの状態にするかif文で判断します。

プログラムの解説

#必要なモジュールをインポート
import RPi.GPIO as GPIO             #GPIO用のモジュールをインポート
import time                         #時間制御用のモジュールをインポート
import sys                          #sysモジュールをインポート

2行目~4行目で、今回必要な「モジュール」を宣言します。


#ポート番号の定義
Sw_pin = 23                         #変数"Sw_pin"に23を代入
Led_pin = 25                        #変数"Led_pin"に25を代入

以下のようにそれぞれの変数に数値を代入します。この数値はGPIOのポート番号として扱い、後からポート番号を変更する場合はこの数値を変更します。

Sw_pin:変数”23”を代入(タクトスイッチ用)
Led_pin:変数”25”を代入(LED用)

#初期化処理
Status = 0                          #変数"Status"に0を代入

初期化する処理を行います。

変数”Status”に数値0を代入します。この変数は後ほどLED点灯/消灯を切替えるために使用します。


#GPIOの設定
GPIO.setmode(GPIO.BCM)              #GPIOのモードを"GPIO.BCM"に設定
#GPIO23を入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Led_pin, GPIO.OUT)       #GPIO25を出力モードに設定

GPIOの設定を行います。

GPIO.setmode(GPIO.BCM)は、GPIOをポート番号で扱う方法に設定します。

GPIO.setup(Sw_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)は、GPIO23番ポートを入力モードに設定を行い、内部にあるプルダウン抵抗を有効にします。

GPIO.setup(Led_pin, GPIO.OUT)は、GPIO 25番ポートを出力モードに設定します。


#while文で無限ループ
while True:
    try:
        if(Status == 1):
            GPIO.output(Led_pin, GPIO.HIGH)     #GPIO25の出力をHigh(3.3V)にする
            Status = 0                          #変数"Status"に0を代入
        else:
            GPIO.output(Led_pin, GPIO.LOW)      #GPIO25の出力をLow(0V)にする
            Status = 1                          #変数"Status"に1を代入
        time.sleep(1)                           #1秒間待つ
        while(GPIO.input(Sw_pin) == 0):
            time.sleep(0.1)                     #0.1秒間待つ

    except KeyboardInterrupt:                   #Ctrl+Cキーが押された
        GPIO.cleanup()                          #GPIOをクリーンアップ
        sys.exit()                              #プログラムを終了

「while文」は条件を指定して、その条件が真の時に繰り返し処理を行うものです。

Python
while 条件式:
    繰り返し処理を行うコード

↑の「条件式」にTrueを指定することにより、条件式は常に真となりwhile文は無限に繰り返します。

メモ
無限に繰り返すことを、無限ループと表現したりします。

ただし、このままではプログラム実行中に無限ループから抜け出す方法がありません。そこでwhile文の中にある「try文」と「except文」を使用します。

このtry-except文を用いることにより、while文の処理は以下のようになります。

Python
while True:
    try:
        繰り返し処理を行うコード
    except KeyboardInterrupt:               #Ctrl+Cキーが押された
        GPIO.cleanup()                      #GPIOをクリーンアップ
        sys.exit()                          #プログラムを終了

except KeyboardInterrupt:は、キーボードのCtrl + Cキーが押された時にwhile文の繰り返し処理から抜けて「GPIOのクリーンアップ」と「プログラムの終了」の処理を行います。

Ctrl + Cキーが押されていないとき、try:文の中の処理を繰り返し行います。(以下で解説)


while文の中の「繰り返し処理を行うコード」は以下の通りです。つまり、Ctrl + Cキーが押されるまで以下の処理を繰り返します。

    if(Status == 1):
        GPIO.output(Led_pin, GPIO.HIGH)     #GPIO25の出力をHigh(3.3V)にする
        Status = 0                          #変数"Status"に0を代入
    else:
        GPIO.output(Led_pin, GPIO.LOW)      #GPIO25の出力をLow(0V)にする
        Status = 1                          #変数"Status"に1を代入
    time.sleep(1)                           #1秒間待つ
    while(GPIO.input(Sw_pin) == 0):
        time.sleep(0.1)                     #0.1秒間待つ

「if文」を使用して、変数”Status”が1であるか判断します。

Python
if 条件式:
    条件式が"真"の時に実行するコード
else:
    条件式が"偽"の時に実行するコード

先ほど初期化処理(11行目)で変数”Status”に0を代入したので、初回は条件式は”偽”となりelse文の処理を行います。

“真”の時に実行するGPIO.output(Led_pin, GPIO.HIGH)はGPIO 25番ポートの出力をHigh(3.3V)にします。ここでLEDは点灯します。

“偽”の時に実行するGPIO.output(Led_pin, GPIO.LOW)はGPIO 25番ポートの出力をLow(0V)にします。ここでLEDは消灯します。

while(GPIO.input(Sw_pin) == 0):はスイッチが押されていない間、ループして処理をせずに待ちます。

5. おわりに

ラズベリーパイのプログラム(Python)を用いてスイッチを押すたびにLEDの点灯/消灯を切替える方法について解説しました。

まだまだラズベリーパイ初心者の私ですが、以下の参考書が大変参考にさせて頂いております。

2冊とも初学者にも易しい内容になっており、ゼロからラズベリーパイを始める方にもオススメできる参考書です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です