Driver Shield¶
Le Driver Shield commande deux moteurs de 3 A ou quatre pilotes de ligne indépendants de 1,5 A à partir d’une alimentation étendue de 6 à 36 V, offrant à l’OpenMV Cam un étage d’entrée robuste de contrôle moteur avec protection contre l’inversion de tension et les surtensions.
Pour la fiche technique complète, les photos et la commande, consultez la page produit du Driver Shield.
Points forts¶
Deux pilotes de moteur de 3 A OU quatre pilotes de ligne de 1,5 A, 6 à 36 V
Protection contre l’inversion de tension et les surtensions transitoires sur l’entrée
Entrée ADC 0 à 5 V avec protection contre les surtensions de ±36 V
E/S numériques 0 à 5 V pour les déclencheurs de synchronisation de la caméra, protégées contre les courts-circuits
Brochage¶
Référence des broches¶
Broche |
Fonction |
|---|---|
P0 |
DIR pour la paire de sorties O1/O2 |
P1 |
DIR pour la paire de sorties O3/O4 (alternative) |
P2 |
DIR pour la paire de sorties O3/O4 (par défaut) |
P6 |
Relecture de AIN à niveau adapté (0 à 3,3 V sur P6) |
P7 |
PWM pour la paire de sorties O1/O2 |
P8 |
PWM pour la paire de sorties O3/O4 |
P10 |
SYN — E/S numérique à drain ouvert sur le bornier |
PWR in |
Entrée étendue de 6 à 36 V sur le bornier (tolérante à l’inversion de tension) |
AIN in |
Entrée analogique sur le bornier |
VIN out |
5,4 V jusqu’à 600 mA depuis le régulateur intégré |
Rail 3,3 V |
Alimente l’électronique intégrée du shield |
Rail GND |
Masse commune |
Note
AIN est protégée contre les surtensions jusqu’à ±36 V et fonctionne par défaut comme une entrée en tension de 0 à 5 V, ramenée à 0 à 3,3 V sur P6. Pontez le shunt du mode 4 à 20 mA à l’avant du shield pour basculer AIN en entrée de boucle de courant 4 à 20 mA.
Note
SYN est une ligne numérique à drain ouvert, tirée à 3,3 V côté caméra et à 5 V côté borne SYN. Par défaut, c’est une entrée — le shield adapte le niveau de 0 à 5 V sur SYN vers 0 à 3,3 V sur P10. Modifiez le cavalier à souder intégré pour transformer P10 en sortie, en adaptant le niveau de 0 à 3,3 V sur P10 vers 0 à 5 V sur SYN.
Note
Chacune des broches P0, P1, P2, P6, P7, P8 et P10 peut être récupérée pour un autre usage. P0, P2, P6, P7, P8 et P10 sont connectées par défaut via des cavaliers à souder au dos — ouvrez le cavalier de toute broche que vous souhaitez libérer. P1 est déconnectée par défaut : pontez son cavalier à l’avant pour acheminer DIR pour O3/O4 vers P1 à la place (et ouvrez le cavalier au dos de P2 pour libérer P2).
Note
Deux cavaliers de mode au dos du shield — un par pont en H — règlent indépendamment chaque paire de sorties dans l’un des trois modes. Chaque cavalier porte les repères L et H pour indiquer quel côté sélectionne quel état :
Bas (par défaut) — mode DIR/PWM : une broche DIR + une broche PWM par pont.
Haut — mode pont en H : les deux broches commandent directement le pont via la table de vérité à deux entrées de la puce.
Flottant (non connecté) — mode indépendant : chaque broche devient un pilote de ligne autonome acheminé vers une sortie.
Chaque DRV8876 est limité en courant à 3 A au total par puce — c’est-à-dire 3 A à travers un pont (mode DIR/PWM ou pont en H) ou 1,5 A par sortie répartis entre les deux sorties (mode indépendant).
Utilisation¶
Mode DIR/PWM (par défaut)¶
Commandez un moteur à courant continu à balais sur la paire de sorties O1/O2 — réglez le sens sur P0 et appliquez un signal de vitesse PWM sur P7. La boucle ci-dessous augmente le rapport cyclique jusqu’à la vitesse maximale puis le diminue, inverse ensuite le sens et recommence
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)
Les deux ponts en H peuvent aussi commander un moteur pas à pas bipolaire — maintenez les deux canaux PWM à pleine puissance et faites avancer les broches DIR selon la séquence à quatre phases
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)
Mode pont en H¶
Avec le cavalier de mode réglé sur haut, les deux broches du pont commandent directement le pont en H. Pour O1/O2, la table de vérité est :
(P0, P7) = (L, L)→ roue libre (sorties Hi-Z)(P0, P7) = (L, H)→ avant (O1 = H, O2 = L)(P0, P7) = (H, L)→ arrière (O1 = L, O2 = H)(P0, P7) = (H, H)→ frein (les deux sorties basses)
(O3/O4 suit la même table avec P1/P2 et P8.) La boucle ci-dessous fait passer un moteur par avant → frein → arrière → roue libre sur la paire de sorties 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)
L’une ou l’autre broche peut être remplacée par un canal machine.PWM pour une commande proportionnelle — par exemple, (P0=0, P7=PWM) donne avant/roue libre au rapport cyclique PWM, (P0=1, P7=PWM) donne arrière/frein à (100 % − duty). La boucle ci-dessous augmente puis diminue le rapport cyclique avec P0 maintenu à 0 (avant/roue libre)
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)
Mode indépendant¶
Avec le cavalier de mode flottant, chaque broche devient un pilote de ligne autonome acheminé vers une sortie — utile pour les solénoïdes, les relais ou toute charge tout-ou-rien ne nécessitant pas de pont en H. La correspondance est P7 → O1, P0 → O2, P8 → O3 et P1 (ou 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)
Chacune des quatre broches peut aussi être pilotée en PWM via machine.PWM pour une commande proportionnelle — par exemple, faites varier l’intensité de chaque sortie à tour de rôle
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)
Autres E/S¶
Lisez l’entrée du bornier AIN via la broche P6 à niveau adapté
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)
Réagissez à un front descendant sur la ligne SYN — par exemple, pour synchroniser la caméra avec un autre appareil tirant SYN à l’état bas
from machine import Pin
def on_sync(pin):
print("SYN falling edge")
syn = Pin("P10", Pin.IN)
syn.irq(on_sync, Pin.IRQ_FALLING)