Driver Shield¶
El Driver Shield controla dos motores de 3 A o cuatro controladores de línea independientes de 1,5 A a partir de una amplia alimentación de 6-36 V, dotando a la OpenMV Cam de un robusto frontal de control de motores con protección contra inversión de polaridad y picos de tensión.
Para consultar la hoja de datos completa, fotos e información de compra, visite la página del producto Driver Shield.
Características destacadas¶
Dos controladores de motor de 3 A O cuatro controladores de línea de 1,5 A, 6-36 V
Protección contra inversión de polaridad y picos transitorios de tensión en la entrada
Entrada ADC de 0-5 V con protección contra sobretensión de ±36 V
E/S digital de 0-5 V para disparadores de sincronización de cámara, con protección contra cortocircuitos
Distribución de pines¶
Referencia de pines¶
Pin |
Función |
|---|---|
P0 |
DIR para el par de salida O1/O2 |
P1 |
DIR para el par de salida O3/O4 (alternativa) |
P2 |
DIR para el par de salida O3/O4 (predeterminado) |
P6 |
Lectura de AIN con nivel adaptado (0–3,3 V en P6) |
P7 |
PWM para el par de salida O1/O2 |
P8 |
PWM para el par de salida O3/O4 |
P10 |
SYN — E/S digital de drenador abierto en el bloque de terminales |
PWR in |
Entrada amplia de 6–36 V en el bloque de terminales (tolerante a inversión de polaridad) |
AIN in |
Entrada analógica en el bloque de terminales |
VIN out |
5,4 V hasta 600 mA desde el regulador integrado en la placa |
Línea de 3,3 V |
Alimenta la electrónica integrada del shield |
Línea GND |
Masa común |
Nota
AIN cuenta con protección contra sobretensión hasta ±36 V y, de forma predeterminada, es una entrada de tensión de 0–5 V, reducida a 0–3,3 V en P6. Puentee el shunt del modo 4–20 mA en el frente del shield para conmutar AIN a una entrada de bucle de corriente de 4–20 mA.
Nota
SYN es una línea digital de drenador abierto, con resistencia pull-up a 3,3 V en el lado de la cámara y a 5 V en el lado del terminal SYN. De forma predeterminada es una entrada — el shield adapta el nivel de 0–5 V en SYN a 0–3,3 V en P10. Cambie el puente de soldadura integrado para convertir P10 en una salida, adaptando el nivel de 0–3,3 V en P10 a 0–5 V en SYN.
Nota
Cada uno de los pines P0, P1, P2, P6, P7, P8 y P10 puede recuperarse para un uso no relacionado. P0, P2, P6, P7, P8 y P10 están conectados de forma predeterminada mediante puentes de soldadura en la cara posterior — abra el puente del pin que desee liberar. P1 está desconectado de forma predeterminada: puentee su puente frontal para enrutar DIR de O3/O4 a P1 en su lugar (y abra el puente posterior de P2 para liberar P2).
Nota
Dos puentes de modo en la parte posterior del shield — uno por cada puente en H — configuran de forma independiente cada par de salida en uno de tres modos. Cada puente tiene marcas L y H que indican qué lado selecciona cada estado:
Bajo (predeterminado) — modo DIR/PWM: un pin DIR + un pin PWM por puente.
Alto — modo puente en H: ambos pines controlan el puente directamente mediante la tabla de verdad de dos entradas del chip.
Flotante (sin conexión) — modo independiente: cada pin se convierte en un controlador de línea autónomo enrutado a una salida.
Cada DRV8876 está limitado en corriente a 3 A en total por chip — es decir, 3 A a través de un puente (modo DIR/PWM o puente en H) o 1,5 A por salida repartidos entre las dos salidas (modo independiente).
Uso¶
Modo DIR/PWM (predeterminado)¶
Controle un motor de CC con escobillas en el par de salida O1/O2 — establezca la dirección en P0 y aplique una señal de velocidad PWM en P7. El bucle siguiente aumenta el ciclo de trabajo hasta la velocidad máxima y lo reduce de nuevo, luego invierte la dirección y repite:
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)
Los dos puentes en H también pueden controlar un motor paso a paso bipolar — mantenga ambos canales PWM a plena potencia y haga avanzar los pines DIR a través de la secuencia de cuatro fases:
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)
Modo puente en H¶
Con el puente de modo en alto, ambos pines del puente controlan el puente en H directamente. Para O1/O2 la tabla de verdad es:
(P0, P7) = (L, L)→ punto muerto (salidas en alta impedancia)(P0, P7) = (L, H)→ avance (O1 = H, O2 = L)(P0, P7) = (H, L)→ retroceso (O1 = L, O2 = H)(P0, P7) = (H, H)→ frenado (ambas salidas en bajo)
(O3/O4 sigue la misma tabla con P1/P2 y P8). El bucle siguiente recorre un motor por avance → frenado → retroceso → punto muerto en el par de salida 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)
Cualquiera de los dos pines puede sustituirse por un canal machine.PWM para un control proporcional — por ejemplo, (P0=0, P7=PWM) da avance/punto muerto al ciclo de trabajo PWM, (P0=1, P7=PWM) da retroceso/frenado al (100 % − duty). El bucle siguiente aumenta y reduce el ciclo de trabajo con P0 mantenido en 0 (avance/punto muerto):
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)
Modo independiente¶
Con el puente de modo flotante, cada pin se convierte en un controlador de línea autónomo enrutado a una salida — útil para solenoides, relés o cualquier carga de encendido/apagado que no necesite un puente en H. La asignación es P7 → O1, P0 → O2, P8 → O3 y P1 (o 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)
Cualquiera de los cuatro pines también puede controlarse con PWM mediante machine.PWM para un control proporcional — por ejemplo, atenuar cada salida de forma ascendente y descendente por turnos:
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)
Otras E/S¶
Lea la entrada del bloque de terminales AIN a través del pin P6 con nivel adaptado:
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)
Reaccione a un flanco de bajada en la línea SYN — por ejemplo, para sincronizar la cámara con otro dispositivo que tira de SYN a bajo:
from machine import Pin
def on_sync(pin):
print("SYN falling edge")
syn = Pin("P10", Pin.IN)
syn.irq(on_sync, Pin.IRQ_FALLING)