Motoren ansteuern
Um einen Motor mit einem Microcontroller anzusteuern, könnten Sie auf die Idee kommen diesen, wie eine LED, direkt an einen GPIO-Pin anzuschließen. Dies ist jedoch eine sehr schlechte Idee. Hier wollen wir uns anschauen warum und welche Lösung es dafür gibt.
Leistungsaufnahme eines Motors.
Abschnitt betitelt „Leistungsaufnahme eines Motors.“
KI generated
Sie können diese Motoren mit 3V bis 6V betreiben, wobei sie bei höheren Spannungen natürlich etwas schneller laufen. Wenn Sie ins Datenblatt schauen oder selbst Messungen durchführen können z.B. folgende Werte ermittelt werden:
| anliegende Spannung | Stromaufnahme (Leerlauf) | Stromaufnahme (Stillstand) |
|---|---|---|
| 3V | 150 mA (120 U/min) | 1,1 A |
| 4,5V | 155 mA (185 U/min) | 1,2 A |
| 6V | 160 mA (250 U/min) | 1,5 A |
Probleme
Abschnitt betitelt „Probleme“Wenn Sie die Werte genauer ansehen, ist Ihnen eventuell aufgefallen, dass unser ESP32 nicht mit 6V sondern nur 3.3V arbeitet. Wir könnten den Motor also garnicht mit voller Geschwindigkeit laufen lassen.
Das zweite, und viel größere Problem ist jedoch, dass ein GPIO-Pin des Microcontrollers max 40mA liefern kann.
Je nach Anwendungsfall gibt es verschiedene Lösungsmöglichkeiten für dieses Problem.
- Nutzen eines Transistors zur Ansteuerung
- Nutzen einer H-Brücke zur Ansteuerung
- Nutzen eines Motor-Treiber-ICs
Für den Bau eines kleinen Roboters, wie unserem Space Rover, ist die Nutzung von Motor-Treiber-ICs die beste Lösung, da diese bereits alle nötigen Komponenten enthalten und einfach zu nutzen sind.
Den richtigen Motortreiber auswählen
Abschnitt betitelt „Den richtigen Motortreiber auswählen“Auf dem Markt auch eine Reihe von fertigen ICs für die Motoransteuerung.
Bekannte Motortreiber sind z.B der L298N, L293D, DRV8833, TB6612FNG, …
Wir wollen uns hier den L293D und den DRV8833 genauer anschauen, da diese beiden Treiber sehr beliebt sind und sich gut vergleichen lassen.
LL293D vs DRV8833
Strom und Spannung:
L293D: Bis 36V, max 600mA pro Kanal (kurzfristig: 1.2 A)DRV8833: 2.7V - 10.8V, max 1.5A pro Kanal (kurzfristig: 2A)
Wirkungsgrad:
LN293D: Bipolartransistoren (hohe Wärmeentwicklung, Spannungsverlust ~1.5V)DRV8833: MOSFET-Technologie (weniger Hitzeentwicklung, niedriger Spannungsabfall)
Fazit: Der DRV8833 ist erheblich effizienter und bleibt kühler.
Preis:
L293D: Tendenziell günstiger, aber mit dem Nachteil der geringeren EffizienzDRV8833: Etwas teurer, aber modernes Design und bessere Leistung
- Wir haben einen passenden Motortreiber für unser Projekt ausgewählt.
Anschluss des Motortreibers
Abschnitt betitelt „Anschluss des Motortreibers“Je nach gewähltem Motortreiber gibt es unterschiedliche Möglichkeiten diesen an den ESP32 anzuschließen.
Hier wollen wir uns die beiden Treiber L293D und DRV8833 anschauen. Beide Treiber sind Dual H-Brücken Treiber,
das heißt sie können zwei Motoren in beide Richtungen steuern.
Das Pinout oder Datenblatt liefert uns die nötigen Informationen zu den Anschlüssen des ICs.
Pinout/Datenblatt
Abschnitt betitelt „Pinout/Datenblatt“
Neben dem reinen Chip, welcher nicht als Breadboard kompatibles Design verfügbar ist, gibt es auch Module, auf denen der Chip bereits verbaut ist. Der Anschluss solcher Module ist dann relativ einfach.

