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