物づくりの小部屋

個人で活躍するクリエーターになりたい現役エンジニアの行動記録

【ラズパイ】Raspberry pi4でLEDを光らせて小型信号機を作ってみる

f:id:zaloha8:20211009114222j:plain

こんにちは。alohaです。

 

Raspberry pi4やマイコンの使い方を勉強し始めた時に、最初にトライする物といえばLEDの点灯、消灯ですね。

 

通称Lチカと呼ばれたりしますが、単純にLEDを光らせるだけでも電子回路とI/O制御の基本を学ぶ事ができるので、電子工作初心者は、ほとんどの人がトライした事があるのではないでしょうか。

 

Raspberry pi4初心者の私も、やっぱり最初はLチカからスタートします。

と言っても、単に点灯、消灯させるだけではつまらないので、道路にある信号機相当の物を作ります。また、ついでにPWMによるLEDの明るさ調整も試します。

 

それでは、早速作ってみましょう。

 

<部品一覧(Raspberry pi4本体以外に必要な物)>

  • LED(今回は高輝度タイプを使用)   緑2個、黄色1個、赤2個
  • 抵抗(68 [Ω])              5個
  • ブレッドボード            1個
  • 配線用ワイヤ             適量

f:id:zaloha8:20211004154327j:plain

 

<回路図>

Qt-BSch3Vで回路図を書くと下図の様になります。

f:id:zaloha8:20211004152109j:plain

 

今回使用する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=\frac{Vras - VF}{IF}=\frac{3.3 - 2.0}{0.02}=65 \left[\Omega\right]

 

今回は、R1〜R5として、手持ちの抵抗から68 [Ω]を選定します。

ブレッドボード上に配線すると、写真の様になります。

f:id:zaloha8:20211004174229j:plain

 

最後に、見た目を信号機っぽくするために各LEDの周りに3Dプリンタで作ったフレームを付ければハードウェアとしては完成です。

f:id:zaloha8:20211004215347j:plain

 

<動作プログラム>

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()

 

以下はプログラム実行時の写真です。

f:id:zaloha8:20211004215425j:plain

 

<LEDの明るさを調整する方法>

LEDを使う際、単純に点灯 / 消灯させる他に、明るさを調整したい場合もあると思いますが、一般的に明るさの調整はPWMを用いて行います。

 

PWMは、下の図の様にGPIO端子から出力される電圧のON(3.3 [V]出力)とOFF(0 [V]出力)を高速に切り替えて、GPIO端子から出力される平均電圧を調整する事でLEDの明るさを調整します。

 

f:id:zaloha8:20211004213456j:plain

 

周期t1とON(3.3 [V]出力)している時間t2の比をデューティ比と呼び、デューティ比が大きい程LEDは明るく光り、デューティ比が小さい程LEDは暗く光ります。

 

デューティ比\left[\%\right]=\left(\frac{t2}{t1}\right)\times 100

 

Raspberry pi4では、GPIO端子からPWM信号を出力するコマンドが既に用意されているので、このコマンドをプログラム上で実行するだけでGPIO端子からPWM信号を出力する事ができます。

 

PWM信号を出力してLEDの明るさを調整する例は以下の通りです。

 

この例では、GPIOの8番ピンから100 [Hz]のPWM信号を出力しています。ループの中でキーボードからデューティ比(0〜100の範囲)を入力すると、入力したデューティ比によってLEDの明るさが変わります。

 

0を入力した場合はLEDは光りません。入力する値を大きくする程LEDが明るく光る様になり、100を入力した場合が最も明るく光ります。

 

<回路図>

f:id:zaloha8:20210926165855j:plain

 

<ブレッドボード上の配線>

f:id:zaloha8:20211004175043j:plain

 

<プログラム>

#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%)>

f:id:zaloha8:20211004210345j:plainf:id:zaloha8:20211004210333j:plain

 

<まとめ>

という訳で、Raspberry pi4でLEDの点灯 / 消灯をテストして、小型信号機を作ってみました。また、PWMを用いてLEDの明るさ調整を試してみました。

 

Raspberry pi4には、他にもいろいろな機能が搭載されているので、今後も各機能を試しつつ、物づくりをしていきたいですね。

 

それでは、また。