從 GPIO 基本觀念、腳位模式、輸入輸出控制,到 LED、按鈕、PWM 與感測器入門,建立 Raspberry Pi 實作基礎。
適合電子系、IoT、嵌入式系統、智慧控制等課程。
python3 --version
uname -a
傳統常見為 RPi.GPIO,較新也可使用 gpiozero。教學上建議兩者都介紹,但入門可先從 gpiozero 開始。
sudo apt update
sudo apt install -y python3-gpiozero python3-rpi.gpio
python3 -m pip install gpiozero
gpiozero,因為語法更直觀。| 模式 | 說明 |
|---|---|
| BOARD | 以實體針腳位置編號 |
| BCM | 以 Broadcom GPIO 編號 |
例如:
from gpiozero import LED
from time import sleep
led = LED(17)
while True:
led.on()
sleep(1)
led.off()
sleep(1)
python3 led_blink.py
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
try:
while True:
GPIO.output(17, GPIO.HIGH)
time.sleep(1)
GPIO.output(17, GPIO.LOW)
time.sleep(1)
except KeyboardInterrupt:
print("程式結束")
finally:
GPIO.cleanup()
from gpiozero import Button
from signal import pause
button = Button(18)
button.when_pressed = lambda: print("按鈕被按下")
button.when_released = lambda: print("按鈕放開")
pause()
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)
try:
while True:
if GPIO.input(18) == GPIO.LOW:
print("Button Pressed")
time.sleep(0.1)
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
from gpiozero import LED, Button
from signal import pause
led = LED(17)
button = Button(18)
button.when_pressed = led.on
button.when_released = led.off
pause()
PWM 是 Pulse Width Modulation,可用來模擬類比輸出效果,例如調整 LED 亮度。
from gpiozero import PWMLED
from time import sleep
led = PWMLED(17)
while True:
led.value = 0.2
sleep(1)
led.value = 0.5
sleep(1)
led.value = 1.0
sleep(1)
from gpiozero import Buzzer
from time import sleep
buzzer = Buzzer(22)
while True:
buzzer.on()
sleep(0.5)
buzzer.off()
sleep(0.5)
若感測器輸出為高低電位,例如紅外線避障模組、傾倒感測器、震動開關等,可直接當作數位輸入讀取。
from gpiozero import DigitalInputDevice
from signal import pause
sensor = DigitalInputDevice(23)
sensor.when_activated = lambda: print("偵測到訊號")
sensor.when_deactivated = lambda: print("訊號消失")
pause()
按鈕按下時,LED 亮起且蜂鳴器響。
from gpiozero import LED, Button, Buzzer
from signal import pause
led = LED(17)
button = Button(18)
buzzer = Buzzer(22)
def alarm_on():
led.on()
buzzer.on()
def alarm_off():
led.off()
buzzer.off()
button.when_pressed = alarm_on
button.when_released = alarm_off
pause()
| 指令 | 用途 |
|---|---|
python3 檔名.py | 執行 Python GPIO 程式 |
gpio readall | 查看 GPIO 狀態,部分系統才有 |
pinout | 顯示 Raspberry Pi 腳位圖 |
python3 --version | 查看 Python 版本 |
| 問題 | 可能原因 | 解法 |
|---|---|---|
| LED 不亮 | 接線錯誤、腳位號碼錯誤、極性接反 | 重新檢查接線與程式腳位 |
| 按鈕沒反應 | pull-up / pull-down 設定錯誤 | 確認輸入模式與接線邏輯 |
| Permission denied | 權限不足 | 確認執行環境與系統設定 |
| 腳位被占用 | 其他程式尚未釋放 GPIO | 重開機或確認 cleanup() 是否執行 |
| 板子異常發熱 | 短路或 5V 誤接 GPIO | 立即斷電檢查電路 |
Raspberry Pi 的 GPIO 是 Python 與硬體世界連接的第一步。只要學生把 LED、按鈕、PWM 這些基本操作學會,後續延伸到感測器、IoT、網頁控制與自動化就會非常自然。