Driver Shield¶
Driver Shield는 넓은 범위의 6~36V 전원에서 3A 모터 2개 또는 독립적인 1.5A 라인 드라이버 4개를 구동하여, OpenMV Cam에 역전압 및 서지 보호 기능을 갖춘 견고한 모터 제어 프런트엔드를 제공합니다.
전체 데이터시트, 사진, 주문 정보는 Driver Shield 제품 페이지를 참조하세요.
주요 특징¶
듀얼 3A 모터 드라이버 또는 쿼드 1.5A 라인 드라이버, 6~36V
입력단의 역전압 및 과도 서지 보호
±36V 과전압 보호 기능이 있는 0~5V ADC 입력
카메라 동기화 트리거용 0~5V 디지털 I/O, 단락 보호 기능 포함
핀아웃¶
핀 참조¶
핀 |
기능 |
|---|---|
P0 |
출력 쌍 O1/O2의 DIR |
P1 |
출력 쌍 O3/O4의 DIR(대체) |
P2 |
출력 쌍 O3/O4의 DIR(기본값) |
P6 |
레벨 시프트된 AIN 리드백(P6에서 0~3.3V) |
P7 |
출력 쌍 O1/O2의 PWM |
P8 |
출력 쌍 O3/O4의 PWM |
P10 |
SYN — 단자대의 오픈 드레인 디지털 I/O |
PWR in |
단자대의 6~36V 넓은 범위 입력(역전압 내성) |
AIN in |
단자대의 아날로그 입력 |
VIN out |
온보드 레귤레이터에서 5.4V, 최대 600mA |
3.3V 레일 |
실드의 온보드 전자 회로에 전원 공급 |
GND 레일 |
공통 접지 |
참고
AIN은 ±36V까지 과전압 보호되며 기본적으로 0~5V 전압 입력으로, P6에서 0~3.3V로 다운 스케일됩니다. 실드 전면의 4~20mA 모드 션트를 연결하면 AIN을 4~20mA 전류 루프 입력으로 전환할 수 있습니다.
참고
SYN은 오픈 드레인 디지털 라인으로, 카메라 쪽에서는 3.3V로, SYN 단자 쪽에서는 5V로 풀업됩니다. 기본적으로 입력이며 — 실드는 SYN의 0~5V를 P10의 0~3.3V로 레벨 시프트합니다. 온보드 솔더 점퍼를 변경하면 P10을 출력으로 전환하여, P10의 0~3.3V를 SYN의 0~5V로 레벨 시프트합니다.
참고
P0, P1, P2, P6, P7, P8, P10은 각각 다른 용도로 회수하여 사용할 수 있습니다. P0, P2, P6, P7, P8, P10은 기본적으로 후면의 솔더 점퍼를 통해 연결되어 있으므로 — 해제하려는 핀의 점퍼를 열면 됩니다. P1은 기본적으로 연결되어 있지 않습니다. 전면 점퍼를 연결하면 O3/O4의 DIR을 대신 P1로 라우팅할 수 있습니다(그리고 P2를 해제하려면 P2의 후면 점퍼를 엽니다).
참고
실드 후면의 모드 점퍼 2개는 — H 브리지당 하나씩 — 각 출력 쌍을 세 가지 모드 중 하나로 독립적으로 설정합니다. 각 점퍼에는 어느 쪽이 어느 상태를 선택하는지 나타내는 L과 H 표시가 있습니다:
Low(기본값) — DIR/PWM 모드: 브리지당 DIR 핀 1개 + PWM 핀 1개.
High — H 브리지 모드: 칩의 2입력 진리표를 통해 두 핀이 브리지를 직접 구동.
Float(연결 안 함) — 독립 모드: 각 핀이 하나의 출력으로 라우팅되는 독립형 라인 드라이버가 됨.
각 DRV8876은 칩당 총 3A로 전류 제한됩니다 — 즉 하나의 브리지를 통해 3A(DIR/PWM 또는 H 브리지 모드) 또는 두 출력으로 분할된 출력당 1.5A(독립 모드)입니다.
사용법¶
DIR/PWM 모드(기본값)¶
출력 쌍 O1/O2에서 브러시 DC 모터를 구동합니다 — P0에서 방향을 설정하고 P7에 PWM 속도 신호를 인가합니다. 아래 루프는 듀티 사이클을 최고 속도까지 올렸다가 다시 내린 다음, 방향을 뒤집고 반복합니다:
from machine import Pin, PWM
import time
direction = Pin("P0", Pin.OUT)
speed = PWM(Pin("P7"), freq=20_000, duty_u16=0)
def ramp(target):
for duty in range(0, target, 1024):
speed.duty_u16(duty)
time.sleep_ms(10)
for duty in range(target, -1, -1024):
speed.duty_u16(duty)
time.sleep_ms(10)
while True:
direction.value(1) # forward
ramp(65_535)
direction.value(0) # reverse
ramp(65_535)
두 H 브리지는 바이폴라 스테퍼도 구동할 수 있습니다 — 두 PWM 채널을 모두 최대 구동으로 유지하고 DIR 핀을 4상 시퀀스로 단계 진행합니다:
from machine import Pin, PWM
import time
dir12 = Pin("P0", Pin.OUT)
dir34 = Pin("P2", Pin.OUT)
PWM(Pin("P7"), freq=20_000, duty_u16=65_535) # full drive on O1/O2
PWM(Pin("P8"), freq=20_000, duty_u16=65_535) # full drive on O3/O4
SEQUENCE = [(1, 1), (0, 1), (0, 0), (1, 0)]
def step(forward=True):
for a, b in SEQUENCE if forward else reversed(SEQUENCE):
dir12.value(a)
dir34.value(b)
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)
H 브리지 모드¶
모드 점퍼를 high로 설정하면 두 브리지 핀이 H 브리지를 직접 구동합니다. O1/O2의 진리표는 다음과 같습니다:
(P0, P7) = (L, L)→ 코스트(출력 Hi-Z)(P0, P7) = (L, H)→ 정방향(O1 = H, O2 = L)(P0, P7) = (H, L)→ 역방향(O1 = L, O2 = H)(P0, P7) = (H, H)→ 브레이크(출력 모두 low)
(O3/O4는 P1/P2 및 P8로 동일한 표를 따릅니다.) 아래 루프는 출력 쌍 O1/O2에서 모터를 정방향 → 브레이크 → 역방향 → 코스트로 순환시킵니다:
from machine import Pin
import time
p0 = Pin("P0", Pin.OUT)
p7 = Pin("P7", Pin.OUT)
def drive(a, b):
p0.value(a)
p7.value(b)
while True:
drive(0, 1) # forward
time.sleep(1)
drive(1, 1) # brake
time.sleep_ms(500)
drive(1, 0) # reverse
time.sleep(1)
drive(0, 0) # coast
time.sleep_ms(500)
비례 구동을 위해 어느 핀이든 machine.PWM 채널로 교체할 수 있습니다 — 예를 들어 (P0=0, P7=PWM)은 PWM 듀티에서 정방향/코스트를, (P0=1, P7=PWM)은 (100 % − duty)에서 역방향/브레이크를 제공합니다. 아래 루프는 P0을 0(정방향/코스트)으로 유지한 채 듀티를 올렸다가 다시 내립니다:
from machine import Pin, PWM
import time
p0 = Pin("P0", Pin.OUT, value=0)
p7 = PWM(Pin("P7"), freq=20_000, duty_u16=0)
while True:
for duty in range(0, 65_536, 1024):
p7.duty_u16(duty)
time.sleep_ms(10)
for duty in range(65_535, -1, -1024):
p7.duty_u16(duty)
time.sleep_ms(10)
독립 모드¶
모드 점퍼를 float로 두면 각 핀이 하나의 출력으로 라우팅되는 독립형 라인 드라이버가 됩니다 — 솔레노이드, 릴레이, 또는 H 브리지가 필요 없는 모든 on/off 부하에 유용합니다. 매핑은 P7 → O1, P0 → O2, P8 → O3, P1(또는 P2) → O4입니다:
from machine import Pin
import time
outputs = [
Pin("P7", Pin.OUT), # O1
Pin("P0", Pin.OUT), # O2
Pin("P8", Pin.OUT), # O3
Pin("P2", Pin.OUT), # O4
]
while True:
for o in outputs: # walk a single high pulse across O1–O4
o.value(1)
time.sleep_ms(200)
o.value(0)
네 핀 중 어느 것이든 비례 구동을 위해 machine.PWM을 통해 PWM할 수도 있습니다 — 예를 들어 각 출력을 차례로 밝아졌다 어두워지게 합니다:
from machine import Pin, PWM
import time
outputs = [
PWM(Pin("P7"), freq=1_000, duty_u16=0), # O1
PWM(Pin("P0"), freq=1_000, duty_u16=0), # O2
PWM(Pin("P8"), freq=1_000, duty_u16=0), # O3
PWM(Pin("P2"), freq=1_000, duty_u16=0), # O4
]
while True:
for o in outputs:
for duty in range(0, 65_536, 1024):
o.duty_u16(duty)
time.sleep_ms(5)
for duty in range(65_535, -1, -1024):
o.duty_u16(duty)
time.sleep_ms(5)
기타 I/O¶
레벨 시프트된 P6 핀을 통해 AIN 단자대 입력을 읽습니다:
from machine import ADC
import time
ain = ADC("P6")
while True:
v = ain.read_u16() * 3.3 / 65535
print("AIN:", v * (5.0 / 3.3), "V")
time.sleep_ms(100)
SYN 라인의 하강 에지에 반응합니다 — 예를 들어 SYN을 low로 당기는 다른 장치와 카메라를 동기화합니다:
from machine import Pin
def on_sync(pin):
print("SYN falling edge")
syn = Pin("P10", Pin.IN)
syn.irq(on_sync, Pin.IRQ_FALLING)