Motor Shield

Motor Shield 使用 TB6612FNG 雙 H 橋從 OpenMV Cam 驅動兩顆直流馬達,並搭配 NCP1117 5 V 線性穩壓器,可從單一 6.5–18 V 電池輸入同時為相機與馬達供電。

Motor Shield

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

特色亮點

  • 兩個獨立的馬達通道,具備 PWM 速度控制

  • 每通道最高 2 A 驅動電流

  • 也可驅動雙極步進馬達

  • 可與 Servo Shield 堆疊

接腳配置

Motor Shield 接腳配置

接腳參考

接腳

功能

P0

DIR B1(馬達 B 方向)

P1

DIR B0(馬達 B 方向)

P2

DIR A1(馬達 A 方向)

P3

DIR A0(馬達 A 方向)

P6

TB6612FNG STANDBY — 預設開啟;拉低以進入低功耗模式

P7

馬達 A 的 PWM 速度輸入

P8

馬達 B 的 PWM 速度輸入

VBAT 輸入

螺絲端子上的 6.5–18 V 電池輸入(NCP1117 限制)

VIN 輸出

來自板載 NCP1117 穩壓器的 5 V(為相機供電)

3.3V 電源軌

為 TB6612FNG 邏輯供電

GND 電源軌

共同接地

備註

P6 預設驅動 TB6612 的 STANDBY 輸入。若你想將該接腳用於其他用途,可切斷擴充板背面的焊接走線以斷開 P6(驅動器此後將保持啟用)。

備註

TB6612FNG 透過雙輸入真值表加上 PWM 致能來驅動每顆馬達。對馬達 A 而言(STBY 為高且 PWMA 為任何非零工作週期):

  • (P3, P2) = (H, L) → 正轉

  • (P3, P2) = (L, H) → 反轉

  • (P3, P2) = (L, L) → 滑行(輸出為 Hi-Z)

  • (P3, P2) = (H, H) → 煞車(兩輸出皆為低)

將 PWMA 驅動為低會強制短時煞車,與方向輸入無關 — 0 % 工作週期會使馬達煞車。馬達 B 在 (P1, P0) 上依相同真值表運作,PWM 位於 P8。

使用方式

以固定 PWM 工作週期讓馬達 A 循環經過 正轉 → 煞車 → 反轉 → 滑行:

from machine import Pin, PWM
import time

a0 = Pin("P3", Pin.OUT)  # AIN1
a1 = Pin("P2", Pin.OUT)  # AIN2
pwma = PWM(Pin("P7"), freq=1_000, duty_u16=40_000)  # ~60%


def drive(in1, in2):
    a0.value(in1)
    a1.value(in2)


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

若要進行變速控制,維持方向輸入不變並爬升 PWMA。下方迴圈會將馬達 A 從滑行向上爬升至全速正轉再降回:

from machine import Pin, PWM
import time

Pin("P3", Pin.OUT, value=1)  # AIN1=H
Pin("P2", Pin.OUT, value=0)  # AIN2=L → forward direction
pwma = PWM(Pin("P7"), freq=1_000, duty_u16=0)

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

TB6612 的兩個 H 橋也可以波動驅動(wave-drive)雙極步進馬達 — 一次激磁一個線圈,逐步走過四相。將兩個 PWM 通道維持在所需的驅動電流,並呼叫 step() 以向任一方向推進一個完整序列:

from machine import Pin, PWM
import time

a0 = Pin("P3", Pin.OUT)
a1 = Pin("P2", Pin.OUT)
b0 = Pin("P1", Pin.OUT)
b1 = Pin("P0", Pin.OUT)
PWM(Pin("P7"), freq=1_000, duty_u16=32_768)  # 50% drive on A
PWM(Pin("P8"), freq=1_000, duty_u16=32_768)  # 50% drive on B

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


def step(forward=True):
    for s in SEQUENCE if forward else reversed(SEQUENCE):
        a0.value(s[0])
        a1.value(s[1])
        b0.value(s[2])
        b1.value(s[3])
        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)

板載 STANDBY 線預設為高(驅動器啟用)。將 P6 拉低即可讓 TB6612 進入睡眠:

from machine import Pin
Pin("P6", Pin.OUT).value(0)  # standby