Motor Shield

Le Motor Shield commande deux moteurs à courant continu depuis l’OpenMV Cam à l’aide d’un double pont en H TB6612FNG, avec un régulateur linéaire NCP1117 5 V qui alimente à la fois la caméra et les moteurs depuis une seule entrée batterie de 6,5 à 18 V.

Motor Shield

Pour la fiche technique complète, les photos et la commande, consultez la page produit du Motor Shield.

Points forts

  • Deux canaux moteur indépendants avec contrôle de vitesse par PWM

  • Jusqu’à 2 A de courant de commande par canal

  • Peut aussi commander un moteur pas à pas bipolaire

  • Empilable avec le Servo Shield

Brochage

Brochage du Motor Shield

Référence des broches

Broche

Fonction

P0

DIR B1 (sens du moteur B)

P1

DIR B0 (sens du moteur B)

P2

DIR A1 (sens du moteur A)

P3

DIR A0 (sens du moteur A)

P6

STANDBY du TB6612FNG — actif par défaut ; tirez à l’état bas pour entrer en mode basse consommation

P7

Entrée de vitesse PWM pour le moteur A

P8

Entrée de vitesse PWM pour le moteur B

VBAT in

Entrée batterie de 6,5 à 18 V sur le bornier à vis (limites du NCP1117)

VIN out

5 V depuis le régulateur NCP1117 intégré (alimente la caméra)

Rail 3,3 V

Alimente la logique du TB6612FNG

Rail GND

Masse commune

Note

P6 commande l’entrée STANDBY du TB6612 par défaut. Coupez la piste à souder au dos du shield pour déconnecter P6 si vous préférez utiliser la broche à autre chose (le pilote reste alors activé).

Note

Le TB6612FNG commande chaque moteur via une table de vérité à deux entrées plus une validation PWM. Pour le moteur A (avec STBY haut et PWMA à n’importe quel rapport cyclique non nul) :

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

  • (P3, P2) = (L, H) → arrière

  • (P3, P2) = (L, L) → roue libre (sorties Hi-Z)

  • (P3, P2) = (H, H) → frein (les deux sorties basses)

Mettre PWMA à l’état bas force un court freinage quelles que soient les entrées de sens — un rapport cyclique de 0 % freine le moteur. Le moteur B suit la même table sur (P1, P0) avec le PWM sur P8.

Utilisation

Faites passer le moteur A par avant → frein → arrière → roue libre à un rapport cyclique PWM fixe

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)

Pour un contrôle à vitesse variable, maintenez les entrées de sens constantes et faites varier PWMA. La boucle ci-dessous fait passer le moteur A de la roue libre à la pleine marche avant, puis le ramène

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)

Les deux ponts en H du TB6612 peuvent aussi commander un moteur pas à pas bipolaire en mode wave — alimentez une bobine à la fois, en parcourant quatre phases. Maintenez les deux canaux PWM au courant de commande souhaité et appelez step() pour avancer d’une séquence complète dans l’un ou l’autre sens

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 ligne STANDBY intégrée est à l’état haut par défaut (pilote activé). Tirez P6 à l’état bas pour mettre le TB6612 en veille

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