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

Distribución de pines del Driver Shield

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)