Driver Shield

Driver Shield는 넓은 범위의 6~36V 전원에서 3A 모터 2개 또는 독립적인 1.5A 라인 드라이버 4개를 구동하여, OpenMV Cam에 역전압 및 서지 보호 기능을 갖춘 견고한 모터 제어 프런트엔드를 제공합니다.

Driver Shield

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

주요 특징

  • 듀얼 3A 모터 드라이버 또는 쿼드 1.5A 라인 드라이버, 6~36V

  • 입력단의 역전압 및 과도 서지 보호

  • ±36V 과전압 보호 기능이 있는 0~5V ADC 입력

  • 카메라 동기화 트리거용 0~5V 디지털 I/O, 단락 보호 기능 포함

핀아웃

Driver Shield 핀아웃

핀 참조

기능

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)