Módulo Driver

O Módulo Driver aciona dois motores de 3 A ou quatro drivers de linha independentes de 1,5 A a partir de uma alimentação ampla de 6–36 V, fornecendo à OpenMV Cam uma interface robusta de controlo de motores com proteção contra inversão de polaridade e picos de tensão.

Driver Shield

Para o datasheet completo, fotografias e informações de compra, consulte a página do produto Módulo Driver.

Destaques

  • Drivers de motor duplos de 3 A OU drivers de linha quádruplos de 1,5 A, 6–36 V

  • Proteção contra inversão de polaridade e picos transitórios na entrada

  • Entrada ADC de 0–5 V com proteção contra sobretensão de ±36 V

  • I/O digital de 0–5 V para gatilhos de sincronização de câmara, com proteção contra curto-circuito

Pinagem

Driver Shield Pinout

Referência de pinos

Pino

Função

P0

DIR para o par de saídas O1/O2

P1

DIR para o par de saídas O3/O4 (alternativo)

P2

DIR para o par de saídas O3/O4 (padrão)

P6

Leitura AIN com mudança de nível (0–3,3 V em P6)

P7

PWM para o par de saídas O1/O2

P8

PWM para o par de saídas O3/O4

P10

SYN — I/O digital de coletor aberto no bloco de terminais

Entrada PWR

Entrada ampla de 6–36 V no bloco de terminais (tolerante à inversão de polaridade)

Entrada AIN

Entrada analógica no bloco de terminais

Saída VIN

5,4 V a até 600 mA a partir do regulador integrado

Rail 3.3V

Alimenta os componentes eletrónicos integrados do módulo

Rail GND

Terra comum

Nota

AIN tem proteção contra sobretensão até ±36 V e aceita por defeito uma entrada de tensão de 0–5 V, escalada para 0–3,3 V em P6. Ponteie o shunt do modo 4–20 mA na frente do módulo para mudar AIN para uma entrada de laço de corrente 4–20 mA.

Nota

SYN é uma linha digital de coletor aberto, com pull-up para 3,3 V no lado da câmara e para 5 V no lado do terminal SYN. Por defeito é uma entrada — o módulo faz a mudança de nível de 0–5 V em SYN para 0–3,3 V em P10. Altere a ponte de solda integrada para colocar P10 em modo de saída, fazendo a mudança de nível de 0–3,3 V em P10 para 0–5 V em SYN.

Nota

Cada um dos pinos P0, P1, P2, P6, P7, P8 e P10 pode ser reclamado para uso independente. P0, P2, P6, P7, P8 e P10 estão ligados por defeito através de pontes de solda na face traseira — abra a ponte de qualquer pino que pretenda libertar. P1 está desligado por defeito: ponteie a sua ponte na face frontal para encaminhar DIR de O3/O4 para P1 (e abra a ponte traseira de P2 para libertar P2).

Nota

Dois jumpers de modo na parte traseira do módulo — um por ponte H — definem independentemente cada par de saídas num de três modos. Cada jumper tem marcações L e H para indicar qual o lado que seleciona cada estado:

  • Low (padrão) — Modo DIR/PWM: um pino DIR + um pino PWM por ponte.

  • High — Modo ponte H: ambos os pinos acionam a ponte diretamente através da tabela de verdade de duas entradas do circuito integrado.

  • Float (sem ligação) — Modo independente: cada pino torna-se um driver de linha autónomo encaminhado para uma saída.

Cada DRV8876 tem limitação de corrente a 3 A no total por circuito integrado — ou seja, 3 A através de uma ponte (modo DIR/PWM ou modo ponte H) ou 1,5 A por saída distribuído pelas duas saídas (modo independente).

Utilização

Modo DIR/PWM (padrão)

Acionar um motor DC com escovas no par de saídas O1/O2 — defina a direção em P0 e aplique um sinal PWM de velocidade em P7. O ciclo abaixo aumenta o ciclo de trabalho até à velocidade máxima e depois reduz, inverte a direção e repete:

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)

As duas pontes H podem também acionar um motor de passo bipolar — mantenha os dois canais PWM a acionamento máximo e avance os pinos DIR pela sequência de quatro 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 ponte H

Com o jumper de modo em nível alto, ambos os pinos da ponte acionam a ponte H diretamente. Para O1/O2, a tabela de verdade é:

  • (P0, P7) = (L, L) → deriva (saídas Hi-Z)

  • (P0, P7) = (L, H) → frente (O1 = H, O2 = L)

  • (P0, P7) = (H, L) → trás (O1 = L, O2 = H)

  • (P0, P7) = (H, H) → travagem (saídas ambas a baixo)

(O3/O4 segue a mesma tabela com P1/P2 e P8.) O ciclo abaixo percorre um motor em frente → travagem → trás → deriva no par de saídas 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)

Qualquer pino pode ser substituído por um canal machine.PWM para acionamento proporcional — por exemplo, (P0=0, P7=PWM) dá frente/deriva ao ciclo de trabalho PWM, (P0=1, P7=PWM) dá trás/travagem a (100 % duty). O ciclo abaixo aumenta e diminui o ciclo de trabalho com P0 fixo a 0 (frente/deriva):

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 independente

Com o jumper de modo flutuante, cada pino torna-se um driver de linha autónomo encaminhado para uma saída — útil para solenoides, relés ou qualquer carga de ligado/desligado que não necessite de uma ponte H. O mapeamento é P7 → O1, P0 → O2, P8 → O3 e P1 (ou 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)

Qualquer um dos quatro pinos pode também ser controlado por PWM via machine.PWM para acionamento proporcional — por exemplo, aumentar e diminuir gradualmente cada saída por sua vez:

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)

Outros I/O

Ler a entrada do bloco de terminais AIN através do pino P6 com mudança de nível:

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)

Reagir a uma aresta descendente na linha SYN — por exemplo, para sincronizar a câmara com outro dispositivo que coloque SYN em nível baixo:

from machine import Pin

def on_sync(pin):
    print("SYN falling edge")

syn = Pin("P10", Pin.IN)
syn.irq(on_sync, Pin.IRQ_FALLING)