Motor Shield#
Motor Shield는 TB6612FNG 듀얼 H 브리지를 사용하여 OpenMV Cam에서 DC 모터 2개를 구동하며, 단일 6.5~18V 배터리 입력에서 카메라와 모터 모두에 전원을 공급하는 NCP1117 5V 선형 레귤레이터를 갖추고 있습니다.
전체 데이터시트, 사진, 주문 정보는 Motor Shield 제품 페이지를 참조하세요.
주요 특징#
PWM 속도 제어 기능이 있는 독립적인 모터 채널 2개
채널당 최대 2A 구동 전류
바이폴라 스테퍼 모터도 구동 가능
Servo 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