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.

Driver Shield

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

Brochage du Driver Shield

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)