电机扩展板(Motor Shield)¶
电机扩展板使用 TB6612FNG 双 H 桥从 OpenMV Cam 驱动两个直流电机,并带有 NCP1117 5 V 线性稳压器,可从单个 6.5–18 V 电池输入同时为摄像头和电机供电。
完整的数据手册、照片和订购信息请参见 电机扩展板产品页面。
亮点¶
两个带 PWM 速度控制的独立电机通道
每通道最高 2 A 驱动电流
也可驱动双极步进电机
可与舵机扩展板堆叠
引脚分布¶
引脚参考¶
引脚 |
功能 |
|---|---|
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 in |
螺钉端子上的 6.5–18 V 电池输入(受 NCP1117 限制) |
VIN out |
由板载 NCP1117 稳压器输出 5 V(为摄像头供电) |
3.3V rail |
为 TB6612FNG 逻辑供电 |
GND rail |
公共地 |
备注
P6 默认驱动 TB6612 的 STANDBY 输入。如果你想将该引脚用于其他用途,切断扩展板背面的焊接走线即可断开 P6(此后驱动器将保持使能)。
备注
TB6612FNG 通过双输入真值表加 PWM 使能来驱动每个电机。对于电机 A(STBY 为高电平且 PWMA 为任意非零占空比时):
(P3, P2) = (H, L)→ 正转(P3, P2) = (L, H)→ 反转(P3, P2) = (L, L)→ 滑行(输出为高阻态)(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 桥也可对双极步进电机进行波形驱动 — 一次激励一个线圈,遍历四相。将两个 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