ラズベリーパイは基板上に「GPIO」と呼ばれる、ラズベリーパイ上で作成したプログラムから信号の入力・信号の出力といった制御をすることができるピンが存在します。
信号の入力とは「スイッチのON/OFF」「温度計で室温の計測」といった、ラズベリーパイの外の情報を入力(インプット)してプログラム上で使用することです。
対して、信号の出力とは「LEDを点灯させる」「モータを回す」といった、ラズベリーパイで制御した結果を外に出力(アウトプット)することです。
この記事では、ラズベリーパイのプログラム(Python)からGPIOピンを用いてRGB(フルカラー)LEDの各色(赤・緑・青)をスイッチで制御する方法について解説します。
RGB(フルカラー)LEDの各色(赤・緑・青)を繰り返し点滅させる方法については以下で解説しておりますので、宜しければご覧ください。
【ラズパイ電子工作】RGB(フルカラー)LEDを点灯させる方法目次
1. 完成イメージ(RGB(フルカラー)LEDの各色を制御する)
この記事で完成するものは以下のようになります。
ラズベリーパイのGPIOピンをブレッドボードに接続して、プログラム(Python)からRGB(フルカラー)LEDの各色(赤・緑・青)を同色のスイッチが押されている間だけ点灯させます。
2. 使用する部品
今回使用する部品は以下の通りです。
『Raspberry Pi 3 Model B+』を使用します。※2020年4月時点で最新はRaspberry Pi 4になります。
LEDや抵抗といった各種部品や(後述する)ジャンパ線などを穴に差し込み、部品間を電気的に接続する板(ボード)です。
電子工作をする上で必須の部品です。
ブレッドボートに差し込み、電子部品の間を電気的に接続します。
↑の写真では両側が「ピン」になっており、ブレッドボートの穴に差し込んで使用します。
RGB(フルカラー)LEDは、素子内部に赤(Red)・緑(Green)・青(Blue)のLEDが内蔵されているLED(発光ダイオード)です。
今回使用するRGB(フルカラー)LEDの型式はWP154A4SEJ3VBDZGW/CAです。このRGB(フルカラー)LEDはピンが4本あり、一番長いピンがコモン(共通)のマイナス側で、他の3本のピンに赤・緑・青を接続します。
LEDなど電子部品は適した電圧と電流が決められており、それ以上の電流を流してしまうと壊れてしまう場合があります。
抵抗は電流の流れを抑えることで、部品に流れる電流を抑える役割を担います。
今回は220Ω(オーム)の抵抗器を使用します。
スイッチを押すと、内部の回路が繋がり電流を流します。
今回はRGB(フルカラー)LEDと合わせて赤・緑・青色のスイッチを使用します。
電子工作をするため、これまで解説した部品の他にもスイッチやセンサなど、色々な部品が必要になってきます。個々で購入するには手間がかかるため、最初はセット品を購入することをおススメします。
私は以下のセット品を購入しました!
また、これからラズベリーパイを購入する場合、ラズベリーパイ本体を含めたセット品を購入することをおススメします。
ラズベリーパイ本体を収めるケースや、OSをインストールするためmicroSDカードなど必要なものを個々に購入する手間を省くことができます。
3. 回路図・配線の様子
ラズベリーパイのプログラム(Python)からGPIOピンを用いてRGB(フルカラー)LEDの各色(赤・緑・青)をスイッチで制御する回路を解説します。
回路図は以下のようになります。
RGB(フルカラー)LEDの赤のピンと抵抗(220Ω)を接続して、ラズベリーパイのGPIO 22番ポートを接続します。(オレンジ色のジャンパ線)
RGB(フルカラー)LEDの緑のピンと抵抗(220Ω)を接続して、ラズベリーパイのGPIO 12番ポートを接続します。(黄色のジャンパ線)
RGB(フルカラー)LEDの青のピンと抵抗(220Ω)を接続して、ラズベリーパイのGPIO 23番ポートを接続します。(青色のジャンパ線)
RGB(フルカラー)LEDのカソードのピンと、ラズベリーパイのGNDを接続します。(黒色のジャンパ線)
赤色スイッチの片側とGPIO 19番ポートを接続します。(赤色のジャンパ線)
緑色スイッチの片側とGPIO 18番ポートを接続します。(緑色のジャンパ線)
青色スイッチの片側とGPIO 25番ポートを接続します。(青色のジャンパ線)
各スイッチのもう片側は3.3Vに接続します。(白色のジャンパ線)
配線の様子です。こんな感じになりました。
↑では、フラットケーブルでGPIOの全ピンをブレッドボードに接続しています。回路図と実際の配線は異なる部分がありますがご了承ください。
※電気的には「回路図」と同じ意味です。
4. プログラム(Python)
RGB(フルカラー)LEDの各色(赤・緑・青)を同色のスイッチが押されている間だけ点灯させるプログラム((Python)は以下のようになります。
#必要なモジュールをインポート
import RPi.GPIO as GPIO #GPIO用のモジュールをインポート
import time #時間制御用のモジュールをインポート
import sys #sysモジュールをインポート
#ポート番号の定義
#RGB(フルカラー)LEDのポート
Led_red_pin = 22 #変数"Led_red_pin"に22を代入
Led_green_pin = 12 #変数"Led_green_pin"に12を代入
Led_blue_pin = 23 #変数"Led_blue_pin"に23を代入
#スイッチのポート
Sw_red_pin = 19 #変数"Sw_red_pin"に19を代入
Sw_green_pin = 18 #変数"Sw_green_pin"に18を代入
Sw_blue_pin = 25 #変数"Sw_blue_pin"に25を代入
#GPIOの設定
GPIO.setmode(GPIO.BCM) #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(Led_red_pin, GPIO.OUT) #GPIO22を出力モードに設定
GPIO.setup(Led_green_pin, GPIO.OUT) #GPIO12を出力モードに設定
GPIO.setup(Led_blue_pin, GPIO.OUT) #GPIO23を出力モードに設定
#入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_red_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_green_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_blue_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
#while文で無限ループ
#GPIOの電圧を制御
while True:
try:
time.sleep(0.1) #0.1秒間待つ
if(GPIO.input(Sw_red_pin) == 1): #GPIO19が"1"であるか判断(↓1であれば以下を実行)
GPIO.output(Led_red_pin, GPIO.HIGH) #GPIO22の出力をHigh(3.3V)にする
elif(GPIO.input(Sw_green_pin) == 1): #GPIO18が"1"であるか判断(↓1であれば以下を実行)
GPIO.output(Led_green_pin, GPIO.HIGH) #GPIO12の出力をHigh(3.3V)にする
elif(GPIO.input(Sw_blue_pin) == 1): #GPIO25が"1"であるか判断(↓1であれば以下を実行)
GPIO.output(Led_blue_pin, GPIO.HIGH) #GPIO23の出力をHigh(3.3V)にする
else:
GPIO.output(Led_red_pin, GPIO.LOW) #GPIO22の出力をLow(0V)にする
GPIO.output(Led_green_pin, GPIO.LOW) #GPIO12の出力をLow(0V)にする
GPIO.output(Led_blue_pin, GPIO.LOW) #GPIO23の出力をLow(0V)にする
except KeyboardInterrupt: #Ctrl+Cキーが押された
GPIO.cleanup() #GPIOをクリーンアップ
sys.exit() #プログラムを終了
while文の中で各スイッチが押されているかif文で判断を行い、押されたスイッチの色に応じてRGB(フルカラー)LEDのGPIOをHigh(3.3V)に出力しているプログラムです。
#必要なモジュールをインポート
import RPi.GPIO as GPIO #GPIO用のモジュールをインポート
import time #時間制御用のモジュールをインポート
import sys #sysモジュールをインポート
2行目~4行目で今回必要な「モジュール」を宣言します。
#ポート番号の定義
#RGB(フルカラー)LEDのポート
Led_red_pin = 22 #変数"Led_red_pin"に22を代入
Led_green_pin = 12 #変数"Led_green_pin"に12を代入
Led_blue_pin = 23 #変数"Led_blue_pin"に23を代入
#スイッチのポート
Sw_red_pin = 19 #変数"Sw_red_pin"に19を代入
Sw_green_pin = 18 #変数"Sw_green_pin"に18を代入
Sw_blue_pin = 25 #変数"Sw_blue_pin"に25を代入
使用するGPIOのポート番号を宣言します。RGB(フルカラー)LEDとスイッチのGPIOと変数の関係は以下のようになります。
Led_red_pin | :GPIO 22 | :RGB(フルカラー)LED(赤) |
Led_green_pin | :GPIO 12 | :RGB(フルカラー)LED(緑) |
Led_blue_pin | :GPIO 23 | :RGB(フルカラー)LED(青) |
Sw_red_pin | :GPIO 19 | :スイッチ(赤) |
Sw_green_pin | :GPIO 18 | :スイッチ(緑) |
Sw_blue_pin | :GPIO 25 | :スイッチ(青) |
#GPIOの設定
GPIO.setmode(GPIO.BCM) #GPIOのモードを"GPIO.BCM"に設定
GPIO.setup(Led_red_pin, GPIO.OUT) #GPIO22を出力モードに設定
GPIO.setup(Led_green_pin, GPIO.OUT) #GPIO12を出力モードに設定
GPIO.setup(Led_blue_pin, GPIO.OUT) #GPIO23を出力モードに設定
#入力モードに設定してプルダウン抵抗を有効にする
GPIO.setup(Sw_red_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_green_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(Sw_blue_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIOの設定を行います。
GPIO.setmode(GPIO.BCM)
は、GPIOをポート番号で扱う方法に設定します。
GPIO.setup(Led_red_pin, GPIO.OUT)
は、GPIO 22番ポートを出力モードに設定します。19・20行目も同様にGPIO 12,23番ポートを出力モードにします。
GPIO.setup(Sw_red_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
は、GPIO 19番ポートを入力モードに設定して、内部にあるプルダウン抵抗を有効にします。23・24行目も同様の処理を行います。
#while文で無限ループ
#GPIOの電圧を制御
while True:
try:
time.sleep(0.1) #0.1秒間待つ
if(GPIO.input(Sw_red_pin) == 1): #GPIO19が"1"であるか判断(↓1であれば以下を実行)
GPIO.output(Led_red_pin, GPIO.HIGH) #GPIO22の出力をHigh(3.3V)にする
elif(GPIO.input(Sw_green_pin) == 1): #GPIO18が"1"であるか判断(↓1であれば以下を実行)
GPIO.output(Led_green_pin, GPIO.HIGH) #GPIO12の出力をHigh(3.3V)にする
elif(GPIO.input(Sw_blue_pin) == 1): #GPIO25が"1"であるか判断(↓1であれば以下を実行)
GPIO.output(Led_blue_pin, GPIO.HIGH) #GPIO23の出力をHigh(3.3V)にする
else:
GPIO.output(Led_red_pin, GPIO.LOW) #GPIO22の出力をLow(0V)にする
GPIO.output(Led_green_pin, GPIO.LOW) #GPIO12の出力をLow(0V)にする
GPIO.output(Led_blue_pin, GPIO.LOW) #GPIO23の出力をLow(0V)にする
except KeyboardInterrupt: #Ctrl+Cキーが押された
GPIO.cleanup() #GPIOをクリーンアップ
sys.exit() #プログラムを終了
「while文」は条件を指定して、その条件が”真”の時に繰り返し処理を行うものです。
while 条件式:
繰り返し処理を行うコード
↑の「条件式」にTrue
を指定することにより、条件式は常に真となりwhile文は無限に繰り返します。
ただし、このままではプログラム実行中に無限ループから抜け出す方法がありません。そこでwhile文の中にある「try文」と「except文」を使用します。
このtry-except文を用いることにより、while文の処理は以下のようになります。
while True:
try:
繰り返し処理を行うコード
except KeyboardInterrupt: #Ctrl+Cキーが押された
GPIO.cleanup() #GPIOをクリーンアップ
sys.exit() #プログラムを終了
except KeyboardInterrupt:
は、キーボードのCtrl + Cキーが押された時にwhile文の繰り返し処理から抜けて「GPIOのクリーンアップ」と「プログラムの終了」の処理を行います。
Ctrl + Cキーが押されていないとき、try:文の中の処理を繰り返し行います。(以下で解説)
time.sleep(0.1) #0.1秒間待つ
if(GPIO.input(Sw_red_pin) == 1): #GPIO19が"1"であるか判断(↓1であれば以下を実行)
GPIO.output(Led_red_pin, GPIO.HIGH) #GPIO22の出力をHigh(3.3V)にする
elif(GPIO.input(Sw_green_pin) == 1): #GPIO18が"1"であるか判断(↓1であれば以下を実行)
GPIO.output(Led_green_pin, GPIO.HIGH) #GPIO12の出力をHigh(3.3V)にする
elif(GPIO.input(Sw_blue_pin) == 1): #GPIO25が"1"であるか判断(↓1であれば以下を実行)
GPIO.output(Led_blue_pin, GPIO.HIGH) #GPIO23の出力をHigh(3.3V)にする
else:
GPIO.output(Led_red_pin, GPIO.LOW) #GPIO22の出力をLow(0V)にする
GPIO.output(Led_green_pin, GPIO.LOW) #GPIO12の出力をLow(0V)にする
GPIO.output(Led_blue_pin, GPIO.LOW) #GPIO23の出力をLow(0V)にする
time.sleep(0.1)
は、何もせずに0.1秒間待ちます。この処理を行うために3行目でtimeモジュールをインポートしています。
if(GPIO.input(Sw_red_pin) == 1):
はif文によって赤色スイッチが押されているか判断します。
if 条件式:
条件式が"真"の時に実行するコード
条件が”真”の時、つまり赤色スイッチが押されていればif文の内のGPIO.output(Led_red_pin, GPIO.HIGH)
を実行します。この処理はGPIO 22番ポートをHigh(3.3V)に出力するものです。GPIO 22番ポートをHigh(3.3V)にすることでRGB(フルカラー)LEDは赤く点灯させます。
elif文はif文と同じ階層で条件分岐を行います。
if 条件式A:
条件式Aが"真"の時に実行するコード
elif 条件式B:
条件式Bが"真"の時に実行するコード
elif 条件式C:
条件式Cが"真"の時に実行するコード
else:
上記の条件に当てはまらない時に実行するコード
このelif分を用いることにより、3ヶのスイッチに対応したRGB(フルカラー)LEDを点灯させます。上記のelse:
は赤・緑・青色のスイッチが何も押されていないときに実行され、GPIO 22,12,23番ポートの出力をLow(0V)にします。
5. おわりに
ラズベリーパイのGPIOピンを用いてRGB(フルカラー)LEDの各色(赤・緑・青)をスイッチで制御する方法を解説しました。
まだまだラズベリーパイ初心者の私ですが、以下の参考書が大変参考にさせて頂いております。
2冊とも初学者にも易しい内容になっており、ゼロからラズベリーパイを始める方にもオススメできる参考書です。