1. 前言
前面的 Raspberry Pi GPIO 實作中,我們已經學會如何利用 GPIO 控制 LED、讀取按鍵、產生 PWM 訊號,以及透過 I²C、SPI、UART 與外部模組通訊。
但是實際進入 Raspberry Pi 自動控制與 IoT 專題之後,很快就會遇到一個重要問題:
Raspberry Pi GPIO 可以直接控制馬達、繼電器、風扇或伺服馬達嗎?
答案是:
不能把大部分外部負載直接接到 Raspberry Pi GPIO。
Raspberry Pi GPIO 是用來輸出控制訊號,而不是提供大電流給外部設備。
例如:
- LED:約 5~15 mA
- 繼電器線圈:可能需要數十 mA
- SG90 伺服馬達:瞬間可能需要數百 mA
- DC 馬達:啟動電流可能超過 500 mA
- 水泵:可能需要數百 mA~數 A
- 風扇:通常需要 100 mA 以上
因此我們必須加入:
- 電晶體
- MOSFET
- 馬達驅動器
- 繼電器模組
- 外部電源
讓 Raspberry Pi 負責「控制」,真正的電力則由外部電源負責提供。
本章將分別介紹三種 Raspberry Pi 非常重要的外部控制方式:
- Relay 繼電器控制
- DC 直流馬達控制
- Servo 伺服馬達控制
並學習非常重要的:
- GPIO 電流限制
- 共地
- 外部電源
- Flyback Diode
- MOSFET
- PWM
- 馬達啟動電流
- 電源隔離
這些都是日後製作 Raspberry Pi 自動控制系統的重要基礎。
2. Raspberry Pi GPIO 為什麼不能直接驅動馬達?
Raspberry Pi GPIO 是 3.3V 邏輯電位。
GPIO 的主要用途是:
輸出 HIGH / LOW
讀取 HIGH / LOW
產生 PWM
傳送數位訊號
它不是電源輸出端。
例如:
Raspberry Pi GPIO
│
│ 控制訊號
▼
MOSFET / Relay
│
│ 大電流
▼
馬達
GPIO 只負責告訴控制元件:
ON
OFF
或:
速度 = 30%
速度 = 50%
速度 = 100%
真正驅動馬達的電流來自外部電源。
3. Raspberry Pi GPIO 的重要限制
使用外部負載之前,首先要記住 Raspberry Pi GPIO 的幾個原則。
GPIO 邏輯電壓
Raspberry Pi GPIO 使用:
3.3V Logic
因此 HIGH 約為:
3.3V
而不是 Arduino UNO 常見的:
5V
4. 千萬不要將 5V 直接送進 GPIO
這是 Raspberry Pi 初學者非常常見的錯誤。
Raspberry Pi GPIO:
不是 5V tolerant
也就是:
GPIO 輸入腳位不可直接承受 5V 訊號。
錯誤:
5V
│
└──────── GPIO17
可能直接造成 Raspberry Pi GPIO 或 SoC 損壞。
正確的方法可能需要:
Level Shifter
或:
Voltage Divider
5. 外部負載控制的基本架構
典型 Raspberry Pi 外部負載控制架構如下:
Raspberry Pi
┌──────────────┐
│ │
GPIO ───────┤ Control │
│ │
GND ────────┤ GND │
└──────────────┘
│
▼
Driver Circuit
┌─────────────────┐
│ MOSFET / Relay │
│ Motor Driver │
└─────────────────┘
│
▼
External Load
┌──────────────┐
│ Motor / Fan │
│ Pump / Relay │
└──────────────┘
▲
│
External Power
核心概念是:
Raspberry Pi 負責控制,外部電源負責供電。
6. 第一個實作:Raspberry Pi 控制繼電器
繼電器英文為:
Relay
它是一種利用低功率控制訊號控制另一個電路開關的裝置。
常見 Raspberry Pi 繼電器模組有:
- 1 Channel Relay
- 2 Channel Relay
- 4 Channel Relay
- 8 Channel Relay
7. 繼電器的 COM、NO、NC
一般 Relay 有三個輸出端:
COM
NO
NC
其中:
| 接點 | 名稱 | 說明 |
|---|---|---|
| COM | Common | 共用端 |
| NO | Normally Open | 平常斷開 |
| NC | Normally Closed | 平常導通 |
例如我們希望 Raspberry Pi 開啟 Relay 時風扇才啟動,可以使用:
COM
NO
其狀態為:
Relay OFF
COM NO
O O
斷開
Relay ON:
COM ───── NO
導通
8. Raspberry Pi 與 Relay 模組接線
假設使用:
Raspberry Pi
1 Channel Relay Module
並使用:
GPIO17
BCM GPIO17 對應實體 Pin 11。
接線:
| Raspberry Pi | Relay |
|---|---|
| GPIO17 | IN |
| GND | GND |
| 模組指定電源 | VCC |
概念如下:
Raspberry Pi Relay Module
GPIO17 -------------------- IN
GND ----------------------- GND
Power --------------------- VCC
要特別注意:
不同 Relay 模組的輸入電壓、VCC/JD-VCC 架構以及 HIGH/LOW 觸發方式不同,接線前必須確認模組規格。
9. Relay 有 HIGH Trigger 與 LOW Trigger
有些 Relay 是:
HIGH Level Trigger
也就是:
GPIO HIGH → Relay ON
GPIO LOW → Relay OFF
但非常多市售 Relay 模組使用:
LOW Level Trigger
其結果剛好相反:
GPIO LOW → Relay ON
GPIO HIGH → Relay OFF
如果程式邏輯與預期相反,第一個要檢查的就是 Relay 模組屬於:
Active HIGH
還是:
Active LOW
10. Python 使用 gpiozero 控制 Relay
Raspberry Pi Python GPIO 控制可以使用:
gpiozero
基本程式:
from gpiozero import OutputDevice
from time import sleep
relay = OutputDevice(17, active_high=True, initial_value=False)
while True:
print("Relay ON")
relay.on()
sleep(2)
print("Relay OFF")
relay.off()
sleep(2)
程式執行後:
Relay ON
等待 2 秒
Relay OFF
等待 2 秒
不斷循環。
11. LOW Trigger Relay 程式
如果你的 Relay 是:
LOW Level Trigger
可設定:
active_high=False
完整程式:
from gpiozero import OutputDevice
from time import sleep
relay = OutputDevice(
17,
active_high=False,
initial_value=False
)
while True:
relay.on()
print("Relay ON")
sleep(2)
relay.off()
print("Relay OFF")
sleep(2)
使用 gpiozero 的好處是:
relay.on()
relay.off()
可以保持程式語意清楚,不必在主程式中一直記:
LOW = ON
HIGH = OFF
12. Relay 可以控制什麼?
繼電器非常適合控制:
風扇
水泵
電磁閥
燈具
蜂鳴器
DC 負載
其他低速 ON/OFF 設備
例如:
DHT22
│
▼
Raspberry Pi
│
▼
Relay
│
▼
Fan
就可以變成:
溫度過高自動開啟風扇。
13. 第二個實作:Raspberry Pi 控制 DC 馬達
接下來控制:
DC Motor
例如常見的小型直流馬達:
3V Motor
5V Motor
6V Motor
12V Motor
但這裡必須先強調:
DC 馬達不能直接連接 Raspberry Pi GPIO。
錯誤方式:
GPIO17 ───── Motor ───── GND
這可能造成:
- GPIO 過電流
- Raspberry Pi 當機
- 系統重新開機
- GPIO 損壞
- SoC 損壞
14. 為什麼馬達會產生反向電壓?
馬達本質上包含線圈。
當馬達電流突然中斷時,線圈可能產生反向感應電壓:
Back EMF
因此在簡單的電晶體/MOSFET 驅動架構中,通常需要加入:
Flyback Diode
也稱:
Freewheeling Diode
Flywheel Diode
Protection Diode
15. Flyback Diode 的作用
概念:
+5V
│
│
Motor
│
├────────┐
│ │
│ Diode
│ │
MOSFET │
│ │
└────────┘
│
GND
它的目的不是幫馬達供電,而是在關閉馬達時提供感應電流釋放路徑,降低反向電壓傷害驅動元件的風險。
16. 使用 MOSFET 控制 DC Motor
對 Raspberry Pi 來說,MOSFET 是非常重要的功率控制元件。
基本架構:
Raspberry Pi GPIO
│
▼
Gate
│
MOSFET
│
▼
DC Motor
MOSFET 就像電子開關。
GPIO:
HIGH
MOSFET:
ON
馬達:
RUN
GPIO:
LOW
MOSFET:
OFF
馬達:
STOP
17. Raspberry Pi 要使用適合 3.3V 控制的 MOSFET
這一點非常重要。
因為 Raspberry Pi GPIO 只有:
3.3V
因此最好選擇在低 Gate 電壓時就能充分導通、且資料表明確提供相應導通電阻規格的 MOSFET 或專用驅動模組。
不要只看到元件標示:
Logic Level MOSFET
就直接假設它一定適合 Raspberry Pi。
應確認 datasheet 中:
RDS(on)
是否有在接近:
2.5V
3.0V
3.3V
的 Gate 電壓條件下提供規格。
18. MOSFET 馬達基本接線
例如:
External 5V
│
│
Motor
│
├──────── Flyback Diode
│
MOSFET
│
GND
控制端:
GPIO18 ───── Gate
並建議加入:
Gate Resistor
Gate Pull-down Resistor
概念:
GPIO18
│
220Ω
│
├──── MOSFET Gate
│
10kΩ
│
GND
10kΩ Pull-down 可以避免 Raspberry Pi 開機期間 GPIO 還沒有初始化時,MOSFET Gate 漂浮造成馬達誤啟動。
19. 共地非常重要
如果 Raspberry Pi 與馬達使用不同電源:
Raspberry Pi Power
Motor Power
而控制電路不是完整光耦隔離架構,通常必須讓兩邊具有共同參考電位:
Raspberry Pi GND
│
└──────── Motor Power GND
也就是:
Common Ground
例如:
Raspberry Pi Motor Power
GPIO18 ------ MOSFET Gate
GND ----------+------------- GND
|
+--- MOSFET Source
如果沒有共地,GPIO 的 3.3V 對 MOSFET Gate 而言可能沒有正確的參考基準。
20. Python 控制 DC Motor ON/OFF
使用 GPIO18:
from gpiozero import Motor
from time import sleep
如果只是使用單顆 MOSFET 做單方向控制,也可以直接使用:
from gpiozero import OutputDevice
from time import sleep
motor = OutputDevice(18)
while True:
print("Motor ON")
motor.on()
sleep(3)
print("Motor OFF")
motor.off()
sleep(3)
21. 使用 PWM 控制 DC Motor 速度
若 MOSFET 與馬達適合使用 PWM 控制,就能控制馬達平均輸入功率。
例如:
from gpiozero import PWMOutputDevice
from time import sleep
motor = PWMOutputDevice(18)
while True:
print("Motor 30%")
motor.value = 0.3
sleep(3)
print("Motor 60%")
motor.value = 0.6
sleep(3)
print("Motor 100%")
motor.value = 1.0
sleep(3)
print("Motor STOP")
motor.value = 0
sleep(3)
其中:
motor.value = 0
代表:
0%
而:
motor.value = 1.0
代表:
100%
因此:
motor.value = 0.5
就是大約:
50% Duty Cycle
22. 為什麼低 PWM 時馬達可能不轉?
例如設定:
motor.value = 0.1
不代表馬達一定可以用 10% 的速度穩定運轉。
馬達啟動時需要克服:
- 靜摩擦力
- 軸承阻力
- 負載
- 啟動轉矩
因此可能出現:
10% → 不轉
20% → 不轉
30% → 開始轉
每一顆馬達的最低啟動 Duty Cycle 都可能不同。
23. DC Motor 想要正反轉怎麼辦?
單顆 MOSFET 通常只能做到:
ON
OFF
速度控制
如果要做到:
Forward
Reverse
Brake
Stop
則應使用:
H-Bridge Motor Driver
常見馬達驅動模組包括:
L298N
TB6612FNG
DRV8833
其基本架構為:
Raspberry Pi
GPIO ──────────────┐
GPIO ──────────────┤
PWM ──────────────┤
▼
Motor Driver
H-Bridge
│
┌─────┴─────┐
│ │
Motor + Motor -
24. H-Bridge 是什麼?
H-Bridge 可以改變流過馬達的電流方向。
例如:
Direction A
+V → Motor → GND
馬達:
順時針
換成:
Direction B
GND ← Motor ← +V
馬達:
逆時針
因此 H-Bridge 是:
Raspberry Pi 機器人與輪式車輛中最重要的馬達控制電路之一。
25. 第三個實作:Raspberry Pi 控制 Servo 伺服馬達
接下來控制:
Servo Motor
常見入門 Servo:
SG90
SG90 是非常熱門的小型伺服馬達。
通常有三條線:
| 顏色 | 功能 |
|---|---|
| Brown / Black | GND |
| Red | Power |
| Orange / Yellow | Signal |
不同廠牌可能有不同顏色,因此仍應確認 Servo 規格。
26. Servo 與一般 DC Motor 不一樣
一般 DC Motor 通常控制:
Speed
Direction
而一般位置型 Servo 控制的是:
Angle
例如:
0°
45°
90°
135°
180°
因此 Servo 很適合:
- 機械手臂
- 攝影機雲台
- 自動門
- 指針
- 閥門
- 機器人關節
- 感測器旋轉平台
27. Servo 內部包含什麼?
Servo 不只是馬達。
典型 Servo 內部包含:
DC Motor
Gearbox
Position Sensor
Control Circuit
概念:
PWM Signal
│
▼
Control Circuit
│
▼
DC Motor
│
▼
Gearbox
│
▼
Output Shaft
▲
│
Position Feedback
因此 Raspberry Pi 不需要自己建立完整的位置控制迴路,只要提供適當控制訊號即可。
28. SG90 為什麼不建議直接由 GPIO 供電?
要分清楚兩件事:
Servo Signal
Servo Power
Servo Signal 可以由 Raspberry Pi GPIO 提供。
但是 Servo 馬達本身的電源需求比 GPIO 大得多。
錯誤:
GPIO17 ─── Servo VCC
這是絕對不可以的。
GPIO 只能連接:
Servo Signal
29. Servo 建議使用外部 5V 電源
典型接線:
Raspberry Pi SG90
GPIO18 -------------------- Signal
GND ----------------------- GND
│
External 5V GND ------------┘
External 5V + -------------- VCC
也就是:
+---------------- Servo Signal
|
GPIO18 ---+
Raspberry Pi GND -----+
|
External 5V GND ------+------ Servo GND
External 5V + --------------- Servo VCC
30. 為什麼 Servo 容易讓 Raspberry Pi 重開機?
Servo 在:
- 啟動
- 快速轉動
- 堵轉
- 負載增加
時可能瞬間需要很大的電流。
如果 Raspberry Pi 與 Servo 共用一個供電能力不足的電源,就可能發生:
Voltage Drop
結果:
Servo 開始動
↓
電壓下降
↓
Raspberry Pi Undervoltage
↓
系統不穩
↓
Restart
因此實際專案最好:
Raspberry Pi 與 Servo 的供電容量要經過完整計算,Servo 通常使用足夠電流能力的獨立電源較安全。
31. Raspberry Pi 使用 gpiozero 控制 Servo
基本程式:
from gpiozero import Servo
from time import sleep
servo = Servo(18)
while True:
print("Minimum")
servo.min()
sleep(1)
print("Center")
servo.mid()
sleep(1)
print("Maximum")
servo.max()
sleep(1)
Servo 的 value 通常介於:
-1.0 ~ +1.0
例如:
servo.value = -1
一端。
servo.value = 0
中央。
servo.value = 1
另一端。
32. 使用 AngularServo 直接使用角度
gpiozero 還提供:
AngularServo
讓程式更容易閱讀。
例如:
from gpiozero import AngularServo
from time import sleep
servo = AngularServo(
18,
min_angle=0,
max_angle=180
)
while True:
servo.angle = 0
print("0 degree")
sleep(1)
servo.angle = 90
print("90 degree")
sleep(1)
servo.angle = 180
print("180 degree")
sleep(1)
servo.angle = 90
sleep(1)
程式就非常直觀:
servo.angle = 90
代表要求 Servo 移動到約:
90°
33. Servo 的角度不一定真的等於 0~180°
這是實作時非常重要的一點。
即使 Servo 標示:
180 Degree
實際可安全運動範圍可能是:
10° ~ 170°
或其他範圍。
如果 PWM 脈衝超出 Servo 的機械限制,可能發生:
Servo buzzing
Gear stress
High current
Motor overheating
因此不要看到:
0~180°
就直接長時間讓 Servo 撞到兩側機械極限。
34. 調整 Servo Pulse Width
如果 SG90 的角度不準確,可以調整:
min_pulse_width
max_pulse_width
例如:
from gpiozero import AngularServo
from time import sleep
servo = AngularServo(
18,
min_angle=0,
max_angle=180,
min_pulse_width=0.0005,
max_pulse_width=0.0025
)
servo.angle = 90
sleep(2)
不過不同 Servo 的實際脈波範圍可能不同,因此應逐步校正,而不是直接假設所有 Servo 都使用完全相同的數值。
35. Servo Sweep 掃描程式
接下來製作一個:
0° → 180°
180° → 0°
持續掃描的程式。
from gpiozero import AngularServo
from time import sleep
servo = AngularServo(
18,
min_angle=0,
max_angle=180
)
while True:
for angle in range(0, 181, 10):
servo.angle = angle
print("Angle:", angle)
sleep(0.2)
for angle in range(180, -1, -10):
servo.angle = angle
print("Angle:", angle)
sleep(0.2)
執行後 Servo 會逐步:
0
10
20
30
...
170
180
再:
180
170
160
...
10
0
36. 使用按鍵控制 Servo
我們可以把前面章節學過的 GPIO Input 與 Servo 結合。
例如:
Button 1 → Servo 左轉
Button 2 → Servo 右轉
程式:
from gpiozero import AngularServo, Button
from time import sleep
servo = AngularServo(
18,
min_angle=0,
max_angle=180
)
left_button = Button(17, pull_up=True)
right_button = Button(27, pull_up=True)
angle = 90
servo.angle = angle
while True:
if left_button.is_pressed:
angle -= 5
if angle < 0:
angle = 0
servo.angle = angle
print("Angle:", angle)
sleep(0.15)
if right_button.is_pressed:
angle += 5
if angle > 180:
angle = 180
servo.angle = angle
print("Angle:", angle)
sleep(0.15)
sleep(0.01)
這就形成簡單的人機控制:
Left Button
│
▼
Raspberry Pi
│
▼
Servo ←── Right Button
37. 綜合實作:溫度過高自動開啟風扇
現在可以把前面 DHT11 / DHT22 章節與本章結合。
系統:
DHT22
│
│ Temperature
▼
Raspberry Pi
│
▼
Relay / MOSFET
│
▼
Cooling Fan
控制邏輯:
Temperature >= 30°C
↓
Fan ON
Temperature <= 28°C
↓
Fan OFF
為什麼不是:
30°C ON
30°C OFF
?
因為這樣在 30°C 附近可能變成:
ON
OFF
ON
OFF
ON
OFF
因此加入:
Hysteresis
也就是:
30°C ON
28°C OFF
38. Relay 與 MOSFET 要如何選?
很多初學者會問:
控制風扇時到底應該使用 Relay 還是 MOSFET?
可以用以下方式判斷。
Relay
適合:
單純 ON / OFF
低切換頻率
需要接點隔離
例如:
Fan ON
Fan OFF
Pump ON
Pump OFF
MOSFET
適合:
DC Load
快速切換
PWM
速度控制
安靜
高頻率操作
例如:
DC Fan Speed
LED Dimming
DC Motor Speed
因此如果要控制:
DC Motor Speed
一般會優先考慮:
MOSFET
或:
Motor Driver
而不是機械式 Relay。
39. Relay 不適合高速 PWM
機械式 Relay 內部有實體接點。
如果寫:
relay.on()
sleep(0.01)
relay.off()
sleep(0.01)
讓它高速切換,很容易:
- 產生噪音
- 接點磨損
- 壽命下降
- 無法正確跟上 PWM
因此:
Relay ≠ PWM Motor Speed Controller
高速控制應使用:
MOSFET
Transistor
Motor Driver
40. Relay、MOSFET、H-Bridge 比較
| 控制方式 | ON/OFF | PWM | 正反轉 | 適合負載 |
|---|---|---|---|---|
| Relay | ✓ | × | 需更多接點 | 各種開關負載 |
| MOSFET | ✓ | ✓ | 單顆通常 × | DC 負載 |
| H-Bridge | ✓ | ✓ | ✓ | DC Motor |
| Servo Driver | ✓ | PWM 控制 | 角度控制 | Servo |
41. Servo 不等於 PWM 調速馬達
Servo 雖然也使用週期性控制脈衝,但目的與 DC 馬達 PWM 調速不同。
DC Motor:
PWM Duty Cycle
│
▼
Average Power
│
▼
Speed
Servo:
Control Pulse
│
▼
Target Position
│
▼
Servo Angle
兩者不能混為一談。
42. 多顆 Servo 應該怎麼辦?
如果只有:
1 Servo
可以直接由 Raspberry Pi GPIO 輸出控制訊號。
但如果系統有:
4 Servo
8 Servo
16 Servo
可以考慮使用專用 PWM Driver,例如常見的:
PCA9685
架構:
Raspberry Pi
│
│ I²C
▼
PCA9685
│
┌───┼───┬───┐
▼ ▼ ▼ ▼
S1 S2 S3 S4 ...
這樣可以減少 Raspberry Pi 自己管理大量 Servo PWM 的負擔。
43. 外部電源容量如何估算?
例如 4 顆 Servo,每顆在某些負載情況可能需要:
500mA
如果直接計算:
4 × 500mA
就是:
2000mA
也就是:
2A
而 Servo 啟動與堵轉時的電流還可能更高。
因此實際電源設計應根據:
Servo Datasheet
實測 Stall Current
同時動作數量
安全裕量
來選擇電源。
不能只看:
5V
還要看:
A
也就是電流能力。
44. 電壓正確不代表電源就足夠
例如:
5V 500mA
與:
5V 3A
電壓都是:
5V
但可提供的最大電流完全不同。
如果四顆 Servo 需要:
2A+
而你使用:
5V 500mA
即使電壓標示正確,仍然可能發生:
Servo jitter
Servo reset
Raspberry Pi reboot
Voltage drop
45. 電源去耦的重要性
馬達是一種非常容易產生電源雜訊的負載。
實際系統可能加入:
Decoupling Capacitor
Bulk Capacitor
例如在馬達驅動或 Servo 電源附近放置適當的:
Electrolytic Capacitor
Ceramic Capacitor
協助降低瞬間電流變化造成的電源波動。
但實際容量仍應依:
- 電源
- 馬達
- 驅動器
- PCB
- 線長
- 負載
進行設計,而不是單純認為「電容越大越好」。
46. 馬達電源線不要使用太細的線
如果馬達需要較高電流,而線材太細:
Resistance ↑
就可能造成:
Voltage Drop ↑
例如:
Power Supply
│
│ 細長線
▼
Motor
可能實際到馬達端已經不是原本的供電電壓。
因此馬達與 Servo 系統還需要注意:
線徑
線長
端子
接頭
PCB Copper Width
47. Raspberry Pi 控制外部負載常見錯誤
錯誤一:直接使用 GPIO 驅動馬達
錯誤:
GPIO → Motor
正確:
GPIO → Driver → Motor
錯誤二:忘記 Flyback Diode
如果使用感性 DC 負載與離散開關元件,應確認是否需要:
Flyback Protection
錯誤三:Servo 由 GPIO 供電
錯誤:
GPIO → Servo VCC
正確:
GPIO → Servo Signal
External Power → Servo VCC
錯誤四:外部電源沒有共地
如果不是隔離式架構:
Raspberry Pi GND
與:
External Power GND
通常需要共地。
錯誤五:Relay Trigger 邏輯相反
如果:
relay.on()
結果 Relay 反而關閉,應檢查模組是:
Active HIGH
還是:
Active LOW
48. 錯誤六:忽略馬達 Stall Current
只看:
Normal Current
是不夠的。
馬達卡住時:
Stall Current
可能遠高於正常運轉電流。
所以選擇:
MOSFET
Motor Driver
Power Supply
Wire
Connector
時,都必須考慮啟動與堵轉電流。
49. 錯誤七:用 Relay 做高速控制
Relay 適合:
ON
OFF
而不是:
高速 PWM
需要高速控制請使用半導體元件。
50. 錯誤八:使用不適合 3.3V Gate Drive 的 MOSFET
如果 MOSFET 在:
VGS = 3.3V
時沒有充分導通,就可能:
RDS(on) 過高
↓
Power Loss
↓
MOSFET 發熱
因此要看的是實際 datasheet 規格,而不只是 MOSFET 的:
VGS(th)
51. 為什麼 VGS(th) 不能判斷 MOSFET 是否完全導通?
這是一個非常重要的電子概念。
Datasheet 中:
VGS(th)
通常只代表 MOSFET:
「剛開始有非常小電流流過」的 Gate Threshold。
它並不是:
「MOSFET 已完全打開」。
因此不能看到:
VGS(th) = 2V
就認為:
3.3V GPIO 一定可以完整驅動。
真正應該看:
RDS(on) @ VGS
例如是否提供:
RDS(on) @ 2.5V
或其他接近 Raspberry Pi GPIO 電壓的條件。
52. Raspberry Pi 控制外部負載的設計流程
未來遇到任何外部設備,都可以依照以下流程設計。
Step 1
先確認負載:
Voltage
Current
Starting Current
Stall Current
Step 2
確認控制類型:
ON/OFF
PWM
Forward/Reverse
Position
Step 3
選 Driver。
例如:
ON/OFF → Relay / MOSFET
Speed → MOSFET
Forward + Reverse → H-Bridge
Position → Servo / Servo Driver
Step 4
計算外部電源。
確認:
Voltage
Maximum Current
Safety Margin
Step 5
確認保護電路。
例如:
Flyback Diode
Fuse
Current Limit
Reverse Polarity Protection
Decoupling
Step 6
確認 Raspberry Pi 與外部電路的:
GND
Logic Level
Isolation
53. 實作專題:Raspberry Pi 自動風扇控制器
完成本章後,可以製作:
Raspberry Pi Smart Fan Controller
使用:
Raspberry Pi
DHT22
MOSFET
5V / 12V Fan
External Power
系統流程:
DHT22
│
▼
Read Temperature
│
▼
Temperature > 30°C ?
│ │
YES NO
│ │
▼ ▼
Fan ON Temperature < 28°C ?
│
YES
│
▼
Fan OFF
這已經是一個非常實用的:
Automatic Cooling System
54. 實作專題:Raspberry Pi 自動門
第二個專題:
Raspberry Pi
PIR Sensor
Servo
流程:
PIR
│
▼
Detect Person
│
▼
Servo 0° → 90°
│
▼
Wait
│
▼
Servo 90° → 0°
就可以製作簡易:
Automatic Door
55. 實作專題:Raspberry Pi 自動澆水系統
還可以搭配:
Soil Moisture Sensor
ADC
Relay
Water Pump
系統:
Soil Sensor
│
▼
ADC
│
▼
Raspberry Pi
│
▼
Soil Too Dry?
│
YES
│
▼
Relay ON
│
▼
Water Pump
完成:
Smart Irrigation System
56. 實作專題:Raspberry Pi 機器人車
使用:
Raspberry Pi
Motor Driver
2 × DC Motor
Battery
系統:
Raspberry Pi
│ │
PWM Direction
│ │
▼ ▼
H-Bridge
│ │
▼ ▼
Left Motor Right Motor
可以控制:
Forward
Backward
Turn Left
Turn Right
Stop
這就是 Raspberry Pi Robot Car 的基本架構。
57. 實作專題:攝影機自動雲台
利用:
2 × Servo
Raspberry Pi Camera
分別控制:
Pan
Tilt
架構:
Raspberry Pi
│
┌───────┴───────┐
▼ ▼
Pan Servo Tilt Servo
│ │
└──── Camera ────┘
未來再加入:
OpenCV
Object Detection
AI Vision
就能製作:
AI Auto Tracking Camera
58. 外部負載控制與 IoT
如果再將 Raspberry Pi 接上:
MQTT
Web API
Flask
Home Assistant
Node-RED
就能讓 Relay、Motor、Servo 透過網路控制。
例如:
Smartphone
│
Internet
│
▼
MQTT Broker
│
▼
Raspberry Pi
│
▼
Relay
│
▼
Fan
這就從 GPIO 實驗升級成:
IoT Remote Control System
59. Raspberry Pi Relay Web Control
未來可以設計:
http://raspberrypi/relay/on
執行:
relay.on()
而:
http://raspberrypi/relay/off
執行:
relay.off()
這樣任何:
Computer
Tablet
Smartphone
都可以透過網頁控制 Raspberry Pi 外部設備。
60. 安全注意事項
本章教學建議先使用:
3.3V
5V
6V
12V
等安全低電壓 DC 系統進行實驗。
尤其是 Relay 雖然可能標示可控制較高電壓,但:
不代表初學者就應直接操作市電。
市電存在:
- 觸電
- 火災
- 絕緣失效
- 電弧
- 接線錯誤
- 接地問題
等危險。
初學階段建議用:
低電壓 LED
低電壓風扇
低電壓水泵
低電壓馬達
進行 Relay 實驗。
涉及市電時,應使用符合相關安全規範的成品控制設備、適當外殼與保護元件,並由具備相關專業能力的人員處理。
61. Raspberry Pi 控制 Relay、Motor、Servo 比較表
| 項目 | Relay | DC Motor | Servo |
|---|---|---|---|
| 主要功能 | 開關 | 旋轉 | 角度 |
| GPIO 直接供電 | 不建議 | 不可 | 不可 |
| Driver | Relay Module | MOSFET / H-Bridge | Servo 控制電路 |
| 外部電源 | 建議 | 必須 | 強烈建議 |
| PWM | 不適合機械 Relay | 可 | 控制脈衝 |
| 正反轉 | 可透過特殊接法 | H-Bridge | 由位置命令控制 |
| 常見應用 | 電器開關 | 風扇、車輪 | 機械手臂 |
62. Raspberry Pi 外部控制的核心觀念
整個本章最重要的概念可以濃縮為:
GPIO ≠ Power Supply
Raspberry Pi GPIO 的工作是:
Control Signal
真正的:
Power
應由:
External Power Supply
提供。
因此:
Raspberry Pi
│
│ Signal
▼
Driver Circuit
│
│ Power
▼
External Load
才是正確架構。
63. 本章常用 GPIO 範例
本章示範使用:
| 功能 | BCM GPIO | Physical Pin |
|---|---|---|
| Relay | GPIO17 | Pin 11 |
| Motor PWM | GPIO18 | Pin 12 |
| Servo | GPIO18 | Pin 12 |
| Left Button | GPIO17 | Pin 11 |
| Right Button | GPIO27 | Pin 13 |
| GND | — | Pin 6 等 |
實際專案只要修改:
OutputDevice(17)
中的:
17
即可改用其他可用 GPIO。
但必須先確認該 GPIO 是否已經被:
- I²C
- SPI
- UART
- HAT
- 其他服務
使用。
64. 完整 Relay 測試程式
#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep
RELAY_PIN = 17
relay = OutputDevice(
RELAY_PIN,
active_high=False,
initial_value=False
)
try:
while True:
print("Relay ON")
relay.on()
sleep(2)
print("Relay OFF")
relay.off()
sleep(2)
except KeyboardInterrupt:
print("\nProgram stopped")
finally:
relay.off()
relay.close()
加入:
finally:
可以在程式結束時嘗試讓 Relay 回到關閉狀態。
對外部設備控制程式來說,這是一個很好的設計習慣。
65. 完整 DC Motor PWM 測試程式
#!/usr/bin/env python3
from gpiozero import PWMOutputDevice
from time import sleep
MOTOR_PIN = 18
motor = PWMOutputDevice(
MOTOR_PIN,
initial_value=0
)
try:
while True:
print("Motor 25%")
motor.value = 0.25
sleep(3)
print("Motor 50%")
motor.value = 0.50
sleep(3)
print("Motor 75%")
motor.value = 0.75
sleep(3)
print("Motor 100%")
motor.value = 1.00
sleep(3)
print("Motor STOP")
motor.value = 0
sleep(3)
except KeyboardInterrupt:
print("\nProgram stopped")
finally:
motor.value = 0
motor.close()
66. 完整 SG90 Servo 測試程式
#!/usr/bin/env python3
from gpiozero import AngularServo
from time import sleep
SERVO_PIN = 18
servo = AngularServo(
SERVO_PIN,
min_angle=0,
max_angle=180
)
try:
while True:
for angle in range(0, 181, 10):
servo.angle = angle
print(
"Servo angle:",
angle
)
sleep(0.2)
for angle in range(180, -1, -10):
servo.angle = angle
print(
"Servo angle:",
angle
)
sleep(0.2)
except KeyboardInterrupt:
print("\nProgram stopped")
finally:
servo.detach()
servo.close()
67. 常見問題 FAQ
Q1:Raspberry Pi GPIO 可以直接控制 Relay 嗎?
如果使用的是完整 Relay Module,必須確認:
Input Voltage
Input Current
Trigger Level
3.3V Compatibility
不能只看到模組有 IN 腳位就假設一定適合 Raspberry Pi。
Q2:Raspberry Pi GPIO 可以直接接 DC Motor 嗎?
不可以。
應使用:
MOSFET
Transistor
Motor Driver
H-Bridge
等驅動電路。
Q3:Servo 可以直接接 Raspberry Pi 嗎?
控制訊號可以由 GPIO 提供,但 Servo 電源不應由 GPIO 提供。
實際專案通常建議使用足夠容量的外部電源。
Q4:為什麼 Servo 一動 Raspberry Pi 就重新開機?
最常見原因之一是:
Power Supply Current Insufficient
Servo 啟動時造成:
Voltage Drop
進而讓 Raspberry Pi 發生 Undervoltage 或重開機。
Q5:為什麼 Servo 一直抖動?
可能原因包括:
Power Supply Noise
Ground Problem
PWM Timing
Weak Power Supply
Loose Wiring
Servo Quality
Mechanical Load
Q6:Relay 一直發出喀喀聲正常嗎?
如果程式讓 Relay 頻繁 ON/OFF,Relay 會產生機械動作聲。
如果需要高速切換,不應使用機械 Relay。
應考慮:
MOSFET
Solid State Switching
Motor Driver
Q7:Relay 為什麼程式 ON 反而關閉?
很可能使用:
Active LOW Relay
可以在 gpiozero 設定:
active_high=False
Q8:DC Motor 可以調速嗎?
可以。
通常使用:
PWM + MOSFET
或:
PWM + Motor Driver
控制。
Q9:DC Motor 如何控制正反轉?
使用:
H-Bridge
例如:
TB6612FNG
DRV8833
L298N
等馬達驅動器。
Q10:Raspberry Pi 可以同時控制很多 Servo 嗎?
可以。
如果數量較多,通常建議使用:
PCA9685
等多通道 PWM 控制器。
68. 本章學習重點
完成這一章後,你應該已經理解:
- Raspberry Pi GPIO 為 3.3V 邏輯
- GPIO 不適合直接驅動大電流負載
- Relay 可以控制外部設備 ON/OFF
- Relay 可能是 Active HIGH 或 Active LOW
- DC Motor 應使用 MOSFET 或 Motor Driver
- 感性負載需要考慮 Flyback Protection
- MOSFET 必須確認是否適合 3.3V Gate Drive
- H-Bridge 可以控制 DC Motor 正反轉
- PWM 可以控制 DC Motor 平均功率與速度
- Servo 可以控制機械位置
- Servo 電源應與 GPIO 控制訊號分開思考
- 外部電源容量必須考慮啟動與堵轉電流
- 非隔離控制系統通常需要 Common Ground
- 馬達與 Servo 可能產生電源雜訊
- 多 Servo 系統可以使用 PCA9685
- Raspberry Pi 可以延伸成完整自動控制與 IoT 系統
69. 本章總結
Raspberry Pi GPIO 真正強大的地方,不只是讓 LED 亮起來。
當 GPIO 與:
Relay
MOSFET
Motor Driver
Servo
結合後,Raspberry Pi 就可以從單純的 Linux 小型電腦,進一步變成:
Automation Controller
Robot Controller
IoT Controller
Smart Home Controller
AI Edge Controller
整個外部控制系統最重要的觀念就是:
Raspberry Pi
│
Control Signal
│
▼
Driver
│
Electrical Power
│
▼
External Load
GPIO 負責控制,Driver 負責切換,外部電源負責提供能量。
掌握這個原則之後,不論未來控制的是:
Relay
Fan
Pump
Motor
Servo
Solenoid
Valve
Robot
其基本設計思路其實都非常相似。
完成本章,也代表我們已經從 Raspberry Pi 的「GPIO 基礎實驗」,正式跨入:
Raspberry Pi 實際自動控制系統設計。
70. 下一章預告
第 16 章 Raspberry Pi 攝影機 Camera 實作:拍照、錄影與即時影像串流
下一章將從 GPIO 與硬體控制進一步進入 Raspberry Pi 非常重要的影像應用。
我們將介紹:
Raspberry Pi Camera
libcamera / rpicam
Python Camera Control
Image Capture
Video Recording
Live Streaming
並建立:
Raspberry Pi
│
▼
Camera
│
▼
Capture Image
│
▼
Record Video
│
▼
Live Stream
這也是後續:
OpenCV
Computer Vision
Object Detection
AI Camera
Security Camera
Face Recognition
的重要基礎。
下一章將正式進入:
Raspberry Pi Camera 與電腦視覺應用。