在嵌入式系統應用中,控制多個伺服馬達和直流馬達是很常見的需求。本文介紹如何使用樹莓派搭配不同硬體和軟體工具實作這些控制。對於多伺服馬達控制,可以使用 MonkMakes ServoSix 控制板簡化接線,並透過 ServoBlaster 軟體精確控制 PWM 訊號。然而,ServoBlaster 可能會影響樹莓派的聲音輸出。為此,可以選擇 Adafruit 伺服馬達 HAT,它使用 I2C 介面,避免資源衝突,並可控制多達 16 個伺服馬達。至於直流馬達控制,則可以透過 MOSFET 電晶體控制速度,並使用 H-Bridge 晶片(如 L293D)控制方向,同時也需注意電源供應器的選擇和二極體的保護作用,避免電壓尖峰損壞電路。

控制多個伺服馬達

在進行複雜的機器人或自動化專案時,控制多個伺服馬達是非常常見的需求。然而,直接將多個伺服馬達連線到單板電腦(如 Raspberry Pi)上可能會導致線路混亂。為瞭解決這個問題,我們可以使用專門的伺服馬達控制板,如 MonkMakes ServoSix。

伺服馬達控制板

MonkMakes ServoSix 是一款設計用於簡化 Raspberry Pi 與多個伺服馬達之間連線的控制板。它允許您輕鬆地控制多達 6 個伺服馬達,從而大大簡化了您的專案的線路。

伺服馬達 GPIO 腳位

在 Raspberry Pi 上,各個伺服馬達的 GPIO 腳位分配如下:

  • 伺服馬達 0:GPIO 4
  • 伺服馬達 1:GPIO 17
  • 伺服馬達 2:GPIO 18
  • 伺服馬達 3:GPIO 27
  • 伺服馬達 4:GPIO 22
  • 伺服馬達 5:GPIO 23
  • 伺服馬達 6:GPIO 24
  • 伺服馬達 7:GPIO 25

使用 ServoBlaster

ServoBlaster 是一款強大的工具,允許您精確控制伺服馬達。它可以生成精確的脈衝寬度調製(PWM)訊號,以控制伺服馬達的位置和速度。

如果您不需要 ServoBlaster 的精確時序控制,您也可以使用 gpiozero 函式庫來生成 PWM 訊號控制伺服馬達,如 Recipe 11.1 所述。

圖表翻譯:
  flowchart TD
    A[開始] --> B[連線伺服馬達]
    B --> C[使用 ServoBlaster 控制]
    C --> D[實作專案目標]

圖表示了使用 ServoBlaster 和 MonkMakes ServoSix 控制多個伺服馬達的流程。

內容解密:

在上述流程中,我們首先連線伺服馬達到 Raspberry Pi 上的對應 GPIO 腳位。然後,我們使用 ServoBlaster 生成精確的 PWM 訊號來控制伺服馬達的位置和速度。最終,我們實作了專案的目標,例如控制機器人臂或自動化裝置。

控制伺服馬達的精確度和聲音輸出

在某些情況下,您可能需要控制多個伺服馬達,並且需要高精確度和不失去聲音輸出的能力。這時,使用 ServoBlaster 並不是最佳選擇,因為它會佔用 Raspberry Pi 的硬體資源,並且會導致聲音輸出失真。

解決方案

一個替代的解決方案是使用具有自己的伺服馬達控制硬體的伺服馬達 HAT,例如 Adafruit 的伺服馬達 HAT。這個 HAT 可以控制多達 16 個伺服馬達或 PWM 通道,使用 Raspberry Pi 的 I2C 介面。伺服馬達可以直接插入 HAT 中。

伺服馬達 HAT 的優點

  • 可以控制多達 16 個伺服馬達或 PWM 通道
  • 使用 I2C 介面,無需佔用 Raspberry Pi 的硬體資源
  • 可以使用外部 5V 電源供應伺服馬達
  • 可以使用電池包供應伺服馬達

安裝 Adafruit 軟體

要使用 Adafruit 的伺服馬達 HAT,您需要安裝 Adafruit 的軟體。您可以使用以下命令安裝所需的軟體:

