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.

Driver Shield

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

Driver Shield Pinout

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)