Driver Shield

Das Driver Shield treibt zwei 3-A-Motoren oder vier unabhängige 1,5-A-Leitungstreiber aus einer weiten 6-36-V-Versorgung und verleiht der OpenMV Cam ein robustes Motorsteuerungs-Frontend mit Verpolungs- und Überspannungsschutz.

Driver Shield

Vollständiges Datenblatt, Fotos und Bestellinformationen finden Sie auf der Driver-Shield-Produktseite.

Höhepunkte

  • Zwei 3-A-Motortreiber ODER vier 1,5-A-Leitungstreiber, 6-36 V

  • Verpolungs- und Überspannungsschutz am Eingang

  • 0-5-V-ADC-Eingang mit ±36-V-Überspannungsschutz

  • 0-5-V-Digital-I/O für Kamerasynchronisations-Trigger, kurzschlussgeschützt

Pinbelegung

Driver-Shield-Pinbelegung

Pin-Referenz

Pin

Funktion

P0

DIR für Ausgangspaar O1/O2

P1

DIR für Ausgangspaar O3/O4 (alternativ)

P2

DIR für Ausgangspaar O3/O4 (Standard)

P6

Pegelverschobene AIN-Rückmeldung (0–3,3 V an P6)

P7

PWM für Ausgangspaar O1/O2

P8

PWM für Ausgangspaar O3/O4

P10

SYN — Open-Drain-Digital-I/O am Klemmenblock

PWR ein

6–36-V-Weitbereichseingang am Klemmenblock (verpolungstolerant)

AIN ein

Analogeingang am Klemmenblock

VIN aus

5,4 V bei bis zu 600 mA vom integrierten Regler

3,3-V-Schiene

Versorgt die integrierte Elektronik des Shields

GND-Schiene

Gemeinsame Masse

Bemerkung

AIN ist bis zu ±36 V überspannungsgeschützt und ist standardmäßig ein 0–5-V-Spannungseingang, der an P6 auf 0–3,3 V herunterskaliert wird. Überbrücken Sie den 4–20-mA-Modus-Shunt auf der Vorderseite des Shields, um AIN auf einen 4–20-mA-Stromschleifeneingang umzuschalten.

Bemerkung

SYN ist eine Open-Drain-Digitalleitung, auf der Kameraseite auf 3,3 V und auf der SYN-Klemmenseite auf 5 V hochgezogen. Standardmäßig ist sie ein Eingang — das Shield verschiebt 0–5 V an SYN auf 0–3,3 V an P10. Ändern Sie den integrierten Lötjumper, um P10 in einen Ausgang umzuschalten, der 0–3,3 V an P10 auf 0–5 V an SYN hochskaliert.

Bemerkung

Jeder der Pins P0, P1, P2, P6, P7, P8 und P10 kann für nicht zusammenhängende Zwecke zurückgewonnen werden. P0, P2, P6, P7, P8 und P10 sind standardmäßig über rückseitige Lötjumper verbunden — öffnen Sie den Jumper an jedem Pin, den Sie freigeben möchten. P1 ist standardmäßig getrennt: Überbrücken Sie seinen vorderseitigen Jumper, um DIR für O3/O4 stattdessen zu P1 zu führen (und öffnen Sie den rückseitigen Jumper von P2, um P2 freizugeben).

Bemerkung

Zwei Modusjumper auf der Rückseite des Shields — einer pro H-Brücke — versetzen jedes Ausgangspaar unabhängig in einen von drei Modi. Jeder Jumper hat L- und H-Markierungen, die anzeigen, welche Seite welchen Zustand auswählt:

  • Low (Standard) — DIR/PWM-Modus: ein DIR-Pin + ein PWM-Pin pro Brücke.

  • High — H-Brücken-Modus: beide Pins treiben die Brücke direkt über die Zwei-Eingangs-Wahrheitstabelle des Chips an.

  • Float (nicht verbunden) — unabhängiger Modus: jeder Pin wird zu einem eigenständigen Leitungstreiber, der zu einem Ausgang geführt wird.

Jeder DRV8876 ist auf insgesamt 3 A pro Chip strombegrenzt — das sind 3 A durch eine Brücke (DIR/PWM- oder H-Brücken-Modus) oder 1,5 A pro Ausgang, aufgeteilt auf die beiden Ausgänge (unabhängiger Modus).

Verwendung

DIR/PWM-Modus (Standard)

Treiben Sie einen Bürsten-Gleichstrommotor am Ausgangspaar O1/O2 an — stellen Sie die Richtung an P0 ein und legen Sie ein PWM-Drehzahlsignal an P7 an. Die folgende Schleife erhöht das Tastverhältnis bis zur Höchstdrehzahl und wieder herunter, kehrt dann die Richtung um und wiederholt den Vorgang:

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)

Die beiden H-Brücken können auch einen bipolaren Schrittmotor antreiben — halten Sie beide PWM-Kanäle auf voller Ansteuerung und schalten Sie die DIR-Pins durch die vierphasige Sequenz:

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-Brücken-Modus

Wenn der Modusjumper auf High gesetzt ist, treiben beide Brückenpins die H-Brücke direkt an. Für O1/O2 lautet die Wahrheitstabelle:

  • (P0, P7) = (L, L) → Leerlauf (Ausgänge Hi-Z)

  • (P0, P7) = (L, H) → vorwärts (O1 = H, O2 = L)

  • (P0, P7) = (H, L) → rückwärts (O1 = L, O2 = H)

  • (P0, P7) = (H, H) → Bremse (beide Ausgänge low)

(O3/O4 folgt derselben Tabelle mit P1/P2 und P8.) Die folgende Schleife durchläuft einen Motor durch vorwärts → Bremse → rückwärts → Leerlauf am Ausgangspaar 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)

Jeder Pin kann gegen einen machine.PWM-Kanal für proportionale Ansteuerung getauscht werden — z. B. ergibt (P0=0, P7=PWM) vorwärts/Leerlauf beim PWM-Tastverhältnis, (P0=1, P7=PWM) ergibt rückwärts/Bremse bei (100 % duty). Die folgende Schleife erhöht das Tastverhältnis und senkt es wieder, während P0 auf 0 gehalten wird (vorwärts/Leerlauf):

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)

Unabhängiger Modus

Wenn der Modusjumper floatet, wird jeder Pin zu einem eigenständigen Leitungstreiber, der zu einem Ausgang geführt wird — nützlich für Magnetventile, Relais oder jede Ein/Aus-Last, die keine H-Brücke benötigt. Die Zuordnung ist P7 → O1, P0 → O2, P8 → O3 und P1 (oder 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)

Jeder der vier Pins kann auch über machine.PWM für proportionale Ansteuerung mit PWM betrieben werden — blenden Sie zum Beispiel jeden Ausgang nacheinander hoch und herunter:

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)

Weitere I/O

Lesen Sie den AIN-Klemmenblock-Eingang über den pegelverschobenen Pin P6 aus:

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)

Reagieren Sie auf eine fallende Flanke an der SYN-Leitung — zum Beispiel, um die Kamera mit einem anderen Gerät zu synchronisieren, das SYN auf low zieht:

from machine import Pin

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

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