【ラズパイ】PWM出力でツリー点灯してみた
こちらは、Mavs Advent Calendar2023の23日目の記事です!
🎄🎄🎄
こんにちは、タロウです。
今年は社内でレゴのアドベントカレンダーを行なっており、レゴ+ラズパイで何かできないかな・・と思い、ツリーで点灯式を行うことにしました。
いきなり完成
レゴのツリーにLEDを半分無理矢理つけて光らせました。
ただの点滅ではなくPWM出力で調光を行うようにしてみました。
使用した部品
Raspberry Pi 3 Model B+
数年前に中古で買ったものです。
少し前までは半導体不足でものすごく高くなっていましたが、ピークよりかは買いやすく品切れることも少なくなっているのではと感じます。
ケースはAmazonで購入した1200円くらいのものです。
GPIOピンを使用するので塞がないようなものを選んでいます。
ジャンパ・抵抗内蔵LED
お馴染みの部品たちですが、とりあえず繋げるためにジャンパはオス-オス、メス-メスそれぞれあると伸ばしたい時やセンサー類と接続する時など何かと便利です。
レゴ
可愛いツリーを拝借しました。
接続準備
今回、PWM出力を行うにあたり、PWMに対応しているピンを使用する必要があります。
ラズパイではGPIO12、13のみ対応しているためどちらかを使用しましょう。
短く繋ぐとこのようなイメージになります。
他ピンの位置付けは下図の通りなので間違わないようにさしましょう!
コード
今回はPythonで書きました。
ホワッと光ってホワっと消えるような動きにしたかったため、whileで無限ループし連続で調光を行うようにしています。
# RPi.GPIO
import RPi.GPIO as GPIO
import time
# GPIO ピン番号指定をBCMに設定
GPIO.setmode(GPIO.BCM)
PWM = 13
GPIO.setup(PWM,GPIO.OUT)
# 周波数(1秒間に1000回)
pwm = GPIO.PWM(PWM,1000)
# PWMの制御開始
pwm.start(0)
time.sleep(1)
# ついて消えてを繰り返す
while True:
# 徐々に点灯
for i in range(100):
v = i
if (v%10 == 0):
pwm.ChangeDutyCycle(v)
time.sleep(0.1)
# 徐々に消灯
for i in range(100):
v = 100-i
if (v%10 == 0):
pwm.ChangeDutyCycle(v)
time.sleep(0.1)
# GPIO設定解除
GPIO.cleanup(PWM)
コード解説
# 周波数(1秒間に1000回)
pwm = GPIO.PWM(PWM,1000)
PWM出力を行うにあたり、周波数を設定します。
点滅度合いを決めることができ、1000Hzほどとすると人間の目では常に光っているように見えるようです。数値を低くすると点滅しているように見えます。
# PWMの制御開始
pwm.start(0)
time.sleep(1)
Duty比の設定を行います。パーセンテージで調整でき、0~100の間で指定することができます。
Duty比を変更することで実効電圧を制御することができ、100%→電圧100%、50%→電圧50%となり、LEDの明るさを調整することができるようです。
# 徐々に点灯
for i in range(100):
v = i
if (v%10 == 0):
pwm.ChangeDutyCycle(v)
time.sleep(0.1)
100までインクリメントするループを作成し、インクリメントされた値をパーセンテージに置き換えてDuty比の設定を行います。細かな単位で比率を変えることもできましたが、今回の例では10段階で明るさを調整するようにしています。
Duty比の設定後は0.1秒スリープを挟むことで徐々に明るくなる演出を入れてみました。
Duty比についてはまだ「入力電圧を変えずに電圧を変えられる」くらいしかわかっていませんが、LED以外にもモーターなどに応用ができるようなので、何かを作る幅が広がったような気がします。
さいごに
今まではON・OFFの0か100かで信号をキャッチ、入力して動作させていましたが、PWM出力を使うことで電圧の制御方法を知ることができました!これを機に電子工学分野の知識に触れていきたいと思います。
今回はLEDで試してみましたが、モーターの回転制御で使用されることが多いようなのでモーターを使った何かを作ってみたいと思います!(また来年のアドカレかな・・)