Motor Shield#

Motor Shield acționează două motoare de curent continuu de la OpenMV Cam folosind o punte H dublă TB6612FNG, cu un regulator liniar NCP1117 de 5 V care alimentează atât camera, cât și motoarele de la o singură intrare de baterie de 6,5–18 V.

Motor Shield

Pentru fișa tehnică completă, fotografii și comenzi, consultați pagina produsului Motor Shield.

Caracteristici principale#

  • Două canale de motor independente cu control al vitezei prin PWM

  • Până la 2 A curent de acționare per canal

  • Poate acționa și un motor pas cu pas bipolar

  • Se stivuiește cu Servo Shield

Pinout#

Motor Shield Pinout

Referință pini#

Pin

Funcție

P0

DIR B1 (direcția motorului B)

P1

DIR B0 (direcția motorului B)

P2

DIR A1 (direcția motorului A)

P3

DIR A0 (direcția motorului A)

P6

TB6612FNG STANDBY — implicit activat; trageți la nivel jos pentru a intra în modul de consum redus

P7

Intrare de viteză PWM pentru motorul A

P8

Intrare de viteză PWM pentru motorul B

VBAT in

Intrare de baterie de 6,5–18 V pe borna cu șurub (limitele NCP1117)

VIN out

5 V de la regulatorul NCP1117 de pe placă (alimentează camera)

Linia de 3,3 V

Alimentează logica TB6612FNG

Linia GND

Masă comună

Notă

P6 acționează implicit intrarea STANDBY a TB6612. Tăiați traseul de lipitură de pe partea posterioară a shield-ului pentru a deconecta P6 dacă preferați să folosiți pinul pentru altceva (driverul rămâne apoi activat).

Notă

TB6612FNG acționează fiecare motor printr-o tabelă de adevăr cu două intrări plus o activare PWM. Pentru motorul A (cu STBY la nivel înalt și PWMA la orice factor de umplere diferit de zero):

  • (P3, P2) = (H, L) → înainte

  • (P3, P2) = (L, H) → înapoi

  • (P3, P2) = (L, L) → ralanti (ieșiri Hi-Z)

  • (P3, P2) = (H, H) → frânare (ambele ieșiri la nivel jos)

Aducerea PWMA la nivel jos forțează o frânare scurtă indiferent de intrările de direcție — un factor de umplere de 0 % frânează motorul. Motorul B urmează aceeași tabelă pe (P1, P0) cu PWM pe P8.

Utilizare#

Rotiți motorul A prin înainte → frânare → înapoi → ralanti la un factor de umplere PWM fix:

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)

Pentru controlul vitezei variabile, mențineți constante intrările de direcție și creșteți gradual PWMA. Bucla de mai jos crește gradual motorul A de la ralanti până la înainte la viteză maximă și apoi îl scade:

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)

Cele două punți H ale TB6612 pot acționa și un motor pas cu pas bipolar în mod undă — energizați câte o bobină pe rând, parcurgând patru faze. Mențineți ambele canale PWM la curentul de acționare dorit și apelați step() pentru a avansa o secvență completă în oricare direcție:

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)

Linia STANDBY de pe placă este implicit la nivel înalt (driver activat). Trageți P6 la nivel jos pentru a pune TB6612 în repaus:

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