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