$ pip3 install adafruit-blinka
$ sudo pip3 install adafruit-circuitpython-servokit

範例程式碼

以下是使用 Adafruit 伺服馬達 HAT 控制伺服馬達的範例程式碼:

from adafruit_servokit import ServoKit
from guizero import App, Slider

servo_kit = ServoKit(channels=16)

def slider_changed(angle):
    servo_kit.servo[0].angle = int(angle) + 90

app = App(title='Servo Angle', width=500, height=150)
slider = Slider(app, start=-90, end=90, command=slider_changed, width='fill', height=50)
slider.text_size = 30

app.display()

這個程式碼會建立一個 GUI 應用程式,具有一個滑動條,可以控制伺服馬達的角度。

執行程式碼

您可以使用以下命令執行程式碼:

$ python3 ch_11_servo_adafruit.py

請注意,這個程式碼需要在 Raspberry Pi 的視窗環境中執行,不能在 SSH 或 Terminal 中執行。

討論

選擇適當的電源供應器對於伺服馬達 HAT 來說非常重要。標準的遙控伺服馬達可以輕易地吸收 400mA 的電流,而如果它正在承載重負荷,則可能需要更多的電流。因此,如果您計劃同時控制多個大型伺服馬達,您需要一個大型的電源供應器。

參考資料

如需更多關於 Adafruit 伺服馬達 HAT 的資訊,請參考 Adafruit 的網站。另外,Adafruit 還提供了一個具有相同伺服馬達控制硬體的伺服馬達模組(產品 ID 815),它可以連線到 Raspberry Pi 的 I2C 介面。

控制 DC 馬達的速度和方向

在 Raspberry Pi 上控制 DC 馬達的速度和方向是一項常見的任務。以下是使用 MOSFET 電晶體和 H-Bridge 晶片來實作這一功能的方法。

控制 DC 馬達的速度

要控制 DC 馬達的速度,您可以使用與 Recipe 10.4 中相同的設計。然而,為了防止電壓尖峰損壞電晶體或甚至 Raspberry Pi,建議在馬達上加一個二極體。1N4001 是一個適合此用途的二極體。二極體有一個條紋在一端,請確保它導向正確的方向(圖 11-7)。

圖 11-7. 控制高功率馬達

您需要以下元件:

  • 3V 至 12V 的 DC 馬達 *麵包板和跳線(見「原型設計裝置和套件」)
  • 1kΩ 電阻器(見「電阻器和電容器」)
  • MOSFET 電晶體 FQP30N06L(見「電晶體和二極體」)
  • 二極體 1N4001(見「電晶體和二極體」)
  • 與馬達匹配的電壓電源

控制 DC 馬達的方向

要控制 DC 馬達的方向,您可以使用 H-Bridge 晶片或模組,例如 L293D。這些晶片低成本且易於使用。其他 H-Bridge 晶片或模組通常使用相同的一對控制引腳來控制每個馬達的方向(見下面的討論)。

L293D 晶片實際上可以在沒有額外硬體的情況下驅動兩個馬達。討論還提到了幾個其他控制 DC 馬達的選項。要試用 L293D 來控制一個馬達,您需要以下元件:

  • L293D 晶片
  • DC 馬達 *麵包板和跳線
  • 電源

討論

如果您只使用低功率 DC 馬達(小於 200mA),您可以使用較小且較便宜的電晶體,例如 2N3904(見「電晶體和二極體」)。圖 11-8 顯示了使用 2N3904 的麵包板佈局。

您可能可以直接從 GPIO 聯結器上的 5V 電源線為小型馬達供電。但是,如果您發現 Raspberry Pi 當機,則應使用外部電源,如圖 11-7 所示。

圖 11-8. 控制低功率馬達

程式碼實作

以下是使用 Python 來控制 DC 馬達速度和方向的範例程式碼:

import RPi.GPIO as GPIO
import time

# 設定 GPIO 模式
GPIO.setmode(GPIO.BCM)

# 設定馬達控制引腳
MOTOR_PIN = 17
DIRECTION_PIN = 23

