Driver Shield

Driver Shield 可從寬範圍的 6-36 V 電源驅動兩顆 3 A 馬達或四個獨立的 1.5 A 線路驅動器,為 OpenMV Cam 提供堅固耐用的馬達控制前端,並具備反向電壓與突波保護。

Driver Shield

完整的資料手冊、照片與訂購資訊請參閱 Driver Shield 產品頁面

特色亮點

  • 雙 3 A 馬達驅動器,或四個 1.5 A 線路驅動器,6-36 V

  • 輸入端具備反向電壓與瞬態突波保護

  • 0-5 V ADC 輸入,具備 ±36 V 過電壓保護

  • 0-5 V 數位 I/O,用於相機同步觸發,具短路保護

接腳配置

Driver Shield 接腳配置

接腳參考

接腳

功能

P0

輸出對 O1/O2 的 DIR(方向)

P1

輸出對 O3/O4 的 DIR(方向,替代方案)

P2

輸出對 O3/O4 的 DIR(方向,預設)

P6

經位準轉換的 AIN 回讀(P6 上為 0–3.3 V)

P7

輸出對 O1/O2 的 PWM

P8

輸出對 O3/O4 的 PWM

P10

SYN — 端子台上的開汲極數位 I/O

PWR 輸入

端子台上的 6–36 V 寬範圍輸入(可承受反向電壓)

AIN 輸入

端子台上的類比輸入

VIN 輸出

來自板載穩壓器的 5.4 V,最高可達 600 mA

3.3V 電源軌

為擴充板的板載電子元件供電

GND 電源軌

共同接地

備註

AIN 具備最高 ±36 V 的過電壓保護,預設為 0–5 V 電壓輸入,在 P6 上降壓至 0–3.3 V。橋接擴充板正面的 4–20 mA 模式分流,即可將 AIN 切換為 4–20 mA 電流迴路輸入。

備註

SYN 是一條開汲極數位線,在相機側上拉至 3.3 V,在 SYN 端子側上拉至 5 V。預設為輸入 — 擴充板會將 SYN 上的 0–5 V 位準轉換降至 P10 上的 0–3.3 V。變更板載的焊接跳線即可將 P10 翻轉為輸出,將 P10 上的 0–3.3 V 位準轉換升至 SYN 上的 0–5 V。

備註

P0、P1、P2、P6、P7、P8 與 P10 各接腳皆可重新挪用於其他用途。P0、P2、P6、P7、P8 與 P10 預設透過背面的焊接跳線連接 — 開路任一你想釋放的接腳上的跳線即可。P1 預設為斷開:橋接其正面跳線即可改為將 O3/O4 的 DIR 路由至 P1(並開路 P2 的背面跳線以釋放 P2)。

備註

擴充板背面有兩個模式跳線 — 每個 H 橋一個 — 可獨立將每個輸出對設定為三種模式之一。每個跳線都標有 L 與 H 記號,指示哪一側選擇哪種狀態:

  • Low(預設) — DIR/PWM 模式:每個橋使用一個 DIR 接腳 + 一個 PWM 接腳。

  • High — H 橋模式:兩個接腳皆透過晶片的雙輸入真值表直接驅動橋。

  • Float(不連接) — 獨立模式:每個接腳成為一個獨立的線路驅動器,路由至一個輸出。

每顆 DRV8876 的電流限制為每晶片合計 3 A — 也就是透過單一橋(DIR/PWM 或 H 橋模式)的 3 A,或在獨立模式下分攤於兩個輸出、每個輸出 1.5 A。

使用方式

DIR/PWM 模式(預設)

在輸出對 O1/O2 上驅動一顆有刷直流馬達 — 在 P0 上設定方向,並在 P7 上施加 PWM 速度訊號。下方迴圈會將工作週期向上爬升至全速再降回,接著翻轉方向並重複:

from machine import Pin, PWM
import time

direction = Pin("P0", Pin.OUT)
speed = PWM(Pin("P7"), freq=20_000, duty_u16=0)


def ramp(target):
    for duty in range(0, target, 1024):
        speed.duty_u16(duty)
        time.sleep_ms(10)
    for duty in range(target, -1, -1024):
        speed.duty_u16(duty)
        time.sleep_ms(10)


while True:
    direction.value(1)  # forward
    ramp(65_535)
    direction.value(0)  # reverse
    ramp(65_535)

兩個 H 橋也可以驅動雙極步進馬達 — 將兩個 PWM 通道維持在全驅動,並讓 DIR 接腳依四相序列逐步切換:

from machine import Pin, PWM
import time

