Motor Shield

Das Motor Shield treibt zwei Gleichstrommotoren von der OpenMV Cam aus über eine TB6612FNG-Doppel-H-Brücke an, mit einem linearen NCP1117-5-V-Regler, der sowohl die Kamera als auch die Motoren aus einem einzigen 6,5–18-V-Batterieeingang versorgt.

Motor Shield

Vollständiges Datenblatt, Fotos und Bestellinformationen finden Sie auf der Motor-Shield-Produktseite.

Höhepunkte

  • Zwei unabhängige Motorkanäle mit PWM-Drehzahlsteuerung

  • Bis zu 2 A Antriebsstrom pro Kanal

  • Kann auch einen bipolaren Schrittmotor antreiben

  • Stapelbar mit dem Servo Shield

Pinbelegung

Motor-Shield-Pinbelegung

Pin-Referenz

Pin

Funktion

P0

DIR B1 (Richtung Motor B)

P1

DIR B0 (Richtung Motor B)

P2

DIR A1 (Richtung Motor A)

P3

DIR A0 (Richtung Motor A)

P6

TB6612FNG STANDBY — standardmäßig ein; auf low ziehen, um in den Energiesparmodus zu wechseln

P7

PWM-Drehzahleingang für Motor A

P8

PWM-Drehzahleingang für Motor B

VBAT ein

6,5–18-V-Batterieeingang an der Schraubklemme (NCP1117-Grenzwerte)

VIN aus

5 V vom integrierten NCP1117-Regler (versorgt die Kamera)

3,3-V-Schiene

Versorgt die TB6612FNG-Logik

GND-Schiene

Gemeinsame Masse

Bemerkung

P6 steuert standardmäßig den STANDBY-Eingang des TB6612 an. Trennen Sie die Lötbahn auf der Rückseite des Shields, um P6 zu trennen, falls Sie den Pin lieber für etwas anderes verwenden möchten (der Treiber bleibt dann aktiviert).

Bemerkung

Der TB6612FNG steuert jeden Motor über eine Zwei-Eingangs-Wahrheitstabelle plus einer PWM-Freigabe an. Für Motor A (mit STBY auf high und PWMA bei einem beliebigen Tastverhältnis ungleich null):

  • (P3, P2) = (H, L) → vorwärts

  • (P3, P2) = (L, H) → rückwärts

  • (P3, P2) = (L, L) → Leerlauf (Ausgänge Hi-Z)

  • (P3, P2) = (H, H) → Bremse (beide Ausgänge low)

PWMA auf low zu ziehen erzwingt eine kurze Bremsung unabhängig von den Richtungseingängen — ein Tastverhältnis von 0 % bremst den Motor. Motor B folgt derselben Tabelle an (P1, P0) mit PWM an P8.

Verwendung

Durchlaufen Sie Motor A durch vorwärts → Bremse → rückwärts → Leerlauf bei einem festen PWM-Tastverhältnis:

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)

Für die variable Drehzahlsteuerung halten Sie die Richtungseingänge konstant und variieren PWMA. Die folgende Schleife fährt Motor A vom Leerlauf bis zum vollen Vorwärtsbetrieb und wieder herunter:

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)

Die beiden H-Brücken des TB6612 können auch einen bipolaren Schrittmotor im Wave-Drive ansteuern — bestromen Sie eine Spule nach der anderen und gehen Sie durch vier Phasen. Halten Sie beide PWM-Kanäle auf dem gewünschten Antriebsstrom und rufen Sie step() auf, um eine vollständige Sequenz in beide Richtungen voranzuschreiten:

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)

Die integrierte STANDBY-Leitung ist standardmäßig high (Treiber aktiviert). Ziehen Sie P6 auf low, um den TB6612 in den Ruhezustand zu versetzen:

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