使用 Python 的 gpiozero 函式庫,可以輕鬆控制 LED 的亮度。gpiozero 提供了 PWMLED 類別,藉由調整 value 屬性即可控制 LED 的亮度,範圍從 0.0 到 1.0。PWM 技術透過控制高頻率方波的佔空比來調節功率,進而改變 LED 亮度。然而,PWM 頻率的提高會降低其準確性,因此不適用於音訊應用,但足以控制 LED 亮度或馬達速度。針對高功率 LED 等需要較高電壓和電流的裝置,則需使用 MOSFET 或繼電器等元件進行控制。MOSFET 可承受較高電流,透過控制閘極電壓即可控制電流流動。繼電器則適用於切換高壓交流電或電路不明確的裝置,但其切換速度較慢,不適合 PWM 控制。

控制LED的亮度

問題描述

您想要從Python程式中變化LED的亮度。

解決方案

gpiozero函式庫有一個pulse-width modulation(PWM)功能,允許您控制LED的功率和亮度。 要試用它,請按照10.1節中描述的方法連線LED,然後執行以下測試程式(ch_10_led_brightness.py):

from gpiozero import PWMLED

led = PWMLED(18)

while True:
    brightness_s = input("輸入亮度(0.0至1.0):")
    brightness = float(brightness_s)
    led.value = brightness

討論

PWM是一種巧妙的技術,它透過控制高頻率方波的佔空比來調節功率。圖10-2展示了PWM的基本原理。

圖10-2. Pulse-width modulation

透過調整PWM頻率,可以控制LED的閃爍速度。例如,您可以將PWM頻率設定為100Hz,也就是說LED每秒閃爍100次。您可以在定義PWMLED時更改這個頻率:

led = PWMLED(18, frequency=1000)

這裡,頻率單位是Hz,因此在這種情況下,頻率設定為1,000 Hz(1 kHz)。

表10-2. 頻率比較

所需頻率實際頻率
100 Hz100 Hz
1000 Hz1000 Hz

實作細節

  • PWM的頻率可以透過frequency引數設定。
  • 預設情況下,PWM的頻率為100Hz。
  • 可以透過調整frequency引數來改變PWM的頻率。
  • LED的亮度可以透過調整value屬性來控制。

程式碼示例

from gpiozero import PWMLED

# 建立一個PWMLED物件
led = PWMLED(18)

# 設定PWM頻率為1000Hz
led = PWMLED(18, frequency=1000)

# 調整LED的亮度
while True:
    brightness_s = input("輸入亮度(0.0至1.0):")
    brightness = float(brightness_s)
    led.value = brightness

圖表翻譯

  flowchart TD
    A[開始] --> B[輸入亮度]
    B --> C[調整LED亮度]
    C --> D[設定PWM頻率]
    D --> E[結束]

這個流程圖展示了控制LED亮度的基本步驟。首先,輸入亮度值,然後調整LED的亮度,最後設定PWM頻率。

PWM功能的實際應用

在上述的實驗中,我們可以看到PWM功能的實際應用。透過對比請求頻率和測量頻率,我們可以發現,隨著頻率的增加,準確性會降低。這意味著這個PWM功能不適合用於音訊應用,但足夠快速地控制LED的亮度或電機的速度。

實驗結果分析

請求頻率測量頻率
50 Hz50 Hz
100 Hz98.7 Hz
200 Hz195 Hz
500 Hz470 Hz
1 kHz880 Hz
10 kHz4.2 kHz

從上述結果中,我們可以看到,當頻率增加時,測量頻率與請求頻率之間的差異會變大。這表明PWM功能的準確性會隨著頻率的增加而降低。

PWM功能的應用場景

雖然PWM功能不適合用於音訊應用,但它仍然可以用於其他領域,例如控制LED的亮度或電機的速度。在Recipe 10.10中,我們將使用PWM功能來改變RGB LED的顏色,而在Recipe 11.4中,我們將使用PWM功能來控制DC電機的速度。

延伸閱讀

