Zum Inhalt springen

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.

Abbildung eines TT 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 SpannungStromaufnahme (Leerlauf)Stromaufnahme (Stillstand)
3V150 mA (120 U/min)1,1 A
4,5V155 mA (185 U/min)1,2 A
6V160 mA (250 U/min)1,5 A

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.

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 Effizienz
  • DRV8833: Etwas teurer, aber modernes Design und bessere Leistung
  • Wir haben einen passenden Motortreiber für unser Projekt ausgewählt.

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 L293D

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)

Die Richtung des Motors wird durch die Pins IN1 und IN2 festgelegt.

IN1IN2Motorbewegung
LOWLOWStop
HIGHLOWVorwärts
LOWHIGHRückwärts
HIGHHIGHStop

Über den Pin EN A kann die Geschwindigkeit des Motors eingestellt werden.

  • Ist der Pin EN A LOW, stoppt der Motor.
  • Ist der Pin EN A HIGH, läuft der Motor mit voller Geschwindigkeit.
  • Für eine Variable Geschwindigkeit kann der Pin EN A auch mit einem PWM-Signal angesteuert werden.

An den beiden Ausgangssignalen OUT1 und OUT2 liegt die Spannung an, die den Motor antreibt.

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:

motor.py
from machine import Pin, PWM
import 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.

main.py
from time import sleep
from motor import DCMotor
motor = 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)
  1. Bauen Sie folgende Schaltung auf. Aufbau Motor Hinweis: Aufbau ist in Wokwi nur bedingt möglich.

    Start Lab in Wokwi

  2. Laden Sie das Module motor.py auf Ihren ESP32 und importieren Sie die Klasse DCMotor in Ihre main.py.

  3. Testen Sie die Ansteuerung des Motors, indem Sie die Geschwindigkeit über die speed Eigenschaft verändern.

    • Motor läuft in beide Richtungen
    • Motor kann auch angehalten werden
    • Geschwindigkeit kann variiert werden
  1. Warum sollte ein Motor nicht direkt an einen GPIO-Pin angeschlossen werden?

  2. Welche Vorteile hat der DRV8833 gegenüber dem L293D?

  3. Wie wird die Richtung eines Motors mit einer H-Brücke gesteuert?

  4. Wie kann die Geschwindigkeit eines Motors gesteuert werden?

  5. Welche Vorteile hat die Kapselung der Motorsteuerung in einer eigenen Klasse?