Driver Shield¶
Driver Shield kör två 3 A-motorer eller fyra oberoende 1,5 A-linjedrivare från en bred matning på 6-36 V, vilket ger OpenMV Cam en robust frontdel för motorstyrning med skydd mot omvänd spänning och spänningstoppar.
För fullständigt datablad, foton och beställning, se produktsidan för Driver Shield.
Höjdpunkter¶
Dubbla 3 A-motordrivare ELLER fyra 1,5 A-linjedrivare, 6-36 V
Skydd mot omvänd spänning och transienta spänningstoppar på ingången
0-5 V ADC-ingång med ±36 V överspänningsskydd
0-5 V digital I/O för kamerasynkroniseringstriggers, kortslutningsskyddad
Stiftutgång¶
Stiftreferens¶
Stift |
Funktion |
|---|---|
P0 |
DIR för utgångsparet O1/O2 |
P1 |
DIR för utgångsparet O3/O4 (alternativ) |
P2 |
DIR för utgångsparet O3/O4 (standard) |
P6 |
Nivåförskjuten AIN-återläsning (0–3,3 V på P6) |
P7 |
PWM för utgångsparet O1/O2 |
P8 |
PWM för utgångsparet O3/O4 |
P10 |
SYN — digital I/O med öppen dränering på kopplingsplinten |
PWR in |
6–36 V bred ingång på kopplingsplinten (tål omvänd spänning) |
AIN in |
Analog ingång på kopplingsplinten |
VIN ut |
5,4 V vid upp till 600 mA från den inbyggda regulatorn |
3,3 V-skena |
Försörjer shieldets inbyggda elektronik |
GND-skena |
Gemensam jord |
Anteckning
AIN är överspänningsskyddad upp till ±36 V och är som standard en 0–5 V-spänningsingång, nedskalad till 0–3,3 V på P6. Bygla 4–20 mA-lägets shunt på shieldets framsida för att växla AIN till en 4–20 mA-strömslingeingång.
Anteckning
SYN är en digital linje med öppen dränering, uppdragen till 3,3 V på kamerasidan och 5 V på SYN-plintsidan. Som standard är den en ingång — shieldet nivåförskjuter 0–5 V på SYN ned till 0–3,3 V på P10. Ändra den inbyggda lödbygeln för att vända P10 till en utgång, som nivåförskjuter 0–3,3 V på P10 upp till 0–5 V på SYN.
Anteckning
Var och en av P0, P1, P2, P6, P7, P8 och P10 kan återanvändas för annan användning. P0, P2, P6, P7, P8 och P10 är anslutna som standard via lödbyglar på baksidan — öppna bygeln på vilket stift du vill frigöra. P1 är som standard frånkopplad: bygla dess bygel på framsidan för att istället dra DIR för O3/O4 till P1 (och öppna P2:s bygel på baksidan för att frigöra P2).
Anteckning
Två lägesbyglar på shieldets baksida — en per H-brygga — ställer oberoende in varje utgångspar i ett av tre lägen. Varje bygel har L- och H-markeringar som visar vilken sida som väljer vilket tillstånd:
Låg (standard) — DIR/PWM-läge: ett DIR-stift + ett PWM-stift per brygga.
Hög — H-bryggläge: båda stiften driver bryggan direkt via chipets sanningstabell med två ingångar.
Flytande (ingen anslutning) — oberoende läge: varje stift blir en fristående linjedrivare dirigerad till en utgång.
Varje DRV8876 är strömbegränsad till totalt 3 A per chip — det är 3 A genom en brygga (DIR/PWM- eller H-bryggläge) eller 1,5 A per utgång fördelat över de två utgångarna (oberoende läge).
Användning¶
DIR/PWM-läge (standard)¶
Driv en borstad DC-motor på utgångsparet O1/O2 — ställ riktning på P0 och tillämpa en PWM-hastighetssignal på P7. Slingan nedan ökar arbetscykeln upp till full hastighet och ned igen, vänder sedan riktningen och upprepar:
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 två H-bryggorna kan även driva en bipolär stegmotor — håll båda PWM-kanalerna på full drift och stega DIR-stiften genom fyrfassekvensen:
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-bryggläge¶
Med lägesbygeln satt på hög driver båda bryggstiften H-bryggan direkt. För O1/O2 är sanningstabellen:
(P0, P7) = (L, L)→ friløb (utgångar Hi-Z)(P0, P7) = (L, H)→ framåt (O1 = H, O2 = L)(P0, P7) = (H, L)→ bakåt (O1 = L, O2 = H)(P0, P7) = (H, H)→ broms (båda utgångarna låga)
(O3/O4 följer samma tabell med P1/P2 och P8.) Slingan nedan cyklar en motor genom framåt → broms → bakåt → friløb på utgångsparet 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)
Vilket stift som helst kan bytas ut mot en machine.PWM-kanal för proportionell drift — t.ex. ger (P0=0, P7=PWM) framåt/friløb vid PWM-arbetscykeln, (P0=1, P7=PWM) ger bakåt/broms vid (100 % − duty). Slingan nedan ökar arbetscykeln upp och ned igen med P0 hållen på 0 (framåt/friløb):
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)
Oberoende läge¶
Med lägesbygeln flytande blir varje stift en fristående linjedrivare dirigerad till en utgång — användbart för solenoider, reläer eller vilken på/av-last som helst som inte behöver en H-brygga. Mappningen är P7 → O1, P0 → O2, P8 → O3 och P1 (eller 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)
Vilket som helst av de fyra stiften kan också PWM:as via machine.PWM för proportionell drift — till exempel kan du tona varje utgång upp och ned i tur och ordning:
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)
Annan I/O¶
Läs AIN-kopplingsplintens ingång via det nivåförskjutna P6-stiftet:
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)
Reagera på en fallande flank på SYN-linjen — till exempel för att synkronisera kameran med en annan enhet som drar SYN lågt:
from machine import Pin
def on_sync(pin):
print("SYN falling edge")
syn = Pin("P10", Pin.IN)
syn.irq(on_sync, Pin.IRQ_FALLING)