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.
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¶
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