第15章 Raspberry Pi 控制繼電器、馬達與伺服馬達:外部負載控制入門

發布日期: |更新日期:
文章主圖:第15章 Raspberry Pi 控制繼電器、馬達與伺服馬達:外部負載控制入門

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 非常重要的外部控制方式:

  1. Relay 繼電器控制
  2. DC 直流馬達控制
  3. 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

其中:

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 模組接線
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 是非常熱門的小型伺服馬達。

通常有三條線:

SG90 Servo 常見線色與功能
顏色 功能
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 比較

Relay、MOSFET、H-Bridge 與 Servo Driver 比較
控制方式 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 比較表

Raspberry Pi Relay、DC 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 範例

本章示範使用:

第 15 章常用 GPIO Pin 配置
功能 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 與電腦視覺應用。

下一步學習

不要停在這一篇,接著把內容做成自己的實作

目前主題:Raspberry Pi。從完整學習路線、免費資源、會員下載,再接到實作所需材料。

同系列:Raspberry-Pi |  已是會員?直接前往 Getfile
相關資源與會員文章下載
文章可免費閱讀;下載完整 DOCX 或 PDF 需登入免費基本會員。
會員免費下載 DOCX 會員免費 PDF/列印

← 回文章列表