dir12 = Pin("P0", Pin.OUT)
dir34 = Pin("P2", Pin.OUT)
PWM(Pin("P7"), freq=20_000, duty_u16=65_535)  # full drive on O1/O2
PWM(Pin("P8"), freq=20_000, duty_u16=65_535)  # full drive on O3/O4

SEQUENCE = [(1, 1), (0, 1), (0, 0), (1, 0)]


def step(forward=True):
    for a, b in SEQUENCE if forward else reversed(SEQUENCE):
        dir12.value(a)
        dir34.value(b)
        time.sleep_ms(5)


while True:
    for _ in range(50):  # ~1 revolution forward (200 phases)
        step()
    for _ in range(50):  # ~1 revolution backward
        step(forward=False)

H 橋模式

將模式跳線設定為 high 後,兩個橋接腳會直接驅動 H 橋。對 O1/O2 而言,真值表為:

  • (P0, P7) = (L, L) → 滑行(輸出為 Hi-Z)

  • (P0, P7) = (L, H) → 正轉(O1 = H, O2 = L)

  • (P0, P7) = (H, L) → 反轉(O1 = L, O2 = H)

  • (P0, P7) = (H, H) → 煞車(兩輸出皆為低)

(O3/O4 依相同真值表使用 P1/P2 與 P8。)下方迴圈會讓馬達在輸出對 O1/O2 上循環經過 正轉 → 煞車 → 反轉 → 滑行:

from machine import Pin
import time

p0 = Pin("P0", Pin.OUT)
p7 = Pin("P7", Pin.OUT)


def drive(a, b):
    p0.value(a)
    p7.value(b)


while True:
    drive(0, 1)         # forward
    time.sleep(1)
    drive(1, 1)         # brake
    time.sleep_ms(500)
    drive(1, 0)         # reverse
    time.sleep(1)
    drive(0, 0)         # coast
    time.sleep_ms(500)

任一接腳皆可替換為 machine.PWM 通道以進行比例驅動 — 例如 (P0=0, P7=PWM) 會以 PWM 工作週期提供正轉/滑行,(P0=1, P7=PWM) 會以 (100 % duty) 提供反轉/煞車。下方迴圈會在 P0 維持為 0(正轉/滑行)的情況下,將工作週期向上爬升再降回:

from machine import Pin, PWM
import time

p0 = Pin("P0", Pin.OUT, value=0)
p7 = PWM(Pin("P7"), freq=20_000, duty_u16=0)

while True:
    for duty in range(0, 65_536, 1024):
        p7.duty_u16(duty)
        time.sleep_ms(10)
    for duty in range(65_535, -1, -1024):
        p7.duty_u16(duty)
        time.sleep_ms(10)

獨立模式

將模式跳線設為浮接後,每個接腳會成為一個獨立的線路驅動器,路由至一個輸出 — 適用於電磁閥、繼電器,或任何不需要 H 橋的開/關負載。對應關係為 P7 → O1、P0 → O2、P8 → O3,以及 P1(或 P2)→ O4:

from machine import Pin
import time

outputs = [
    Pin("P7", Pin.OUT),  # O1
    Pin("P0", Pin.OUT),  # O2
    Pin("P8", Pin.OUT),  # O3
    Pin("P2", Pin.OUT),  # O4
]

while True:
    for o in outputs:    # walk a single high pulse across O1–O4
        o.value(1)
        time.sleep_ms(200)
        o.value(0)

四個接腳中的任一個也可透過 machine.PWM 進行 PWM 以達成比例驅動 — 例如,依序將每個輸出淡入淡出:

from machine import Pin, PWM
import time

outputs = [
    PWM(Pin("P7"), freq=1_000, duty_u16=0),  # O1
    PWM(Pin("P0"), freq=1_000, duty_u16=0),  # O2
    PWM(Pin("P8"), freq=1_000, duty_u16=0),  # O3
    PWM(Pin("P2"), freq=1_000, duty_u16=0),  # O4
]

while True:
    for o in outputs:
        for duty in range(0, 65_536, 1024):
            o.duty_u16(duty)
            time.sleep_ms(5)
        for duty in range(65_535, -1, -1024):
            o.duty_u16(duty)
            time.sleep_ms(5)

其他 I/O

透過經位準轉換的 P6 接腳讀取 AIN 端子台輸入:

from machine import ADC
import time

ain = ADC("P6")

while True:
    v = ain.read_u16() * 3.3 / 65535
    print("AIN:", v * (5.0 / 3.3), "V")
    time.sleep_ms(100)

對 SYN 線上的下降緣做出反應 — 例如,與另一個將 SYN 拉低的裝置同步相機:

from machine import Pin

def on_sync(pin):
    print("SYN falling edge")

syn = Pin("P10", Pin.IN)
syn.irq(on_sync, Pin.IRQ_FALLING)