# 設定馬達速度
SPEED = 50

# 初始化馬達控制引腳
GPIO.setup(MOTOR_PIN, GPIO.OUT)
GPIO.setup(DIRECTION_PIN, GPIO.OUT)

try:
    while True:
        # 控制馬達速度
        GPIO.output(MOTOR_PIN, GPIO.HIGH)
        time.sleep(SPEED / 100)
        GPIO.output(MOTOR_PIN, GPIO.LOW)
        time.sleep((100 - SPEED) / 100)

        # 控制馬達方向
        GPIO.output(DIRECTION_PIN, GPIO.HIGH)
        time.sleep(1)
        GPIO.output(DIRECTION_PIN, GPIO.LOW)
        time.sleep(1)

except KeyboardInterrupt:
    # 清除 GPIO 設定
    GPIO.cleanup()

使用L293D晶片控制直流馬達

所需元件

  • 3V至12V直流馬達 -麵包板和跳線(公到母,參考“原型設計裝置和套件”)
  • L293D晶片(參考“積體電路”)
  • 與馬達匹配的電源供應

布線和程式碼

圖11-9顯示了麵包板的布線佈局。請確保晶片的方向正確:晶片頂部有一個缺口,應該朝向麵包板的頂部。

測試程式(ch_11_motor_control.py)允許您輸入字母“f”或“r”和一個單位數字(0至9)。然後,馬達將以指定的速度向前或向後運轉:0代表停止,9代表全速。

from gpiozero import Motor

motor = Motor(forward=23, backward=24)
while True:
    cmd = input("命令,f/r 0..9,例如:f5 :")
    direction = cmd[0]
    speed = float(cmd[1]) / 10.0
    if direction == "f":
        motor.forward(speed=speed)
    else:
        motor.backward(speed=speed)

內容解密:

此程式使用gpiozero函式庫中的Motor類別來控制直流馬達的速度和方向。當建立Motor例項時,需要指定前進和後退控制引腳。forwardbackward方法接受一個可選的速度引數,範圍從0到1,其中1代表全速。

實際應用

此程式可以用於控制機器人或其他需要速度和方向控制的裝置。透過調整速度和方向,可以實作複雜的運動控制。

圖表翻譯:

  flowchart TD
    A[使用者輸入] --> B[解析命令]
    B --> C[設定馬達速度和方向]
    C --> D[控制馬達運轉]
    D --> E[重複迴圈]

圖表說明:

此流程圖顯示了程式的運作流程。使用者輸入命令,程式解析命令並設定馬達的速度和方向,然後控制馬達運轉。最後,程式重複此迴圈,等待下一次使用者輸入。

從系統整合度的角度來看,控制多個伺服馬達及直流馬達需要考量硬體和軟體的協同運作。本文介紹了使用 ServoSix 控制板、ServoBlaster 軟體、Adafruit 伺服馬達 HAT 和 L293D 晶片等多種方案,展現了控制馬達的多樣性。分析不同方案的優劣可以發現,ServoBlaster 提供精確的 PWM 控制,但可能影響聲音輸出;Adafruit HAT 則透過 I2C 介面避免此問題,並支援更多伺服馬達,但需要額外安裝軟體和留意電源供應;而使用 L293D 晶片則提供控制直流馬達方向的簡潔方案。這些方案各有其限制,例如 ServoBlaster 佔用硬體資源,Adafruit HAT 需要額外電源管理,L293D 晶片則需注意電流限制。對於需要精確控制的場景,ServoBlaster 或 Adafruit HAT 是較佳選擇;而對於簡單的直流馬達控制,L293D 晶片則更為經濟實惠。展望未來,整合更多感測器回饋和更精密的控制演算法將是馬達控制技術發展的趨勢。隨著邊緣運算的興起,預期未來會有更多整合式馬達控制模組出現,簡化開發流程並提升效能。玄貓認為,開發者應根據專案需求和資源限制選擇合適的方案,並關注未來馬達控制技術的發展趨勢,才能在競爭激烈的市場中保持領先。