Raspberry Pi 使用 Python 操作 GPIO 教材

從 GPIO 基本觀念、腳位模式、輸入輸出控制,到 LED、按鈕、PWM 與感測器入門,建立 Raspberry Pi 實作基礎。

適合電子系、IoT、嵌入式系統、智慧控制等課程。

Raspberry Pi GPIO Python 硬體控制

一、教學目標

  • 理解 Raspberry Pi GPIO 的用途
  • 熟悉腳位編號方式
  • 學會用 Python 控制 LED 與讀取按鈕
  • 理解 PWM 的基本概念
  • 具備接感測器與控制元件的入門能力

二、GPIO 是什麼

  • GPIO 是 General Purpose Input/Output
  • 可讓 Raspberry Pi 與外部硬體互動
  • 可用來讀取感測器、控制 LED、蜂鳴器、繼電器等元件
  • 是實作 IoT 與硬體控制的重要基礎
Raspberry Pi GPIO 為 3.3V 邏輯,不能直接接 5V 訊號,否則可能損壞主板。

三、安裝前準備

建議材料

建議系統確認

python3 --version
uname -a

四、安裝 Python GPIO 套件

傳統常見為 RPi.GPIO,較新也可使用 gpiozero。教學上建議兩者都介紹,但入門可先從 gpiozero 開始。

安裝方式

sudo apt update
sudo apt install -y python3-gpiozero python3-rpi.gpio

若要額外用 pip 安裝

python3 -m pip install gpiozero
如果是教學入門,我會偏好先教 gpiozero,因為語法更直觀。

五、GPIO 腳位編號方式

模式 說明
BOARD以實體針腳位置編號
BCM以 Broadcom GPIO 編號

例如:

上課時一定要強調編號模式不能混用,這是初學者最常出錯的地方之一。

六、第一個範例, 讓 LED 閃爍

接線建議

gpiozero 範例

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

七、使用 RPi.GPIO 控制 LED

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()
`GPIO.cleanup()` 很重要,能在程式結束時釋放腳位狀態。

八、按鈕輸入範例

接線概念

gpiozero 範例

from gpiozero import Button
from signal import pause

button = Button(18)

button.when_pressed = lambda: print("按鈕被按下")
button.when_released = lambda: print("按鈕放開")

pause()

RPi.GPIO 範例

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()

九、按鈕控制 LED

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, 控制 LED 亮度

PWM 是 Pulse Width Modulation,可用來模擬類比輸出效果,例如調整 LED 亮度。

gpiozero 範例

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 版本
`pinout` 很好用,教學時可以讓學生快速理解實體腳位與 BCM 腳位對應。

十五、常見錯誤與排除

問題 可能原因 解法
LED 不亮接線錯誤、腳位號碼錯誤、極性接反重新檢查接線與程式腳位
按鈕沒反應pull-up / pull-down 設定錯誤確認輸入模式與接線邏輯
Permission denied權限不足確認執行環境與系統設定
腳位被占用其他程式尚未釋放 GPIO重開機或確認 cleanup() 是否執行
板子異常發熱短路或 5V 誤接 GPIO立即斷電檢查電路

十六、課堂建議流程

  1. 先講 GPIO 與 3.3V 安全概念
  2. 示範腳位編號模式
  3. 先做 LED 閃爍
  4. 再做按鈕輸入
  5. 再做按鈕控制 LED
  6. 最後加入蜂鳴器或感測器
這樣的教學節奏很順,學生能從最簡單的輸出,逐步理解輸入與互動控制。

十七、作業與實驗題目建議

  1. 完成 LED 閃爍程式
  2. 完成按鈕輸入偵測
  3. 完成按鈕控制 LED
  4. 完成 PWM 亮度控制
  5. 進階題,設計一個警報或門鈴系統

十八、延伸方向

十九、結語

Raspberry Pi 的 GPIO 是 Python 與硬體世界連接的第一步。只要學生把 LED、按鈕、PWM 這些基本操作學會,後續延伸到感測器、IoT、網頁控制與自動化就會非常自然。