Motor Shield¶
Motor Shield 使用 TB6612FNG 雙 H 橋從 OpenMV Cam 驅動兩顆直流馬達,並搭配 NCP1117 5 V 線性穩壓器,可從單一 6.5–18 V 電池輸入同時為相機與馬達供電。
完整的資料手冊、照片與訂購資訊請參閱 Motor Shield 產品頁面。
特色亮點¶
兩個獨立的馬達通道,具備 PWM 速度控制
每通道最高 2 A 驅動電流
也可驅動雙極步進馬達
可與 Servo 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