Motor Shield¶
El Motor Shield controla dos motores de CC desde la OpenMV Cam usando un puente en H doble TB6612FNG, con un regulador lineal NCP1117 de 5 V que alimenta tanto la cámara como los motores a partir de una única entrada de batería de 6,5–18 V.
Para consultar la hoja de datos completa, fotos e información de compra, visite la página del producto Motor Shield.
Características destacadas¶
Dos canales de motor independientes con control de velocidad por PWM
Hasta 2 A de corriente de control por canal
También puede controlar un motor paso a paso bipolar
Se apila con el Servo Shield
Distribución de pines¶
Referencia de pines¶
Pin |
Función |
|---|---|
P0 |
DIR B1 (dirección del motor B) |
P1 |
DIR B0 (dirección del motor B) |
P2 |
DIR A1 (dirección del motor A) |
P3 |
DIR A0 (dirección del motor A) |
P6 |
STANDBY del TB6612FNG — activo de forma predeterminada; póngalo en bajo para entrar en modo de bajo consumo |
P7 |
Entrada de velocidad PWM para el motor A |
P8 |
Entrada de velocidad PWM para el motor B |
VBAT in |
Entrada de batería de 6,5–18 V en el terminal de tornillo (límites del NCP1117) |
VIN out |
5 V desde el regulador NCP1117 integrado (alimenta la cámara) |
Línea de 3,3 V |
Alimenta la lógica del TB6612FNG |
Línea GND |
Masa común |
Nota
P6 controla la entrada STANDBY del TB6612 de forma predeterminada. Corte la pista de soldadura en la parte posterior del shield para desconectar P6 si prefiere usar el pin para otra cosa (el controlador queda entonces siempre habilitado).
Nota
El TB6612FNG controla cada motor mediante una tabla de verdad de dos entradas más una habilitación PWM. Para el motor A (con STBY en alto y PWMA a cualquier ciclo de trabajo distinto de cero):
(P3, P2) = (H, L)→ avance(P3, P2) = (L, H)→ retroceso(P3, P2) = (L, L)→ punto muerto (salidas en alta impedancia)(P3, P2) = (H, H)→ frenado (ambas salidas en bajo)
Poner PWMA en bajo fuerza un frenado breve independientemente de las entradas de dirección — un ciclo de trabajo del 0 % frena el motor. El motor B sigue la misma tabla en (P1, P0) con PWM en P8.
Uso¶
Recorra el motor A por avance → frenado → retroceso → punto muerto con un ciclo de trabajo PWM fijo:
from machine import Pin, PWM
import time
a0 = Pin("P3", Pin.OUT) # AIN1
a1 = Pin("P2", Pin.OUT) # AIN2
pwma = PWM(Pin("P7"), freq=1_000, duty_u16=40_000) # ~60%
def drive(in1, in2):
a0.value(in1)
a1.value(in2)
while True:
drive(1, 0) # forward
time.sleep(2)
drive(1, 1) # brake
time.sleep_ms(500)
drive(0, 1) # reverse
time.sleep(2)
drive(0, 0) # coast
time.sleep_ms(500)
Para un control de velocidad variable, mantenga constantes las entradas de dirección y ajuste gradualmente PWMA. El bucle siguiente lleva el motor A desde punto muerto hasta avance máximo y de vuelta:
from machine import Pin, PWM
import time
Pin("P3", Pin.OUT, value=1) # AIN1=H
Pin("P2", Pin.OUT, value=0) # AIN2=L → forward direction
pwma = PWM(Pin("P7"), freq=1_000, duty_u16=0)
while True:
for duty in range(0, 65_536, 1024):
pwma.duty_u16(duty)
time.sleep_ms(10)
for duty in range(65_535, -1, -1024):
pwma.duty_u16(duty)
time.sleep_ms(10)
Los dos puentes en H del TB6612 también pueden controlar por ondas un motor paso a paso bipolar — energice una bobina a la vez, recorriendo cuatro fases. Mantenga ambos canales PWM a la corriente de control deseada y llame a step() para avanzar una secuencia completa en cualquier dirección:
from machine import Pin, PWM
import time
a0 = Pin("P3", Pin.OUT)
a1 = Pin("P2", Pin.OUT)
b0 = Pin("P1", Pin.OUT)
b1 = Pin("P0", Pin.OUT)
PWM(Pin("P7"), freq=1_000, duty_u16=32_768) # 50% drive on A
PWM(Pin("P8"), freq=1_000, duty_u16=32_768) # 50% drive on B
SEQUENCE = [(1, 0, 0, 0), (0, 0, 1, 0), (0, 1, 0, 0), (0, 0, 0, 1)]
def step(forward=True):
for s in SEQUENCE if forward else reversed(SEQUENCE):
a0.value(s[0])
a1.value(s[1])
b0.value(s[2])
b1.value(s[3])
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)
La línea STANDBY integrada está en alto de forma predeterminada (controlador habilitado). Ponga P6 en bajo para poner el TB6612 en reposo:
from machine import Pin
Pin("P6", Pin.OUT).value(0) # standby