电机扩展板(Motor Shield)

电机扩展板使用 TB6612FNG 双 H 桥从 OpenMV Cam 驱动两个直流电机,并带有 NCP1117 5 V 线性稳压器,可从单个 6.5–18 V 电池输入同时为摄像头和电机供电。

电机扩展板(Motor Shield)

完整的数据手册、照片和订购信息请参见 电机扩展板产品页面

亮点

  • 两个带 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