Motor Shield

Il Motor Shield comanda due motori DC dall’OpenMV Cam usando un doppio ponte H TB6612FNG, con un regolatore lineare a 5 V NCP1117 che alimenta sia la camera sia i motori da un singolo ingresso a batteria 6.5–18 V.

Motor Shield

Per il datasheet completo, le foto e gli ordini consulta la pagina prodotto del Motor Shield.

Punti salienti

  • Due canali motore indipendenti con controllo della velocità tramite PWM

  • Corrente di pilotaggio fino a 2 A per canale

  • Può anche comandare un motore passo-passo bipolare

  • Impilabile con il Servo Shield

Pinout

Pinout del Motor Shield

Riferimento dei pin

Pin

Funzione

P0

DIR B1 (direzione del motore B)

P1

DIR B0 (direzione del motore B)

P2

DIR A1 (direzione del motore A)

P3

DIR A0 (direzione del motore A)

P6

STANDBY del TB6612FNG — attivo per impostazione predefinita; porta a livello basso per entrare in modalità a basso consumo

P7

Ingresso PWM di velocità per il motore A

P8

Ingresso PWM di velocità per il motore B

VBAT in

Ingresso a batteria 6.5–18 V sul morsetto a vite (limiti dell’NCP1117)

VIN out

5 V dal regolatore NCP1117 on-board (alimenta la camera)

Linea 3.3V

Alimenta la logica del TB6612FNG

Linea GND

Massa comune

Nota

P6 pilota l’ingresso STANDBY del TB6612 per impostazione predefinita. Taglia la traccia a saldare sul retro dello shield per scollegare P6 se preferisci usare il pin per qualcos’altro (il driver rimane quindi abilitato).

Nota

Il TB6612FNG comanda ciascun motore tramite una tabella di verità a due ingressi più un enable PWM. Per il motore A (con STBY alto e PWMA a un duty qualsiasi diverso da zero):

  • (P3, P2) = (H, L) → avanti

  • (P3, P2) = (L, H) → indietro

  • (P3, P2) = (L, L) → folle (uscite Hi-Z)

  • (P3, P2) = (H, H) → frenata (entrambe le uscite basse)

Portare PWMA a livello basso forza una frenata rapida indipendentemente dagli ingressi di direzione — un duty cycle dello 0 % frena il motore. Il motore B segue la stessa tabella su (P1, P0) con il PWM su P8.

Utilizzo

Fai passare il motore A attraverso avanti → frenata → indietro → folle a un duty PWM fisso:

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)

Per il controllo a velocità variabile, mantieni costanti gli ingressi di direzione e fai variare PWMA. Il ciclo seguente fa salire il motore A dal folle fino alla massima velocità in avanti e poi lo riporta giù:

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)

I due ponti H del TB6612 possono anche pilotare in wave-drive un motore passo-passo bipolare — energizzando una bobina alla volta, percorrendo quattro fasi. Mantieni entrambi i canali PWM alla corrente di pilotaggio desiderata e chiama step() per avanzare di una sequenza completa in una delle due direzioni:

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 linea STANDBY on-board è alta per impostazione predefinita (driver abilitato). Porta P6 a livello basso per mettere il TB6612 in modalità sleep:

from machine import Pin
Pin("P6", Pin.OUT).value(0)  # standby