Driver Shield

Il Driver Shield comanda due motori da 3 A oppure quattro line driver indipendenti da 1.5 A con un’ampia alimentazione da 6-36 V, fornendo all’OpenMV Cam un robusto front-end per il controllo dei motori con protezione da inversione di tensione e sovratensioni.

Driver Shield

Per il datasheet completo, le foto e gli ordini consulta la pagina prodotto del Driver Shield.

Punti salienti

  • Doppio motor driver da 3 A OPPURE quad line driver da 1.5 A, 6-36 V

  • Protezione da inversione di tensione e sovratensioni transitorie sull’ingresso

  • Ingresso ADC 0-5 V con protezione da sovratensione ±36 V

  • I/O digitale 0-5 V per trigger di sincronizzazione della camera, protetto da cortocircuito

Pinout

Pinout del Driver Shield

Riferimento dei pin

Pin

Funzione

P0

DIR per la coppia di uscite O1/O2

P1

DIR per la coppia di uscite O3/O4 (alternativa)

P2

DIR per la coppia di uscite O3/O4 (predefinito)

P6

Lettura AIN con livello traslato (0–3.3 V su P6)

P7

PWM per la coppia di uscite O1/O2

P8

PWM per la coppia di uscite O3/O4

P10

SYN — I/O digitale open-drain sulla morsettiera

PWR in

Ampio ingresso 6–36 V sulla morsettiera (tollera l’inversione di tensione)

AIN in

Ingresso analogico sulla morsettiera

VIN out

5.4 V fino a 600 mA dal regolatore on-board

Linea 3.3V

Alimenta l’elettronica on-board dello shield

Linea GND

Massa comune

Nota

AIN è protetto da sovratensione fino a ±36 V e per impostazione predefinita è un ingresso in tensione 0–5 V, ridotto a 0–3.3 V su P6. Ponticella lo shunt della modalità 4–20 mA sul fronte dello shield per commutare AIN su un ingresso a loop di corrente 4–20 mA.

Nota

SYN è una linea digitale open-drain, con pull-up a 3.3 V sul lato camera e a 5 V sul lato del terminale SYN. Per impostazione predefinita è un ingresso — lo shield trasla il livello da 0–5 V su SYN a 0–3.3 V su P10. Cambia il jumper a saldare on-board per trasformare P10 in un’uscita, traslando il livello da 0–3.3 V su P10 a 0–5 V su SYN.

Nota

Ciascuno dei pin P0, P1, P2, P6, P7, P8 e P10 può essere recuperato per un uso non correlato. P0, P2, P6, P7, P8 e P10 sono collegati per impostazione predefinita tramite jumper a saldare sul retro — apri il jumper su qualsiasi pin che vuoi liberare. P1 è scollegato per impostazione predefinita: ponticella il suo jumper sul fronte per instradare DIR per O3/O4 su P1 (e apri il jumper sul retro di P2 per liberare P2).

Nota

Due jumper di modalità sul retro dello shield — uno per ogni ponte H — impostano in modo indipendente ciascuna coppia di uscite in una delle tre modalità. Ogni jumper ha le marcature L e H per indicare quale lato seleziona quale stato:

  • Low (predefinito) — modalità DIR/PWM: un pin DIR + un pin PWM per ponte.

  • High — modalità ponte H: entrambi i pin comandano il ponte direttamente tramite la tabella di verità a due ingressi del chip.

  • Float (non collegato) — modalità indipendente: ciascun pin diventa un line driver autonomo instradato a una uscita.

Ogni DRV8876 è limitato in corrente a 3 A totali per chip — ovvero 3 A attraverso un ponte (modalità DIR/PWM o ponte H) oppure 1.5 A per uscita suddivisi tra le due uscite (modalità indipendente).

Utilizzo

Modalità DIR/PWM (predefinita)

Comanda un motore DC a spazzole sulla coppia di uscite O1/O2 — imposta la direzione su P0 e applica un segnale PWM di velocità su P7. Il ciclo seguente aumenta progressivamente il duty cycle fino alla massima velocità e poi lo riduce, quindi inverte la direzione e ripete:

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)

I due ponti H possono anche comandare un motore passo-passo bipolare — mantieni entrambi i canali PWM al massimo e fai avanzare i pin DIR attraverso la sequenza a quattro fasi:

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)

Modalità ponte H

Con il jumper di modalità impostato su high, entrambi i pin del ponte comandano direttamente il ponte H. Per O1/O2 la tabella di verità è:

  • (P0, P7) = (L, L) → folle (uscite Hi-Z)

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

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

  • (P0, P7) = (H, H) → frenata (entrambe le uscite basse)

(O3/O4 segue la stessa tabella con P1/P2 e P8.) Il ciclo seguente fa passare un motore attraverso avanti → frenata → indietro → folle sulla coppia di uscite 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)

Uno dei due pin può essere sostituito con un canale machine.PWM per un comando proporzionale — ad esempio (P0=0, P7=PWM) fornisce avanti/folle al duty del PWM, (P0=1, P7=PWM) fornisce indietro/frenata a (100 % duty). Il ciclo seguente aumenta e diminuisce il duty con P0 tenuto a 0 (avanti/folle):

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)

Modalità indipendente

Con il jumper di modalità lasciato flottante, ciascun pin diventa un line driver autonomo instradato a una uscita — utile per solenoidi, relè o qualsiasi carico on/off che non necessita di un ponte H. La mappatura è P7 → O1, P0 → O2, P8 → O3 e P1 (o 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)

Ciascuno dei quattro pin può anche essere pilotato in PWM tramite machine.PWM per un comando proporzionale — ad esempio, fai aumentare e diminuire ogni uscita a turno:

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)

Altro I/O

Leggi l’ingresso della morsettiera AIN attraverso il pin P6 a livello traslato:

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)

Reagisci a un fronte di discesa sulla linea SYN — ad esempio, per sincronizzare la camera con un altro dispositivo che porta SYN a livello basso:

from machine import Pin

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

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