National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 05

點亮 LED:gpiozero 入門

輸出腳位、限流電阻與讓 LED 閃爍
Interaction 25 minute(s)

Learning Objectives

  • 把 LED 經過限流電阻接到 GPIO17,說明每個元件的作用
  • 用 gpiozero 的 LED 類別控制亮暗:on()、off()、toggle()、value
  • 分辨「自己寫迴圈加 sleep」與「blink() 在背景閃爍」兩種寫法
  • 依序控制多顆 LED,做出紅綠燈的時序

讓程式控制真實世界的第一步

前面幾課把樹莓派裝好、連上線,也在終端機執行過 Python。這一課開始用 Python 控制接在 GPIO 腳位上的零件。 第一個零件是 LED:它只有亮和暗兩種狀態,最適合用來確認「程式真的控制了硬體」。

這一課要回答:

  1. LED 要怎麼接到樹莓派,才不會燒壞 LED 或樹莓派?
  2. gpiozero 怎麼用幾行程式讓 LED 亮、暗、閃爍?
  3. 「程式一行一行等」和「交給函式庫在背景做」有什麼不同?

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() 會等到模擬時間結束,畫面顯示「模擬時間到」,不是程式出錯。

逐步看:紅綠燈

三顆 LED 各接一支腳位(GPIO17、27、22)。light() 函式一次設定三顆燈,再等一段時間;這樣寫比較好讀,也不容易漏掉某一顆。

互動練習:控制閃爍的節奏

在下面改程式,按「模擬執行」。模擬結束後會照真實速度播放,也可以拖曳時間軸。依序完成任務:

  1. 先直接執行起始程式,看 LED 每 2 秒閃一次。
  2. 讓 LED 在 5 秒內至少閃 8 次。
  3. 讓 LED 每 0.4 秒亮一次(亮 0.2 秒、暗 0.2 秒),可以用迴圈,也可以改用 blink() 加 pause()。
  4. 回答一個問題。

小測驗:接線與電流

1.

執行 led = LED(17) 再執行 led.on(),樹莓派實體第 11 腳的電壓大約是多少?

2.

紅色 LED 順向電壓約 2V,串一顆 330Ω 電阻接在 GPIO 上,電流大約多少?

3.

下面哪一種接法最不安全?

第 1 次作答

小測驗:gpiozero 程式

1.

下面的程式會印出什麼?

from gpiozero import LED
led = LED(17)
led.on()
led.toggle()
led.toggle()
print(led.is_lit, led.value)
2.

led.blink(on_time=0.1, off_time=0.4) 會讓 LED 怎麼閃?

第 1 次作答

重點整理

  • 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 用函式一次設定好再等待,時序比較清楚。

下一課讀取按鈕:腳位設成輸入,讓程式知道外面發生了什麼事。

這一課完成了!
Next lesson:按鈕輸入與事件
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。