Learning Objectives
- 把 LED 經過限流電阻接到 GPIO17,說明每個元件的作用
- 用 gpiozero 的 LED 類別控制亮暗:on()、off()、toggle()、value
- 分辨「自己寫迴圈加 sleep」與「blink() 在背景閃爍」兩種寫法
- 依序控制多顆 LED,做出紅綠燈的時序
讓程式控制真實世界的第一步
前面幾課把樹莓派裝好、連上線,也在終端機執行過 Python。這一課開始用 Python 控制接在 GPIO 腳位上的零件。 第一個零件是 LED:它只有亮和暗兩種狀態,最適合用來確認「程式真的控制了硬體」。
這一課要回答:
- LED 要怎麼接到樹莓派,才不會燒壞 LED 或樹莓派?
- gpiozero 怎麼用幾行程式讓 LED 亮、暗、閃爍?
- 「程式一行一行等」和「交給函式庫在背景做」有什麼不同?
gpiozero:用物件描述零件
gpiozero 是樹莓派上的 Python 函式庫,Raspberry Pi OS(桌面版與 Lite 版)都已經內建。 它的想法是:接了什麼零件,就建立一個對應的物件。接了一顆 LED,就寫
from gpiozero import LED
led = LED(17)
17 是 BCM 編號(GPIO17,實體第 11 腳);gpiozero 預設用 BCM 編號(第 02 課的腳位圖可以查)。
建立物件時,gpiozero 會把這支腳位設成輸出。之後呼叫 led.on(),腳位輸出 3.3V;led.off() 輸出 0V。
LED 與限流電阻怎麼接
LED(發光二極體)有方向性:電流只能從長腳(正極、陽極)流向短腳(負極、陰極)。接法:
GPIO17(實體第 11 腳)──[ 330Ω ]──▶|── GND(實體第 9 腳)
長腳 短腳
LED 一定要串聯一顆限流電阻。樹莓派官方文件寫明:單一 GPIO 腳位最多提供約 16 mA,所有 GPIO 合計約 50 mA; LED 直接接在 3.3V 上,電流可能超過這個上限,傷到 LED 或樹莓派的晶片。
電阻值的估算方式(「自造者入門」軌第 03 課會詳細練習):
電流 =(電源電壓 - LED 的順向電壓)÷ 電阻
=(3.3V - 2.0V)÷ 330Ω
≈ 0.0039A = 3.9 mA → 遠低於單腳 16 mA 的上限
紅色 LED 的順向電壓大約 2V,藍色、白色大約 3V,以你手上 LED 的規格為準。電阻大一點只是比較暗,比太小安全; 220Ω 到 1kΩ 都很常見。
接線前先關機、拔掉電源;接好、檢查過再通電。這個習慣可以避免大部分的意外。
逐步看:on、off、toggle 與 value
上方的電路畫面會跟著每一步更新:執行完 led.on() 之後 LED 才亮起來。
sleep(1) 讓「虛擬時間」一口氣前進 1 秒(看左上角的時間)。注意 is_lit 讀到的是 True/False,value 讀到的是 1/0。
自己等,還是交給 gpiozero 在背景做
上面的程式一行一行執行,sleep() 的時候程式停在那裡等。要讓 LED 一直閃,可以寫成無窮迴圈:
while True:
led.on()
sleep(0.5)
led.off()
sleep(0.5)
gpiozero 另外提供 led.blink(on_time, off_time):呼叫之後立刻回來,閃爍由函式庫在背景處理,
你的程式可以繼續做別的事(例如讀感測器)。但 Python 程式跑到最後一行就會結束,結束時 gpiozero 會把腳位關掉,
所以背景閃爍的程式最後常加一行 pause()(來自標準函式庫的 signal 模組),讓程式停在那裡,直到按 Ctrl+C 中斷。
在模擬器裡,
pause()會等到模擬時間結束,畫面顯示「模擬時間到」,不是程式出錯。
逐步看:blink() 在背景閃爍
這個範例只有幾步:第 5 行一執行完就到第 6 行印出訊息,LED 還在閃。拖到最後一步看時間:程式停在 pause(),LED 在這段時間裡自己閃了好幾次。
逐步看:紅綠燈
三顆 LED 各接一支腳位(GPIO17、27、22)。light() 函式一次設定三顆燈,再等一段時間;這樣寫比較好讀,也不容易漏掉某一顆。
小測驗:接線與電流
執行 led = LED(17) 再執行 led.on(),樹莓派實體第 11 腳的電壓大約是多少?
紅色 LED 順向電壓約 2V,串一顆 330Ω 電阻接在 GPIO 上,電流大約多少?
下面哪一種接法最不安全?
小測驗:gpiozero 程式
下面的程式會印出什麼?
from gpiozero import LED
led = LED(17)
led.on()
led.toggle()
led.toggle()
print(led.is_lit, led.value)
led.blink(on_time=0.1, off_time=0.4) 會讓 LED 怎麼閃?
重點整理
- LED 長腳經過限流電阻接 GPIO、短腳接 GND;樹莓派單一 GPIO 約 16 mA、全部合計約 50 mA,電阻常用 220Ω~1kΩ。
LED(17)建立 LED 物件(BCM 編號);on()、off()、toggle()控制亮暗,is_lit與value讀狀態。- 自己寫
while True加sleep():程式一行一行等;blink():交給 gpiozero 在背景閃,最後用pause()讓程式不要結束。 - 多顆 LED 用函式一次設定好再等待,時序比較清楚。
下一課讀取按鈕:腳位設成輸入,讓程式知道外面發生了什麼事。