Driver Shield

Driver Shield obsługuje dwa silniki 3 A lub cztery niezależne sterowniki liniowe 1,5 A zasilane z szerokiego zakresu 6-36 V, zapewniając OpenMV Cam wytrzymały moduł sterowania silnikami z zabezpieczeniem przed odwrotną polaryzacją i przepięciami.

Driver Shield

Pełną dokumentację techniczną, zdjęcia i informacje o zamówieniu znajdziesz na stronie produktu Driver Shield.

Najważniejsze cechy

  • Dwa sterowniki silników 3 A LUB cztery sterowniki liniowe 1,5 A, 6-36 V

  • Zabezpieczenie wejścia przed odwrotną polaryzacją i przepięciami przejściowymi

  • Wejście ADC 0-5 V z zabezpieczeniem nadnapięciowym ±36 V

  • Cyfrowe I/O 0-5 V do wyzwalaczy synchronizacji kamery, zabezpieczone przed zwarciem

Rozkład wyprowadzeń

Rozkład wyprowadzeń Driver Shield

Opis wyprowadzeń

Pin

Funkcja

P0

DIR dla pary wyjść O1/O2

P1

DIR dla pary wyjść O3/O4 (alternatywnie)

P2

DIR dla pary wyjść O3/O4 (domyślnie)

P6

Odczyt AIN po konwersji poziomu (0–3,3 V na P6)

P7

PWM dla pary wyjść O1/O2

P8

PWM dla pary wyjść O3/O4

P10

SYN — cyfrowe I/O typu open-drain na listwie zaciskowej

PWR in

Szerokie wejście 6–36 V na listwie zaciskowej (odporne na odwrotną polaryzację)

AIN in

Wejście analogowe na listwie zaciskowej

VIN out

5,4 V przy maksymalnie 600 mA ze stabilizatora na płytce

Szyna 3,3 V

Zasila układy elektroniczne shielda

Szyna GND

Wspólna masa

Informacja

AIN jest zabezpieczone przed przepięciami do ±36 V i domyślnie działa jako wejście napięciowe 0–5 V, skalowane do 0–3,3 V na P6. Zewrzyj zworkę trybu 4–20 mA z przodu shielda, aby przełączyć AIN na wejście pętli prądowej 4–20 mA.

Informacja

SYN to cyfrowa linia open-drain, podciągnięta do 3,3 V po stronie kamery i do 5 V po stronie zacisku SYN. Domyślnie jest wejściem — shield konwertuje poziom 0–5 V na SYN na 0–3,3 V na P10. Zmień zworkę lutowniczą na płytce, aby przełączyć P10 w wyjście, konwertując poziom 0–3,3 V na P10 na 0–5 V na SYN.

Informacja

Każdy z pinów P0, P1, P2, P6, P7, P8 i P10 można odzyskać do innych zastosowań. P0, P2, P6, P7, P8 i P10 są domyślnie połączone przez zworki lutownicze na spodzie płytki — rozewrzyj zworkę przy dowolnym pinie, który chcesz uwolnić. P1 jest domyślnie rozłączony: zewrzyj jego zworkę z przodu, aby zamiast tego poprowadzić DIR dla O3/O4 do P1 (i rozewrzyj zworkę P2 na spodzie, aby uwolnić P2).

Informacja

Dwie zworki trybu na spodzie shielda — po jednej na mostek H — niezależnie ustawiają każdą parę wyjść w jednym z trzech trybów. Każda zworka ma oznaczenia L i H pokazujące, która strona wybiera dany stan:

  • Niski (domyślnie) — tryb DIR/PWM: jeden pin DIR + jeden pin PWM na mostek.

  • Wysoki — tryb mostka H: oba piny sterują mostkiem bezpośrednio poprzez dwuwejściową tablicę prawdy układu.

  • Pływający (brak połączenia) — tryb niezależny: każdy pin staje się samodzielnym sterownikiem liniowym przypisanym do jednego wyjścia.

Każdy układ DRV8876 ma ograniczenie prądowe do 3 A łącznie na układ — to 3 A przez jeden mostek (tryb DIR/PWM lub mostka H) albo 1,5 A na wyjście rozdzielone na dwa wyjścia (tryb niezależny).

Zastosowanie

Tryb DIR/PWM (domyślny)

Steruj szczotkowym silnikiem DC na parze wyjść O1/O2 — ustaw kierunek na P0 i podaj sygnał prędkości PWM na P7. Poniższa pętla zwiększa wypełnienie do pełnej prędkości i z powrotem je zmniejsza, następnie odwraca kierunek i powtarza:

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)

Dwa mostki H mogą również napędzać silnik krokowy dwubiegunowy — utrzymuj oba kanały PWM na pełnym napędzie i przełączaj piny DIR przez czterofazową sekwencję:

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)

Tryb mostka H

Gdy zworka trybu jest ustawiona w stan wysoki, oba piny mostka sterują mostkiem H bezpośrednio. Dla O1/O2 tablica prawdy wygląda tak:

  • (P0, P7) = (L, L) → wybieg (wyjścia w stanie Hi-Z)

  • (P0, P7) = (L, H) → do przodu (O1 = H, O2 = L)

  • (P0, P7) = (H, L) → do tyłu (O1 = L, O2 = H)

  • (P0, P7) = (H, H) → hamowanie (oba wyjścia w stanie niskim)

(O3/O4 stosuje tę samą tablicę z P1/P2 i P8.) Poniższa pętla przeprowadza silnik przez cykl do przodu → hamowanie → do tyłu → wybieg na parze wyjść 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)

Dowolny pin można zastąpić kanałem machine.PWM dla napędu proporcjonalnego — np. (P0=0, P7=PWM) daje do przodu/wybieg przy wypełnieniu PWM, a (P0=1, P7=PWM) daje do tyłu/hamowanie przy (100 % duty). Poniższa pętla zwiększa i zmniejsza wypełnienie z P0 utrzymywanym na 0 (do przodu/wybieg):

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)

Tryb niezależny

Gdy zworka trybu jest pływająca, każdy pin staje się samodzielnym sterownikiem liniowym przypisanym do jednego wyjścia — przydatne dla elektrozaworów, przekaźników lub dowolnego obciążenia typu włącz/wyłącz, które nie wymaga mostka H. Mapowanie to P7 → O1, P0 → O2, P8 → O3 i P1 (lub 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)

Dowolny z czterech pinów można również wysterować PWM poprzez machine.PWM dla napędu proporcjonalnego — na przykład, rozjaśniaj i przyciemniaj kolejno każde wyjście:

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)

Pozostałe I/O

Odczytaj wejście listwy zaciskowej AIN przez pin P6 po konwersji poziomu:

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)

Reaguj na zbocze opadające na linii SYN — na przykład, aby zsynchronizować kamerę z innym urządzeniem ściągającym SYN do stanu niskiego:

from machine import Pin

def on_sync(pin):
    print("SYN falling edge")

syn = Pin("P10", Pin.IN)
syn.irq(on_sync, Pin.IRQ_FALLING)