2.呼吸燈-樹莓派
什麼是PWM
簡單來說,PWM就是通過控制一定時間內的平均電壓來調節這段時間LED燈的明暗程度。那PWM是怎麼控制一定時間內的平均電壓呢?答案就是通過改變佔空比(Duty Cycle),佔空比指電路被接通的時間佔整個電路工作週期的百分比。
結合視頻中的例子來講:以100毫秒為一個週期,其中50毫秒通電,50毫秒斷電。那麼燈泡在100毫秒內其實只有一半時間是通電的,佔空比就是50%了。 100毫秒內燈泡得到的電壓只有一半,那麼亮度自然也就變為了一半。
我們可以通過RPi.GPIO中的PWM類來控制輸出的平均電壓。
第一個參數為引腳編號,第二個參數為頻率
pwm = GPIO.PWM(num, frequency)
第二個參數要填寫頻率,這裡要用到頻率(f)和周期(T)的轉換公式: [公式]
我們假設週期為20毫秒,那得到頻率為1/0.02s,即50Hz。
注:如果開關動作的周期如果太長,即頻率太小,那麼人的肉眼就可以辨識出燈的開關狀態,也就是說LED燈看起來就是閃爍的。
之後調用p.start(dc)來開啟PWM:
# 開啟PWM,參數dc為佔空比,取值範圍為0-100
pwm.start(dc)
如果要更改頻率,可以調用ChangeFrequency()方法:
pwm.ChangeFrequency(frequency)
如果要修改佔空比,可以調用ChangeDutyCycle()方法:
pwm.ChangeDutyCycle(dc)
當不需要PWM時,可以調用stop()來停止:
pwm.stop()
程式碼
import RPi.GPIO as GPIO
from time import sleep
led = 20
freg = 60
dc = 0
GPIO.setmode(GPIO.BCM)
GPIO.setup(led, GPIO.OUT)
p = GPIO.PWM(led, freg)
p.start(dc)
while True:
for i in range(1, 100):
p.ChangeDutyCycle(i)
sleep(0.05)
for i in range(100, 1, -1):
p.ChangeDutyCycle(i)
sleep(0.05)
p.stop()
GPIO.cleanup()