如果您想要了解更多關於PWM的資訊,可以參考Wikipedia上的相關文章。另外,Recipe 9.8中提供了關於使用麵包板和跳線與Raspberry Pi合作的更多資訊。您也可以使用滑動控制來調整LED的亮度,請參考Recipe 10.9。

高功率DC裝置的開關控制

使用電晶體

問題 您想要控制高功率、低電壓DC裝置的電流,例如12V LED模組。

內容解密:

在這個問題中,我們需要使用電晶體來控制高功率DC裝置的電流。電晶體是一種半導體器件,可以用來開關電路或調整電路中的電流。透過使用電晶體,我們可以控制高功率DC裝置的電流,從而實作對裝置的控制。

圖表翻譯:

  flowchart TD
    A[高功率DC裝置] --> B[電晶體]
    B --> C[控制電路]
    C --> D[調整電流]
    D --> E[實作控制]

在這個圖表中,我們可以看到高功率DC裝置、電晶體、控制電路、調整電流和實作控制之間的關係。透過使用電晶體和控制電路,我們可以調整高功率DC裝置的電流,從而實作對裝置的控制。

控制高功率LED的方法

高功率LED需要大量電流和12V的電壓,遠超GPIO引腳的承受能力。因此,需要使用一個可以控制高功率負載的元件,例如金氧化物半導體場效應電晶體(MOSFET)。這種元件雖然只需花費不到一美元,但可以承受高達30安培的電流,遠超高功率LED的需求。

硬體需求

-麵包板和跳線 -1kΩ電阻器 -FQP30N06L N-Channel MOSFET或TIP120 Darlington電晶體 -12V電源介面卡 -12V DC LED模組

MOSFET的工作原理

MOSFET是一種可以控制高功率負載的元件,它的工作原理是透過控制閘極(Gate)電壓來控制電流的流動。當閘極電壓高於2V時,MOSFET會開啟,允許電流流過。

連線MOSFET

MOSFET的連線方式如下:

  • 連線正極和負極供應線到LED模組
  • 連線MOSFET的源極(Source)到GND
  • 連線MOSFET的閘極(Gate)到GPIO引腳
  • 連線MOSFET的汲極(Drain)到LED模組的負極

Python程式碼

控制高功率LED的Python程式碼與控制低功率LED的程式碼相同,可以使用PWM來控制LED的亮度。

import RPi.GPIO as GPIO
import time

# 設定GPIO模式
GPIO.setmode(GPIO.BCM)

# 設定GPIO引腳
led_pin = 17

# 設定MOSFET的閘極電壓
mosfet_gate_voltage = 3.3

# 開啟LED
GPIO.output(led_pin, GPIO.HIGH)

# 關閉LED
GPIO.output(led_pin, GPIO.LOW)

內容解密:

上述程式碼使用RPi.GPIO函式庫來控制GPIO引腳,設定GPIO模式為BCM,然後設定GPIO引腳為17。設定MOSFET的閘極電壓為3.3V,然後使用GPIO.output()函式來控制LED的開關。

圖表翻譯:

  flowchart TD
    A[開始] --> B[設定GPIO模式]
    B --> C[設定GPIO引腳]
    C --> D[設定MOSFET閘極電壓]
    D --> E[控制LED開關]
    E --> F[結束]

圖表翻譯:

上述流程圖顯示了控制高功率LED的步驟,從設定GPIO模式開始,然後設定GPIO引腳,設定MOSFET閘極電壓,然後控制LED開關,最後結束。

使用繼電器控制裝置

在某些情況下,使用MOSFET切換裝置可能不是最佳選擇。這時可以使用繼電器和小型電晶體來控制裝置。

解決方案

使用繼電器和小型電晶體,如圖10-4所示,將電晶體和繼電器連線到麵包板上。確保電晶體和二極體的方向正確,二極體有一條線在一端,電晶體有一側是平的,另一側是彎曲的。

