Motor Shield¶
De Motor Shield stuurt twee DC-motoren aan vanaf de OpenMV Cam met behulp van een TB6612FNG dubbele H-brug, met een NCP1117 5 V lineaire regelaar die zowel de camera als de motoren voedt vanuit één enkele batterij-ingang van 6,5–18 V.
Voor de volledige datasheet, foto’s en bestelinformatie, zie de productpagina van de Motor Shield.
Hoogtepunten¶
Twee onafhankelijke motorkanalen met PWM-snelheidsregeling
Tot 2 A aansturingsstroom per kanaal
Kan ook een bipolaire stappenmotor aansturen
Stapelt met de Servo Shield
Pinout¶
Pinreferentie¶
Pin |
Functie |
|---|---|
P0 |
DIR B1 (richting motor B) |
P1 |
DIR B0 (richting motor B) |
P2 |
DIR A1 (richting motor A) |
P3 |
DIR A0 (richting motor A) |
P6 |
TB6612FNG STANDBY — standaard aan; trek laag om de energiezuinige modus in te schakelen |
P7 |
PWM-snelheidsingang voor motor A |
P8 |
PWM-snelheidsingang voor motor B |
VBAT in |
6,5–18 V batterij-ingang op het schroefklemmenblok (NCP1117-limieten) |
VIN uit |
5 V vanuit de NCP1117-regelaar op de print (voedt de camera) |
3.3V-rail |
Voedt de TB6612FNG-logica |
GND-rail |
Gemeenschappelijke aarde |
Notitie
P6 stuurt standaard de TB6612 STANDBY-ingang aan. Snijd het soldeerspoor aan de achterkant van de shield door om P6 los te koppelen als je de pin liever voor iets anders gebruikt (de driver blijft dan ingeschakeld).
Notitie
De TB6612FNG stuurt elke motor aan via een tweepuntige waarheidstabel plus een PWM-enable. Voor motor A (met STBY hoog en PWMA op een willekeurige duty ongelijk aan nul):
(P3, P2) = (H, L)→ vooruit(P3, P2) = (L, H)→ achteruit(P3, P2) = (L, L)→ uitrollen (uitgangen Hi-Z)(P3, P2) = (H, H)→ remmen (beide uitgangen laag)
Het laag aansturen van PWMA forceert een kort remmen ongeacht de richtingsingangen — een duty cycle van 0 % remt de motor. Motor B volgt dezelfde tabel op (P1, P0) met PWM op P8.
Gebruik¶
Laat motor A doorlopen van vooruit → remmen → achteruit → uitrollen op een vaste PWM-duty:
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)
Voor regelbare snelheid houd je de richtingsingangen constant en laat je PWMA oplopen. De onderstaande lus laat motor A oplopen van uitrollen tot volle vooruit en weer terug:
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)
De twee H-bruggen van de TB6612 kunnen ook een bipolaire stappenmotor wave-driven — energiseer één spoel tegelijk en doorloop vier fasen. Houd beide PWM-kanalen op de gewenste aansturingsstroom en roep step() aan om één volledige sequentie in beide richtingen te doorlopen:
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)
De STANDBY-lijn op de print is standaard hoog (driver ingeschakeld). Trek P6 laag om de TB6612 in slaapstand te zetten:
from machine import Pin
Pin("P6", Pin.OUT).value(0) # standby