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.
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¶
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)