Motor Shield

Motor Shield는 TB6612FNG 듀얼 H 브리지를 사용하여 OpenMV Cam에서 DC 모터 2개를 구동하며, 단일 6.5~18V 배터리 입력에서 카메라와 모터 모두에 전원을 공급하는 NCP1117 5V 선형 레귤레이터를 갖추고 있습니다.

Motor Shield

전체 데이터시트, 사진, 주문 정보는 Motor Shield 제품 페이지를 참조하세요.

주요 특징

  • PWM 속도 제어 기능이 있는 독립적인 모터 채널 2개

  • 채널당 최대 2A 구동 전류

  • 바이폴라 스테퍼 모터도 구동 가능

  • Servo Shield와 적층 가능

핀아웃

Motor Shield 핀아웃

핀 참조

기능

P0

DIR B1(모터 B 방향)

P1

DIR B0(모터 B 방향)

P2

DIR A1(모터 A 방향)

P3

DIR A0(모터 A 방향)

P6

TB6612FNG STANDBY — 기본적으로 켜짐; low로 당기면 저전력 모드로 진입

P7

모터 A의 PWM 속도 입력

P8

모터 B의 PWM 속도 입력

VBAT in

나사 단자대의 6.5~18V 배터리 입력(NCP1117 제한)

VIN out

온보드 NCP1117 레귤레이터에서 5V(카메라에 전원 공급)

3.3V 레일

TB6612FNG 로직에 전원 공급

GND 레일

공통 접지

참고

P6은 기본적으로 TB6612 STANDBY 입력을 구동합니다. 핀을 다른 용도로 사용하려면 실드 후면의 솔더 트레이스를 잘라 P6을 분리하세요(그러면 드라이버는 활성화 상태로 유지됩니다).

참고

TB6612FNG는 2입력 진리표와 PWM 인에이블을 통해 각 모터를 구동합니다. 모터 A의 경우(STBY가 high이고 PWMA가 0이 아닌 듀티일 때):

  • (P3, P2) = (H, L) → 정방향

  • (P3, P2) = (L, H) → 역방향

  • (P3, P2) = (L, L) → 코스트(출력 Hi-Z)

  • (P3, P2) = (H, H) → 브레이크(출력 모두 low)

PWMA를 low로 구동하면 방향 입력과 관계없이 단락 브레이크가 강제됩니다 — 0% 듀티 사이클은 모터를 브레이크합니다. 모터 B는 PWM을 P8에 두고 (P1, P0)에서 동일한 표를 따릅니다.

사용법

고정된 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 브리지는 바이폴라 스테퍼를 웨이브 구동할 수도 있습니다 — 한 번에 코일 하나씩 여자(勵磁)하며 4상을 거칩니다. 두 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 라인은 기본적으로 high입니다(드라이버 활성화). P6을 low로 당기면 TB6612를 슬립 상태로 전환합니다:

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