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