所需材料

  • 麵包板和跳線(見「原型設計裝置和套件」)
  • 1kΩ電阻器(見「電阻器和電容器」)
  • 2N3904電晶體(見「電晶體和二極體」)
  • 1N4001二極體(見「電晶體和二極體」)
  • 5V繼電器(見「雜項」)
  • 萬用表

步驟

  1. 將電晶體和繼電器連線到麵包板上,如圖10-4所示。
  2. 使用與Recipe 10.1相同的LED閃爍程式。如果一切正常,您將聽到繼電器的啟動聲和萬用表的蜂鳴聲,每次接觸關閉時。
  3. 注意,繼電器是慢速的機械裝置,因此不要嘗試使用PWM(脈寬調製)控制它們,因為這可能會損壞繼電器。

討論

繼電器已經存在於電子學的早期階段,並具有易於使用的優點,同時也可以在任何情況下工作,就像開關一樣。例如,當您切換交流電(AC)或在不知道被切換裝置的確切線路的情況下。 如果繼電器接觸超出其規格,繼電器的壽命將會縮短。會有電弧,並且接觸可能最終會融合在一起。也有可能繼電器變得危險地熱。 當您懷疑時,請過度規格化繼電器接觸。

圖10-5顯示了典型繼電器的電路符號、引腳佈局和封裝。 繼電器基本上是一個開關,其接觸在電磁鐵拉動時關閉。由於電磁鐵和開關在電氣上沒有任何連線,因此這保護了驅動繼電器線圈的電路免受開關側高壓的影響。

繼電器的缺點是它們運作緩慢,並且最終會在數十萬次操作後磨損。這意味著它們只適合於慢速開/關控制,而不適合快速切換,如PWM。 繼電器的線圈需要約50mA才能關閉連線。由於Raspberry Pi的GPIO引腳只能提供約3mA,因此您需要使用小型電晶體作為開關。您不需要使用高功率MOSFET,如Recipe 10.4中所做;您可以使用小型電晶體代替。它有三個連線。基極(中間引腳)透過1kΩ電阻連線到GPIO引腳,以限制電流。發射極連線到GND,集電極連線到繼電器的一側。繼電器的另一側連線到GPIO聯結器上的5V。二極體用於抑制當電晶體快速切換繼電器線圈功率時出現的任何高壓脈衝。

警告

雖然繼電器可以用於切換110V或240V交流電,但這種電壓非常危險,不應該在麵包板上使用。如果您想要切換高壓電,請改用Recipe 10.6。

參考

如需使用功率MOSFET切換直流電(DC),請參閱Recipe 10.4。

從使用者經驗的角度來看,控制LED亮度及高功率裝置的開關,核心在於簡化操作流程並提供可靠的控制方法。本文探討了使用PWM控制LED亮度、MOSFET控制高功率LED,以及繼電器控制裝置的幾種方案。

分析PWM控制LED亮度的機制,其優勢在於能精細調節亮度,但精確度會隨著頻率的增加而降低,限制了其在高頻應用場景的效能。對比使用MOSFET控制高功率LED,則能有效解決GPIO引腳電流不足的問題,提供更強的驅動能力。然而,MOSFET的選型及電路設計需要一定的專業知識。至於繼電器控制,雖然適用於高電壓及交流電場景,但其機械結構限制了開關速度,且存在壽命問題。 不同方案各有其優劣,需根據實際應用場景選擇合適的方案。

展望未來,隨著物聯網技術的發展,對裝置控制的需求將更加多元化和精細化。預計未來會有更高效、更精確、更易用的控制方案出現,例如整合更多功能的控制晶片、無線控制技術等。同時,更友好的程式函式庫和開發工具也將降低開發門檻,讓更多使用者能輕鬆控制各種裝置。

對於想要控制LED亮度和高功率裝置的使用者,建議根據實際需求選擇合適的方案。若需精細控制LED亮度,PWM是不錯的選擇;若需控制高功率LED或其他高功率DC裝置,MOSFET是更佳的方案;若需控制高壓或交流電裝置,則應選擇繼電器。同時,持續關注新技術的發展,才能在未來選擇更最佳化的解決方案。