【ラズパイ】Raspberry pi4でLEDを光らせて小型信号機を作ってみる
こんにちは。alohaです。
Raspberry pi4やマイコンの使い方を勉強し始めた時に、最初にトライする物といえばLEDの点灯、消灯ですね。
通称Lチカと呼ばれたりしますが、単純にLEDを光らせるだけでも電子回路とI/O制御の基本を学ぶ事ができるので、電子工作初心者は、ほとんどの人がトライした事があるのではないでしょうか。
Raspberry pi4初心者の私も、やっぱり最初はLチカからスタートします。
と言っても、単に点灯、消灯させるだけではつまらないので、道路にある信号機相当の物を作ります。また、ついでにPWMによるLEDの明るさ調整も試します。
それでは、早速作ってみましょう。
<部品一覧(Raspberry pi4本体以外に必要な物)>
- LED(今回は高輝度タイプを使用) 緑2個、黄色1個、赤2個
- 抵抗(68 [Ω]) 5個
- ブレッドボード 1個
- 配線用ワイヤ 適量
<回路図>
Qt-BSch3Vで回路図を書くと下図の様になります。
今回使用するLEDの定格電流は、IF=20 [mA](0.02 [A])なので、LEDに流れる電流が20 [mA]となる様に、抵抗R1〜R5を選定します。LEDの順電圧VFは記載が無いので分かりませんが、とりあえずVF=2.0 [V]として、Raspberry Pi4のGPIOの出力電圧はVras=3.3 [V]である事から、抵抗R1〜R5は以下の式で計算されます。
今回は、R1〜R5として、手持ちの抵抗から68 [Ω]を選定します。
ブレッドボード上に配線すると、写真の様になります。
最後に、見た目を信号機っぽくするために各LEDの周りに3Dプリンタで作ったフレームを付ければハードウェアとしては完成です。
<動作プログラム>
Pythonで作成した動作プログラムは下記の通りです。
歩行者用信号と自動車用信号が緑点灯した後、歩行者用信号が点滅して赤に変わり、最後に自動車用信号が黄色 → 赤に変わります。
#coding:utf-8 #GPIOライブラリをインポート import RPi.GPIO as GPIO #timeライブラリをインポート import time #ピン番号の割当方式を「コネクタピン番号」に設定 GPIO.setmode(GPIO.BOARD) #使用するピン番号を代入(車用信号) LED_C_R=8 LED_C_Y=10 LED_C_G=12 #使用するピン番号を代入(歩行者信号) LED_P_R=24 LED_P_G=26 #各ピンを出力ピンに設定し、初期出力をローレベルにする GPIO.setup(LED_C_R,GPIO.OUT,initial=GPIO.LOW) GPIO.setup(LED_C_Y,GPIO.OUT,initial=GPIO.LOW) GPIO.setup(LED_C_G,GPIO.OUT,initial=GPIO.LOW) GPIO.setup(LED_P_R,GPIO.OUT,initial=GPIO.LOW) GPIO.setup(LED_P_G,GPIO.OUT,initial=GPIO.LOW) #歩行者用緑信号を点滅させる関数 #0.35秒間隔で10回点滅させる def blink_p_g(): for i in range(10): GPIO.output(LED_P_G,GPIO.HIGH) time.sleep(0.35) GPIO.output(LED_P_G,GPIO.LOW) time.sleep(0.35) #例外を検出する try: #無限ループ while 1: #車用緑信号、歩行者用緑信号を点灯 GPIO.output(LED_C_G,GPIO.HIGH) GPIO.output(LED_P_G,GPIO.HIGH) #10秒待機 time.sleep(10.0) #歩行者用緑信号を点滅させる blink_p_g() #歩行者用赤信号を点灯 GPIO.output(LED_P_R,GPIO.HIGH) #3秒待機 time.sleep(3.0) #車用緑信号を消灯し、車用黄色信号を点灯 GPIO.output(LED_C_G,GPIO.LOW) GPIO.output(LED_C_Y,GPIO.HIGH) #3秒待機 time.sleep(3.0) #車用黄色信号を消灯し、車用赤信号を点灯 GPIO.output(LED_C_Y,GPIO.LOW) GPIO.output(LED_C_R,GPIO.HIGH) #10秒待機 time.sleep(10.0) #車用赤信号、歩行者用赤信号を消灯 GPIO.output(LED_C_R,GPIO.LOW) GPIO.output(LED_P_R,GPIO.LOW) #キーボードの例外を検出 except KeyboardInterrupt: #メッセージを表示 print("Pushed Ctrl+C") print("End of program") #GPIOを開放 GPIO.cleanup()
以下はプログラム実行時の写真です。
<LEDの明るさを調整する方法>
LEDを使う際、単純に点灯 / 消灯させる他に、明るさを調整したい場合もあると思いますが、一般的に明るさの調整はPWMを用いて行います。
PWMは、下の図の様にGPIO端子から出力される電圧のON(3.3 [V]出力)とOFF(0 [V]出力)を高速に切り替えて、GPIO端子から出力される平均電圧を調整する事でLEDの明るさを調整します。
周期t1とON(3.3 [V]出力)している時間t2の比をデューティ比と呼び、デューティ比が大きい程LEDは明るく光り、デューティ比が小さい程LEDは暗く光ります。
Raspberry pi4では、GPIO端子からPWM信号を出力するコマンドが既に用意されているので、このコマンドをプログラム上で実行するだけでGPIO端子からPWM信号を出力する事ができます。
PWM信号を出力してLEDの明るさを調整する例は以下の通りです。
この例では、GPIOの8番ピンから100 [Hz]のPWM信号を出力しています。ループの中でキーボードからデューティ比(0〜100の範囲)を入力すると、入力したデューティ比によってLEDの明るさが変わります。
0を入力した場合はLEDは光りません。入力する値を大きくする程LEDが明るく光る様になり、100を入力した場合が最も明るく光ります。
<回路図>
<ブレッドボード上の配線>
<プログラム>
#coding:utf-8 #GPIOライブラリをインポート import RPi.GPIO as GPIO #timeライブラリをインポート import time #ピン番号の割当方式を「コネクタのピン番号」に設定 GPIO.setmode(GPIO.BOARD) #使用するピン番号を代入 LED=8 #8番ピンを出力ピンに設定し、初期出力をローレベルにする GPIO.setup(LED,GPIO.OUT,initial=GPIO.LOW) #PWMオブジェクトのインスタンスを作成 #出力ピン:8番、周波数:100Hz p=GPIO.PWM(LED,100) #PWM信号を出力 p.start(0) #例外を検出 try: #無限ループ while 1: val=float(input("input pwm duty:")) #デューティ比を設定 p.ChangeDutyCycle(val) #キーボードの例外を検出 except KeyboardInterrupt: #メッセージを表示 print("Pushed Ctl+C") print("End of program") #PWMを停止 p.stop() #GPIOを開放 GPIO.cleanup()
<プログラム実行時の写真(左はデューティ10%、右はデューティ100%)>
<まとめ>
という訳で、Raspberry pi4でLEDの点灯 / 消灯をテストして、小型信号機を作ってみました。また、PWMを用いてLEDの明るさ調整を試してみました。
Raspberry pi4には、他にもいろいろな機能が搭載されているので、今後も各機能を試しつつ、物づくりをしていきたいですね。
それでは、また。