點亮LED

      在〈點亮LED〉中尚無留言

線路接法

正極接上 pin 2 或 4,GND 接 pin 6,則為恒亮的狀態。

正極接 pin 11/13/15 (GPIO17/27/22),則需使用本篇最下面的程式碼點亮。

請注意,這個有極性,led 長邊需接正極(GPIO),短邊接地。

基本常識

1.  電子元件能承受的最大極限以電壓為主,電流不用理會。比如某燈泡最大電壓不可超過110V,那麼輸入220V 就一定燒毀
2. 電子元件標示 110V, 2A,這是標示最大耗電量為220W。若輸入 110V, 20A,那是安全的,因為供電端的 20A 是指最大供應瓦數,並不會直接輸出20A 給電子元件。
3. 電子元件承受不了那麼大的電壓時,可以用電阻降低電壓,不過這會讓電阻發熱耗電就是了。

公式為 V = I * R。若 V 恆定,那麼 R 愈大,I 愈小。也就是輸出功率(耗電)是固定的,所以結果是電子元耗電,而電阻也跟著耗電。

電阻計算法

正極與 Led 之間必需接一個電阻,電阻值的計算需有如下常識。

1. GPIO 輸出電壓為 5V,最大輸出電流約 50 mA。
2. V = I * R

紅黃錄的Led,電壓為2V,最佳電流為20mA,藍白 Led 為 3.3V。樹莓派的GPIO輸出電壓為 5V,依 V = I * R 計算,I 要維持在 20mA,則 5 = 0.02 * R,所以 R 必需為 250 Ω. 而 Led 本身的電阻值約 100Ω,所以在接正電壓前,必需串接100~150 Ω 的電阻。

gpiod版

底下的代碼可以亮 1 秒,再滅 1秒,重覆一直閃爍,完整程式碼如下

#!.venv/bin/python3
import gpiod
import time
LED_PIN = 17
chip = gpiod.Chip('gpiochip4')
led_line = chip.get_line(LED_PIN)
led_line.request(consumer="LED", type=gpiod.LINE_REQ_DIR_OUT)
try:
   while True:
       led_line.set_value(1)
       time.sleep(1)
       led_line.set_value(0)
       time.sleep(1)
finally:
   led_line.release()

在VS Code 按右鍵/Run Python/Run Python File in Terminal 即可執行。

若要在 pi5 中執行,請使用如下指令執行

chmod 755 led.py
./led.py

gpiozero版

gpiozero 的完整程式碼如下

#!.venv/bin/python3
from gpiozero import LED
import time
led=LED(17)
while True:
    led.on()
    time.sleep(1)
    led.off()
    time.sleep(1)

使用 led.blink 亦可執行閃爍的效果

from gpiozero import LED
from signal import pause
led=LED(17)
led.blink()
pause()

LEDBoard 類別

LEDBoard 類別可以同時控制多個 GPIO,使用 leds.on/leds.off 可以同時亮或滅 Led,也可以使用 leds.value 設定亮或滅

from gpiozero import LEDBoard
from time import sleep
from signal import pause
leds = LEDBoard(13,19,26)

leds.on()
sleep(1)
leds.off()
sleep(1)
leds.value = (1, 0, 1)
sleep(1)
leds.blink()

pause()

呼吸燈 PWM

Raspberry 的 GPIO 不是輸出0V 就是輸出3.3V。假設在 GPIO 上接了一個 Led,想要讓這個 Led 有著如呼吸燈的功能,由亮到暗,再由暗到亮,這需調整電壓值。但 GPIO 不是 0 就是 3.3V,怎麼辨呢?

Pulse-width modulation(PWM) 是一種解決的方法。如果在一秒鐘之內, 前 500ms 點亮 3.3V,後 500ms 輸出 0V,那麼在這一秒鐘之內平圴只有 50% 的亮度。如果再加快,1ms 亮,1ms暗,就真的慢慢暗下來了。底下的代碼可以產生呼吸燈的效果。

import time
from gpiozero import PWMLED
led=PWMLED(17)
while True:
    for i in range(11):
        led.value = i/10
        time.sleep(0.1)
    for i in range(9, -1, -1):
        led.value = i/10
        time.sleep(0.1)

使用 pulse() 也可以產生呼吸燈

from gpiozero import PWMLED
from signal import pause
led=PWMLED(17)
led.pulse()
pause()

參考

https://gpiozero.readthedocs.io/en/stable/recipes.html

https://www.tomshardware.com/how-to/control-raspberry-pi-5-gpio-with-python-3

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *