Driver Shield

De Driver Shield stuurt twee motoren van 3 A of vier onafhankelijke line drivers van 1,5 A aan vanuit een brede voeding van 6-36 V, en geeft de OpenMV Cam zo een robuuste motorbesturings-frontend met bescherming tegen omgekeerde spanning en spanningspieken.

Driver Shield

Voor de volledige datasheet, foto’s en bestelinformatie, zie de productpagina van de Driver Shield.

Hoogtepunten

  • Twee motor drivers van 3 A OF vier line drivers van 1,5 A, 6-36 V

  • Bescherming tegen omgekeerde spanning en kortstondige spanningspieken op de ingang

  • 0-5 V ADC-ingang met overspanningsbeveiliging tot ±36 V

  • 0-5 V digitale I/O voor camera-synctriggers, kortsluitbeveiligd

Pinout

Driver Shield Pinout

Pinreferentie

Pin

Functie

P0

DIR voor uitgangspaar O1/O2

P1

DIR voor uitgangspaar O3/O4 (alternatief)

P2

DIR voor uitgangspaar O3/O4 (standaard)

P6

Niveau-aangepaste AIN-uitlezing (0–3,3 V op P6)

P7

PWM voor uitgangspaar O1/O2

P8

PWM voor uitgangspaar O3/O4

P10

SYN — open-drain digitale I/O op het klemmenblok

PWR in

6–36 V brede ingang op het klemmenblok (bestand tegen omgekeerde spanning)

AIN in

Analoge ingang op het klemmenblok

VIN uit

5,4 V bij maximaal 600 mA vanuit de regelaar op de print

3.3V-rail

Voedt de elektronica op de print van de shield

GND-rail

Gemeenschappelijke aarde

Notitie

AIN is beschermd tegen overspanning tot ±36 V en is standaard een spanningsingang van 0–5 V, neergeschaald naar 0–3,3 V op P6. Overbrug de 4–20 mA-modus shunt aan de voorkant van de shield om AIN over te schakelen naar een 4–20 mA stroomlus-ingang.

Notitie

SYN is een open-drain digitale lijn, opgetrokken naar 3,3 V aan de camerazijde en 5 V aan de SYN-klemzijde. Standaard is het een ingang — de shield schaalt 0–5 V op SYN niveau naar 0–3,3 V op P10. Wijzig de soldeerjumper op de print om P10 naar een uitgang om te zetten, waarbij 0–3,3 V op P10 wordt opgeschaald naar 0–5 V op SYN.

Notitie

Elk van P0, P1, P2, P6, P7, P8 en P10 kan worden teruggewonnen voor ongerelateerd gebruik. P0, P2, P6, P7, P8 en P10 zijn standaard verbonden via soldeerjumpers aan de achterkant — open de jumper op elke pin die je wilt vrijmaken. P1 is standaard losgekoppeld: overbrug de jumper aan de voorkant om in plaats daarvan DIR voor O3/O4 naar P1 te routeren (en open de achterkant-jumper van P2 om P2 vrij te geven).

Notitie

Twee modusjumpers aan de achterkant van de shield — één per H-brug — stellen elk uitgangspaar onafhankelijk in op een van de drie modi. Elke jumper heeft markeringen L en H om aan te geven welke zijde welke toestand selecteert:

  • Low (standaard) — DIR/PWM-modus: één DIR-pin + één PWM-pin per brug.

  • High — H-brug-modus: beide pinnen sturen de brug rechtstreeks aan via de tweepuntige waarheidstabel van de chip.

  • Float (niet verbonden) — onafhankelijke modus: elke pin wordt een op zichzelf staande line driver die naar één uitgang wordt geleid.

Elke DRV8876 is stroombegrensd tot in totaal 3 A per chip — dat is 3 A door één brug (DIR/PWM- of H-brug-modus) of 1,5 A per uitgang verdeeld over de twee uitgangen (onafhankelijke modus).

Gebruik

DIR/PWM-modus (standaard)

Stuur een geborstelde DC-motor aan op uitgangspaar O1/O2 — stel de richting in op P0 en pas een PWM-snelheidssignaal toe op P7. De onderstaande lus laat de duty cycle oplopen tot volle snelheid en weer terug, keert dan de richting om en herhaalt:

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)

De twee H-bruggen kunnen ook een bipolaire stappenmotor aansturen — houd beide PWM-kanalen op volle aansturing en stap de DIR-pinnen door de vierfasensequentie:

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)

H-brug-modus

Met de modusjumper op high ingesteld sturen beide brugpinnen de H-brug rechtstreeks aan. Voor O1/O2 is de waarheidstabel:

  • (P0, P7) = (L, L) → uitrollen (uitgangen Hi-Z)

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

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

  • (P0, P7) = (H, H) → remmen (beide uitgangen laag)

(O3/O4 volgt dezelfde tabel met P1/P2 en P8.) De onderstaande lus laat een motor doorlopen van vooruit → remmen → achteruit → uitrollen op uitgangspaar 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)

Elk van de pinnen kan worden vervangen door een machine.PWM-kanaal voor proportionele aansturing — bijv. (P0=0, P7=PWM) geeft vooruit/uitrollen bij de PWM-duty, (P0=1, P7=PWM) geeft achteruit/remmen bij (100 % duty). De onderstaande lus laat de duty oplopen en weer aflopen terwijl P0 op 0 wordt gehouden (vooruit/uitrollen):

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)

Onafhankelijke modus

Met de modusjumper op float wordt elke pin een op zichzelf staande line driver die naar één uitgang wordt geleid — handig voor solenoïdes, relais of elke aan/uit-belasting die geen H-brug nodig heeft. De toewijzing is P7 → O1, P0 → O2, P8 → O3 en P1 (of 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)

Elk van de vier pinnen kan ook via machine.PWM met PWM worden aangestuurd voor proportionele aansturing — bijvoorbeeld, laat elke uitgang om de beurt op- en aflopen:

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)

Overige I/O

Lees de AIN-klemmenblokingang uit via de niveau-aangepaste pin P6:

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)

Reageer op een dalende flank op de SYN-lijn — bijvoorbeeld om de camera te synchroniseren met een ander apparaat dat SYN laag trekt:

from machine import Pin

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

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