Power Pins
Abschnitt betitelt „Power Pins“Die meisten Motortreiber haben separate Pins für die Versorgung der Logik und der Motoren. Die Logik wird typischerweise mit 5V versorgt, während die Motoren mit einer höheren Spannung betrieben werden können (z.B. 6V, 12V, …).
VSS: Versorgungsspannung für die Logik (5V)VS: Versorgungsspannung für die Motoren (4.5V - 36V)
Fertige Module haben oft Spannungsregler integriert, so dass die Versorgung der Logik auch mit der gleichen Spannung wie die Motoren erfolgen kann.
VCC: Versorgungsspannung für Logik und Motoren (2.7V - 10.8V)
Richtung festlegen
Abschnitt betitelt „Richtung festlegen“Die Richtung des Motors wird durch die Pins IN1 und IN2 festgelegt.
| IN1 | IN2 | Motorbewegung |
|---|---|---|
LOW | LOW | Stop |
HIGH | LOW | Vorwärts |
LOW | HIGH | Rückwärts |
HIGH | HIGH | Stop |
Geschwindigkeit steuern
Abschnitt betitelt „Geschwindigkeit steuern“Über den Pin EN A kann die Geschwindigkeit des Motors eingestellt werden.
- Ist der Pin
EN ALOW, stoppt der Motor. - Ist der Pin
EN AHIGH, läuft der Motor mit voller Geschwindigkeit. - Für eine Variable Geschwindigkeit kann der Pin
EN Aauch mit einem PWM-Signal angesteuert werden.
Das Modul hat keinen enable Pin.
Sie steuern die Geschwindigkeit des Motors über die Pins IN1, IN2 indem Sie ein PWM Signal verwenden.
Ausgangssignale
Abschnitt betitelt „Ausgangssignale“An den beiden Ausgangssignalen OUT1 und OUT2 liegt die Spannung an, die den Motor antreibt.
Logik in Klasse Motor kapseln
Abschnitt betitelt „Logik in Klasse Motor kapseln“Es ist eine gute Praxis die Logik zur Ansteuerung eines Motors in einer eigenen Klasse zu kapseln.
Diese Klasse schreiben wir in ein eigenes Modul (motor.py) und könnte dann wie folgt aussehen:
from machine import Pin, PWMimport time
class DCMotor: """ Klasse zur Ansteuerung eines Gleichstrommotors über eine H-Brücke. Enable Pin wird nicht genutzt, stattdessen wird die Geschwindigkeit über die IN Pins gesteuert. Verbinden Sie den Enable Pin mit VCC, damit der Motor immer aktiviert ist. """
def __init__(self, in1_pin, in2_pin, freq=10000): # Set up the direction pins (in1 and in2) self._in1 = PWM(Pin(in1_pin, Pin.OUT), freq=freq, duty_u16=0) self._in2 = PWM(Pin(in2_pin, Pin.OUT), freq=freq, duty_u16=0)
self._speed = 0
@property def speed(self): return self._speed
@speed.setter def speed(self, value: None | int): if value is not None and (value < -65535 or value > 65535): raise ValueError("Only values between -65535 and 65535 are allowed.")
if value is None: self._in1.duty_u16(0) self._in2.duty_u16(0) elif value == 0: # brake (set both pin high) self._in1.duty_u16(0xFFFF); self._in2.duty_u16(0xFFFF); else: speed = abs(value) if value < 0: self._in1.duty_u16(0) self._in2.duty_u16(speed) else: self._in1.duty_u16(speed) self._in2.duty_u16(0)Die Klasse vereinfacht die Ansteuerung des Motors, da wir uns nicht mehr um die Details der Pins kümmern müssen,
sondern einfach die Geschwindigkeit über die speed Eigenschaft einstellen können.
Zur Verwendung in der main.py importieren wir die Klasse DCMotor aus unserem Modul motor und erstellen eine Instanz davon.
from time import sleepfrom motor import DCMotormotor = DCMotor(in1_pin=5, in2_pin=18)while True: motor.speed = 30000 # Motor läuft vorwärts mit halber Geschwindigkeit sleep(2) motor.speed = -30000 # Motor läuft rückwärts mit halber Geschwindigkeit sleep(2)Aufgabe: Praxisübung
Abschnitt betitelt „Aufgabe: Praxisübung“-
Bauen Sie folgende Schaltung auf.
Hinweis: Aufbau ist in Wokwi nur bedingt möglich.Start Lab in Wokwi
-
Laden Sie das Module
motor.pyauf Ihren ESP32 und importieren Sie die KlasseDCMotorin Ihremain.py. -
Testen Sie die Ansteuerung des Motors, indem Sie die Geschwindigkeit über die
speedEigenschaft verändern.- Motor läuft in beide Richtungen
- Motor kann auch angehalten werden
- Geschwindigkeit kann variiert werden
Kontrollfragen
Abschnitt betitelt „Kontrollfragen“Teste dein Wissen
Abschnitt betitelt „Teste dein Wissen“-
Warum sollte ein Motor nicht direkt an einen GPIO-Pin angeschlossen werden?
-
Welche Vorteile hat der
DRV8833gegenüber demL293D? -
Wie wird die Richtung eines Motors mit einer H-Brücke gesteuert?
-
Wie kann die Geschwindigkeit eines Motors gesteuert werden?
-
Welche Vorteile hat die Kapselung der Motorsteuerung in einer eigenen Klasse?