Driver Shield

Driver Shield acționează două motoare de 3 A sau patru drivere de linie independente de 1,5 A de la o sursă largă de 6-36 V, oferind plăcii OpenMV Cam un front-end robust de control al motoarelor, cu protecție la inversarea tensiunii și la supratensiuni.

Driver Shield

Pentru fișa tehnică completă, fotografii și comenzi, consultați pagina produsului Driver Shield.

Caracteristici principale

  • Două drivere de motor de 3 A SAU patru drivere de linie de 1,5 A, 6-36 V

  • Protecție la inversarea tensiunii și la supratensiuni tranzitorii pe intrare

  • Intrare ADC de 0-5 V cu protecție la supratensiune de ±36 V

  • I/O digital de 0-5 V pentru declanșatoare de sincronizare a camerei, protejat la scurtcircuit

Pinout

Pinout-ul Driver Shield

Referință pini

Pin

Funcție

P0

DIR pentru perechea de ieșiri O1/O2

P1

DIR pentru perechea de ieșiri O3/O4 (alternativă)

P2

DIR pentru perechea de ieșiri O3/O4 (implicit)

P6

Citire AIN cu nivel adaptat (0–3,3 V pe P6)

P7

PWM pentru perechea de ieșiri O1/O2

P8

PWM pentru perechea de ieșiri O3/O4

P10

SYN — I/O digital open-drain pe blocul de borne

PWR in

Intrare largă de 6–36 V pe blocul de borne (tolerantă la inversarea tensiunii)

AIN in

Intrare analogică pe blocul de borne

VIN out

5,4 V la până la 600 mA de la regulatorul de pe placă

Linia de 3,3 V

Alimentează componentele electronice de pe placa shield-ului

Linia GND

Masă comună

Notă

AIN este protejat la supratensiune până la ±36 V și este implicit o intrare de tensiune de 0–5 V, scalată în jos la 0–3,3 V pe P6. Punteți șuntul de mod 4–20 mA de pe partea frontală a shield-ului pentru a comuta AIN într-o intrare de buclă de curent de 4–20 mA.

Notă

SYN este o linie digitală open-drain, ridicată la 3,3 V pe partea camerei și la 5 V pe partea bornei SYN. În mod implicit este o intrare — shield-ul adaptează nivelul de 0–5 V de pe SYN în jos la 0–3,3 V pe P10. Modificați jumperul cu lipitură de pe placă pentru a transforma P10 într-o ieșire, adaptând nivelul de 0–3,3 V de pe P10 în sus la 0–5 V pe SYN.

Notă

Fiecare dintre P0, P1, P2, P6, P7, P8 și P10 poate fi recuperat pentru o utilizare diferită. P0, P2, P6, P7, P8 și P10 sunt conectate implicit prin jumpere cu lipitură de pe partea posterioară — deschideți jumperul de pe orice pin pe care doriți să-l eliberați. P1 este implicit deconectat: punteți jumperul de pe partea frontală pentru a direcționa DIR pentru O3/O4 către P1 în schimb (și deschideți jumperul de pe partea posterioară al P2 pentru a elibera P2).

Notă

Două jumpere de mod pe partea posterioară a shield-ului — câte unul pentru fiecare punte H — setează independent fiecare pereche de ieșiri într-unul din trei moduri. Fiecare jumper are marcaje L și H pentru a arăta care parte selectează care stare:

  • Low (implicit) — modul DIR/PWM: un pin DIR + un pin PWM pentru fiecare punte.

  • High — modul punte H: ambii pini acționează puntea direct prin tabela de adevăr cu două intrări a cipului.

  • Float (neconectat) — modul independent: fiecare pin devine un driver de linie de sine stătător direcționat către o ieșire.

Fiecare DRV8876 este limitat la 3 A în total pe cip — adică 3 A printr-o singură punte (mod DIR/PWM sau punte H) sau 1,5 A pe ieșire împărțit între cele două ieșiri (mod independent).

Utilizare

Modul DIR/PWM (implicit)

Acționați un motor de curent continuu cu perii pe perechea de ieșiri O1/O2 — setați direcția pe P0 și aplicați un semnal de viteză PWM pe P7. Bucla de mai jos crește gradual factorul de umplere până la viteza maximă și apoi îl scade, apoi inversează direcția și repetă:

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)

Cele două punți H pot acționa și un motor pas cu pas bipolar — mențineți ambele canale PWM la acționare maximă și parcurgeți pinii DIR prin secvența de patru faze:

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)

Modul punte H

Cu jumperul de mod setat pe high, ambii pini ai punții acționează direct puntea H. Pentru O1/O2 tabela de adevăr este:

  • (P0, P7) = (L, L) → ralanti (ieșiri Hi-Z)

  • (P0, P7) = (L, H) → înainte (O1 = H, O2 = L)

  • (P0, P7) = (H, L) → înapoi (O1 = L, O2 = H)

  • (P0, P7) = (H, H) → frânare (ambele ieșiri la nivel jos)

(O3/O4 urmează aceeași tabelă cu P1/P2 și P8.) Bucla de mai jos rotește un motor prin înainte → frânare → înapoi → ralanti pe perechea de ieșiri 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)

Oricare dintre pini poate fi înlocuit cu un canal machine.PWM pentru acționare proporțională — de exemplu, (P0=0, P7=PWM) oferă înainte/ralanti la factorul de umplere PWM, (P0=1, P7=PWM) oferă înapoi/frânare la (100 % duty). Bucla de mai jos crește și scade gradual factorul de umplere cu P0 menținut la 0 (înainte/ralanti):

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)

Modul independent

Cu jumperul de mod lăsat în float, fiecare pin devine un driver de linie de sine stătător direcționat către o ieșire — util pentru solenoizi, relee sau orice sarcină de tip pornit/oprit care nu necesită o punte H. Maparea este P7 → O1, P0 → O2, P8 → O3 și P1 (sau 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)

Oricare dintre cei patru pini poate fi de asemenea modulat PWM prin machine.PWM pentru acționare proporțională — de exemplu, estompați fiecare ieșire în sus și în jos pe rând:

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)

Alte I/O

Citiți intrarea de pe blocul de borne AIN prin pinul P6 cu nivel adaptat:

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)

Reacționați la o muchie descendentă pe linia SYN — de exemplu, pentru a sincroniza camera cu un alt dispozitiv care trage SYN la nivel jos:

from machine import Pin

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

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