Bauteile · 15 Min. Lesezeit

L293D Motor Shield am Arduino: AFMotor, 4 Motoren, Stepper, Servo

L293D Motor Shield richtig nutzen: AFMotor, PWR-Jumper, freie Pins, 4WD-Auto-Code, Schrittmotor, Servo, 0,6-A-Grenze und Hilfe, wenn Motoren nicht drehen.

Das L293D Motor Shield ist eine Motortreiberplatine, die du direkt auf einen Arduino Uno steckst und mit der du 4 DC-Motoren, 2 Schrittmotoren und 2 Servos über eine einzige Platine ansteuerst. Die beiden L293D-Chips liefern den Strom, den die Motoren brauchen, kehren ihre Drehrichtung um und stellen die Geschwindigkeit per PWM ein. So steuerst du alle Motoren eines vierrädrigen Roboterautos, ohne ein einziges Jumper-Kabel zu verlegen. Fast alle Platinen auf dem Markt sind Kopien des alten Motor Shield V1 von Adafruit und werden mit derselben Bibliothek programmiert: AFMotor.

In dieser Anleitung erfährst du, was auf dem Shield sitzt, welche Arduino-Pins es belegt und welche für Sensoren frei bleiben, wie der oft missverstandene PWR-Jumper in drei verschiedenen Stromversorgungen funktioniert, welche Befehle die AFMotor-Bibliothek kennt, und du bekommst den kompletten Code für ein vierrädriges Roboterauto, das du per Handy steuerst. In den letzten Abschnitten geht es um die Stromgrenze von 0,6 A, warum der Chip heiß wird, den Vergleich mit dem L298N und alle bekannten Ursachen für „die Motoren drehen nicht“ in einer Tabelle.

L293D Motor Shield von oben: Klemmen M1–M4, Servo-Anschlüsse und Power-Jumper
L293D Motor Shield (Adafruit-V1-Design): in der Mitte der 74HC595, links und rechts je ein L293D; links die Klemmen M1–M2, rechts M3–M4, oben links zwei Servo-Anschlüsse, unten die Klemme für die externe Versorgung und der PWR-Jumper.

Was ist das L293D Motor Shield und wie funktioniert es?

Damit sich ein DC-Motor in beide Richtungen dreht, brauchst du eine Schaltung mit vier Schaltern, die H-Brücke; das Prinzip erklären wir ausführlich in DC-Motor mit L298N steuern. Im L293D stecken zwei H-Brücken, und weil das Shield zwei dieser Chips trägt, hast du insgesamt vier Motorkanäle. Das „D“ im Namen bedeutet, dass die Schutzdioden, die die Gegenspannungsspitzen beim Abschalten eines Motors abfangen, bereits im Chip eingebaut sind. Außerdem schaltet der L293D seine Ausgänge bei Überhitzung selbst ab.

Der eigentliche Trick des Shields ist das Schieberegister 74HC595 in der Mitte. Jeder der vier Motoren braucht zwei Signale für die Richtung und eins für die Geschwindigkeit, zusammen also 12 Arduino-Pins. Das Shield schickt die acht Richtungssignale seriell an den 74HC595 und braucht dafür nur 4 Pins (D4, D7, D8, D12), dazu 4 PWM-Pins für die Geschwindigkeit (D3, D5, D6, D11). Das spart Pins, hat aber einen Preis: Du kannst die Motoren nicht direkt mit digitalWrite ansteuern, sondern brauchst eine Bibliothek, die die Richtungsbits ins Register schiebt. Diese Bibliothek ist AFMotor.

MerkmalWert
Treiberchips2 × L293D (insgesamt 4 H-Brücken)
RichtungssteuerungSchieberegister 74HC595 (D4, D7, D8, D12)
Motorspannung4,5–25 V (Klemme für externe Versorgung)
Strom pro Kanal0,6 A dauerhaft, 1,2 A sehr kurze Spitze
Geschwindigkeit8-Bit-PWM, setSpeed(0–255)
Ansteuerbare Motoren4 DC-Motoren, 2 Schrittmotoren oder 2 DC + 1 Schrittmotor
Servos2, versorgt über die 5-V-Schiene des Arduino (D9 und D10)
SchutzEingebaute Dioden, Abschaltung bei Übertemperatur
Kompatible BoardsArduino Uno R3 und Mega 2560 (Uno R4 und Leonardo nicht unterstützt)

Was ist auf der Platine? Klemmen, Stiftleisten und Jumper

BauteilAufgabe
Klemme M1 und M2 (links)DC-Motor 1 und 2; die GND-Schraube in der Mitte ist für das gemeinsame Kabel eines unipolaren Schrittmotors
Klemme M3 und M4 (rechts)DC-Motor 3 und 4 oder Schrittmotor-Port 2
EXT_PWR (+M und GND)Stromeingang für die Motoren: Akku oder Netzteil
PWR-JumperVerbindet gesteckt die Motorversorgung mit der Vin-Leitung des Arduino
SER1 und SERVO_2Zwei Servo-Anschlüsse (−, +, S); D10 und D9
PWR-LEDZeigt, ob Motorstrom anliegt; ist sie aus, drehen die Motoren nicht
RESET-TasterKopie des Reset-Tasters des Arduino auf dem Shield
Reihe A0–A5Freie Analogpins; auf den meisten Platinen liegen daneben auch +5V- und GND-Reihen

Welche Pins belegt das Shield und welche bleiben frei?

Arduino-PinAufgabe auf dem ShieldWann belegt?
D3Geschwindigkeit M2 (PWM, Timer2)Wenn M2 oder Schrittmotor 1 genutzt wird
D4Takt des 74HC595 (CLK)Wenn irgendein DC- oder Schrittmotor genutzt wird
D5Geschwindigkeit M4 (PWM, Timer0)Wenn M4 oder Schrittmotor 2 genutzt wird
D6Geschwindigkeit M3 (PWM, Timer0)Wenn M3 oder Schrittmotor 2 genutzt wird
D7Ausgangsfreigabe des 74HC595 (EN)Wenn irgendein Motor genutzt wird
D8Dateneingang des 74HC595 (DATA)Wenn irgendein Motor genutzt wird
D9Signal SERVO_2 (Timer1)Nur wenn dieses Servo genutzt wird
D10Signal SER1 (Timer1)Nur wenn dieses Servo genutzt wird
D11Geschwindigkeit M1 (PWM, Timer2)Wenn M1 oder Schrittmotor 1 genutzt wird
D12Latch des 74HC595 (LATCH)Wenn irgendein Motor genutzt wird
D0, D1Nicht genutzt (USB-Serielle)Beim Hochladen und bei offenem seriellen Monitor
D2Nicht genutzt; auf der Platine gibt es ein kleines LötpadNie
D13Nicht genutzt, aber oben auf dem Shield nicht herausgeführtNie
A0–A5 (D14–D19)Nicht genutzt; als Reihe am Rand herausgeführtNie

Die sechs freien Analogpins reichen für Sensoren mehr als aus, denn A0–A5 des Uno arbeiten bei Bedarf auch als digitale Pins 14–19. Eine praktische Aufteilung wäre: ein Ultraschallsensor HC-SR04 oder ein Bluetooth-Modul per SoftwareSerial an A0 und A1, Linien- oder Hindernissensoren an A2 und A3 und der I2C-Bus (OLED, LCD, MPU6050) an A4 und A5. Für einen Radencoder oder Taster mit attachInterrupt() bleibt nur D2 frei; der zweite Interrupt-Pin des Uno, D3, ist der Geschwindigkeitspin von M2. Wenn du keine Servos nutzt, sind auch D9 und D10 frei. Die Pinbelegung deines Boards siehst du im Tool Pinout, was die einzelnen Pins können, in Arduino Uno Pinbelegung.

Solange das Shield steckt, nutze D3–D8, D11 und D12 in deinem Code nicht für andere Zwecke. Schließt du zum Beispiel den Trig-Pin des HC-SR04 an D7 oder eine LED an D12 an, werden die Daten zum 74HC595 verfälscht und die Motoren wechseln zufällig die Richtung. Außerdem kommt das Geschwindigkeitssignal von M1 und M2 von Timer2: Die Funktion tone() und die IRremote-Bibliothek nutzen auf dem Uno ebenfalls Timer2, deshalb funktioniert die Geschwindigkeitsregelung von M1 und M2 nicht mehr, solange sie laufen.

Stromversorgung und PWR-Jumper: drei richtige Varianten

Die zweipolige Klemme EXT_PWR am unteren Rand der Platine ist der Stromeingang für die Motoren; der Pluspol ist meist mit „+M“ oder „+“, der Minuspol mit „GND“ beschriftet. Der PWR-Jumper direkt daneben verbindet diese Motorleitung mit dem Vin-Pin des Arduino. Mit gestecktem Jumper laufen beide Platinen aus einer Quelle: Die Spannung an EXT_PWR versorgt über Vin auch den Arduino, oder ein Netzteil an der Hohlbuchse des Arduino versorgt auch die Motoren. Ohne Jumper sind beide Leitungen vollständig getrennt. Die PWR-LED auf der Platine leuchtet nur, wenn Motorstrom anliegt; sie ist das Erste, was du prüfst, bevor du dich mit den Motoren beschäftigst.

VarianteVersorgung ArduinoVersorgung MotorenPWR-Jumper
Eine Quelle (7–12 V Akku oder Netzteil)Dieselbe Quelle, über VinEXT_PWR oder die Hohlbuchse des ArduinoGesteckt
Arduino über USB, Motoren über AkkuUSB-KabelEXT_PWREntfernt
Zwei getrennte Quellen (am sichersten)Hohlbuchse oder USBEXT_PWREntfernt

Bei Roboterautos ist eine einzige Quelle am verbreitetsten: Du schließt einen Pack aus zwei 18650-Zellen an EXT_PWR an, steckst den Jumper, und Arduino und Motoren laufen am selben Akku. Das ist einfach, aber wenn die Motoren beim Anfahren viel Strom ziehen, kann die Akkuspannung kurz einbrechen und der Arduino neu starten. Passiert dir das, ist die sichere Lösung, den Jumper zu entfernen und den Arduino aus einer eigenen Quelle zu versorgen (Powerbank, USB oder ein 9-V-Netzteil). Auf dem Schreibtisch ist die zweite Variante am praktischsten: Der Arduino bleibt am Computer, die Motoren laufen am Akku und der Jumper ist entfernt.

Die Klemme EXT_PWR hat keine Verpolungsschutzdiode; ein falsch herum angeschlossener Akku zerstört das Shield sofort und sehr wahrscheinlich auch den Arduino. Schließe bei gestecktem Jumper niemals getrennte Quellen an Hohlbuchse und EXT_PWR gleichzeitig an, sonst schließt du die beiden Netzteile kurz. Und gib die Motorspannung niemals auf den 5V-Pin des Arduino.

Welchen Akku solltest du wählen? Je nach Strom verschlucken die Ausgangstransistoren des L293D etwa 1,5–2,6 V, der Motor bekommt also so viel weniger als die Akkuspannung. Für die gelben 3–6-V-TT-Motoren aus Roboterbausätzen sind zwei 18650-Lithiumzellen (7,4 V nominal, 8,4 V voll geladen) ideal: Die Motoren bekommen etwa 5,5–6 V, und mit gestecktem Jumper arbeitet auch der Spannungsregler des Arduino problemlos. Vier AA-Batterien (6 V) lassen den Motoren nur etwa 4 V und reichen nicht, um den Arduino über Vin zu versorgen. Ein 9-V-Block liefert höchstens einige hundert Milliampere; die Motoren drehen entweder gar nicht oder die Batterie ist nach Minuten leer. Die Laufzeit berechnest du mit dem Akkulaufzeit-Rechner, alle Versorgungsvarianten findest du in Arduino mit Batterie betreiben.

Die AFMotor-Bibliothek installieren

  1. Öffne in der Arduino IDE den Bibliotheksverwalter (Werkzeuge > Bibliotheken verwalten oder Strg+Umschalt+I).
  2. Gib Adafruit Motor Shield ins Suchfeld ein. Es erscheinen zwei Treffer: die Adafruit Motor Shield library mit „V1 firmware“ in der Beschreibung und die Adafruit Motor Shield V2 Library.
  3. Installiere für das L293D-Shield die V1-Version. Die V2-Bibliothek ist für eine ganz andere Platine mit I2C und TB6612-Chips.
  4. Füge oben in deinem Sketch die Zeile #include <AFMotor.h> ein.
  5. Wenn du magst, öffne Datei > Beispiele > Adafruit Motor Shield library > MotorTest und teste die Platine mit einem Motor an M1.
Bekommst du beim Kompilieren AFMotor.h: No such file or directory, ist die Bibliothek entweder gar nicht installiert oder du hast versehentlich die V2-Bibliothek installiert; deren Headerdatei heißt Adafruit_MotorShield.h und funktioniert nicht mit der L293D-Platine. Bei anderen Problemen mit Bibliotheken hilft Arduino Bibliothek installieren.

Erster Sketch: einen DC-Motor vorwärts, rückwärts und unterschiedlich schnell drehen

Schraube die beiden Motorkabel an die beiden äußeren Schrauben der Klemme M1 und lass die GND-Schraube in der Mitte frei. Schließe den Akkupack an EXT_PWR an, verbinde den Arduino per USB mit dem Computer und entferne den PWR-Jumper (die zweite Variante oben). Leuchtet die PWR-LED, lade den folgenden Code hoch: Der Motor beschleunigt erst langsam und bremst wieder ab, dreht dann zwei Sekunden rückwärts und hält an.

C++ (Arduino IDE)
1#include <AFMotor.h>                  // Adafruit Motor Shield V1 kütüphanesi / library
2
3AF_DCMotor motor(1);                  // M1 klemensi / M1 terminal
4
5void setup() {
6  Serial.begin(9600);
7  Serial.println(F("L293D motor testi / motor test"));
8  motor.setSpeed(200);                // 0–255; bunu unutursan motor dönmez / skip this and the motor won't turn
9  motor.run(RELEASE);                 // başlangıçta dur / start stopped
10}
11
12void loop() {
13  motor.run(FORWARD);                 // ileri / forward
14  for (int s = 60; s <= 255; s++) {   // yavaşça hızlan / ramp up
15    motor.setSpeed(s);
16    delay(10);
17  }
18  for (int s = 255; s >= 60; s--) {   // yavaşça yavaşla / ramp down
19    motor.setSpeed(s);
20    delay(10);
21  }
22  motor.run(RELEASE);                 // dur / stop
23  delay(500);
24
25  motor.setSpeed(180);
26  motor.run(BACKWARD);                // geri / backward
27  delay(2000);
28  motor.run(RELEASE);
29  delay(1000);
30}
BefehlWas er macht
AF_DCMotor motor(1);Legt den Motor an Klemme M1 an; erlaubt Nummern von 1 bis 4
AF_DCMotor motor(1, MOTOR12_64KHZ);Wählt zusätzlich die PWM-Frequenz für M1 und M2
motor.setSpeed(200);Stellt die Geschwindigkeit von 0 bis 255 ein (0 steht, 255 volle Geschwindigkeit)
motor.run(FORWARD);Dreht vorwärts
motor.run(BACKWARD);Dreht rückwärts
motor.run(RELEASE);Hört auf, den Motor anzusteuern; der Motor bleibt stehen
motor.run(BRAKE);In der Bibliothek definiert, bewirkt in V1 aber nichts

Die Geschwindigkeit wird eingestellt, indem die Motorspannung tausende Male pro Sekunde ein- und ausgeschaltet wird; Details findest du in Was ist PWM?. Weil M1 und M2 Timer2 nutzen, kannst du ihre Frequenz wählen: MOTOR12_64KHZ, MOTOR12_8KHZ (Standard), MOTOR12_2KHZ und MOTOR12_1KHZ. Mit 64 kHz ist das Fiepen des Motors nicht mehr hörbar, der L293D wird dabei aber wärmer. M3 und M4 hängen dagegen an Timer0; weil dieser Timer auch millis() und delay() antreibt, lässt die Bibliothek seine Frequenz in Ruhe, und diese beiden Kanäle laufen immer mit etwa 1 kHz.

Der häufigste Fehler ist ein vergessenes setSpeed(). Die Bibliothek setzt die Geschwindigkeit beim Anlegen des Motors auf 0; selbst mit run(FORWARD) rührt sich der Motor ohne Geschwindigkeit nicht. Außerdem brummen die meisten TT-Motoren unter 80–100 nur, ohne zu drehen; starte sie deshalb mit mindestens 100–120.

Code für ein vierrädriges Roboterauto (4WD)

Gelber TT-Getriebemotor mit Rad
Gelber TT-Getriebemotor aus Roboterbausätzen: läuft mit 3–6 V, zieht ohne Last etwa 150 mA und blockiert über 1 A.

Die beliebteste Anwendung des L293D Motor Shields ist ein vierrädriges Roboterauto, denn jeder der vier Motoren bekommt seine eigene Klemme und es gibt kein Kabelchaos. Solche Autos haben keine Lenkung; sie lenken wie ein Panzer: Drehen sich die beiden linken Räder in die eine und die beiden rechten in die andere Richtung, dreht sich das Auto auf der Stelle. Deshalb steuert der Code die Motoren nicht einzeln, sondern als zwei Gruppen, linke Seite und rechte Seite. Für die Handysteuerung schließen wir ein HC-05-Bluetooth-Modul per SoftwareSerial an die freien Pins A0 und A1 an; das Modul erklären wir ausführlich in Bluetooth-Modul HC-05.

BauteilAnschluss
Motor vorne linksM1
Motor hinten linksM2
Motor hinten rechtsM3
Motor vorne rechtsM4
HC-05 TXDA0 (SoftwareSerial RX)
HC-05 RXDA1, über einen Spannungsteiler aus 1 kΩ + 2 kΩ (5 V → 3,3 V)
HC-05 VCC und GNDDie +5V- und GND-Reihe auf dem Shield
2 × 18650-Zelle (7,4 V)EXT_PWR (+M und GND), PWR-Jumper gesteckt
C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <SoftwareSerial.h>
3
4AF_DCMotor frontLeft(1);              // M1: sol ön / front left
5AF_DCMotor rearLeft(2);               // M2: sol arka / rear left
6AF_DCMotor rearRight(3);              // M3: sağ arka / rear right
7AF_DCMotor frontRight(4);             // M4: sağ ön / front right
8
9SoftwareSerial bt(A0, A1);            // RX = A0 (HC-05 TXD), TX = A1 (HC-05 RXD, bölücüyle / via a divider)
10
11int speed = 200;                      // 0–255 arası sürüş hızı / driving speed 0–255
12
13void setSide(AF_DCMotor &a, AF_DCMotor &b, int value) {   // -255 … 255
14  uint8_t dir = value > 0 ? FORWARD : (value < 0 ? BACKWARD : RELEASE);
15  uint8_t pwm = constrain(abs(value), 0, 255);
16  a.setSpeed(pwm);
17  b.setSpeed(pwm);
18  a.run(dir);
19  b.run(dir);
20}
21
22void drive(int left, int right) {     // sol ve sağ taraf / left and right side
23  setSide(frontLeft, rearLeft, left);
24  setSide(frontRight, rearRight, right);
25}
26
27void setup() {
28  Serial.begin(9600);                 // hata ayıklama / debugging
29  bt.begin(9600);                     // HC-05 varsayılan hızı / default baud rate
30  drive(0, 0);
31}
32
33void loop() {
34  if (!bt.available()) return;
35  char c = bt.read();
36  Serial.println(c);
37
38  switch (c) {
39    case 'F': drive(speed, speed);        break;   // ileri / forward
40    case 'B': drive(-speed, -speed);      break;   // geri / backward
41    case 'L': drive(-speed, speed);       break;   // yerinde sola / spin left
42    case 'R': drive(speed, -speed);       break;   // yerinde sağa / spin right
43    case 'G': drive(speed / 3, speed);    break;   // ileri-sola kavis / curve forward-left
44    case 'I': drive(speed, speed / 3);    break;   // ileri-sağa kavis / curve forward-right
45    case 'S': drive(0, 0);                break;   // dur / stop
46    case 'q': speed = 255;                break;   // tam hız / full speed
47    default:
48      if (c >= '0' && c <= '9') speed = map(c - '0', 0, 9, 90, 240);   // hız kademesi / speed step
49  }
50}

Das Herzstück des Codes ist die Funktion drive(links, rechts): Sie nimmt für jede Seite einen Wert von -255 bis 255; positiv heißt vorwärts, negativ rückwärts, null steht. setSide() gibt beiden Motoren einer Seite dieselbe Geschwindigkeit und Richtung. Die Befehle sind die Einzelbuchstaben, die Apps vom Typ „Arduino Bluetooth RC Car“ aus den App-Stores senden: F vorwärts, B rückwärts, L und R auf der Stelle drehen, G und I Kurve, S Stopp. Der Geschwindigkeitsregler der App sendet eine Ziffer von 0 bis 9; der Code macht daraus einen PWM-Wert zwischen 90 und 240, und weil die Untergrenze bei 90 liegt, laufen die Motoren auch auf der niedrigsten Stufe an. Dreht ein Rad falsch herum, ändere nicht den Code, sondern tausche die beiden Kabel dieses Motors an der Klemme. Für den Aufbau des Chassis und eine Version mit zwei Motoren siehe Arduino Roboterauto bauen.

Der RXD-Pin des HC-05 arbeitet mit 3,3 V; verbinde das 5-V-TX-Signal des Arduino nicht ohne Spannungsteiler damit. Außerdem fährt das Auto bei abgerissener Verbindung mit dem letzten Befehl weiter; mit millis() fügst du leicht eine Sicherheitsregel hinzu, die drive(0, 0) aufruft, sobald seit dem letzten Buchstaben eine Sekunde vergangen ist.

Schrittmotoren ansteuern: 28BYJ-48 und NEMA 17

Das Shield kann zwei Schrittmotoren gleichzeitig ansteuern: Schrittmotor-Port 1 nutzt die Klemmen M1 und M2, Port 2 nutzt M3 und M4. Bei einem bipolaren Motor (4 Kabel, etwa ein NEMA 17) kommt eine Spule an M1 und die andere an M2. Bei einem unipolaren Motor (5 oder 6 Kabel) gehen die beiden Spulen ebenfalls an M1 und M2, und das gemeinsame Kabel kommt an die GND-Schraube in der Mitte der Klemme. Beim beliebten 28BYJ-48 sieht die Verdrahtung so aus: blaues und gelbes Kabel an M1, rosa und orangefarbenes Kabel an M2, rotes gemeinsames Kabel an GND. Wie du diesen Motor mit der ULN2003-Platine nutzt, steht in Was ist ein Schrittmotor?.

SchrittartSo funktioniert sieWann sinnvoll?
SINGLEEs ist immer nur eine Spule bestromtGeringster Strom, geringstes Drehmoment
DOUBLEEs sind immer zwei Spulen gleichzeitig bestromtMehr Drehmoment; die gängigste Wahl
INTERLEAVEWechselt zwischen einer und zwei Spulen (Halbschritt)Doppelte Auflösung, ruhigerer Lauf
MICROSTEPSpulenströme ändern sich stufenweise per PWM; jeder Vollschritt wird in 16 Teile geteiltLangsamer, leiser Lauf; weniger Drehmoment

Der 28BYJ-48 ist ein 5-V-Motor; versorge die Motoren für diesen Test mit 4 AA-Batterien (6 V), entferne den Jumper und betreibe den Arduino über USB. Wegen des eingebauten Getriebes besteht eine Umdrehung aus 2048 Vollschritten:

C++ (Arduino IDE)
1#include <AFMotor.h>
2
3// 28BYJ-48: tam adımda tur başına 2048 adım / 2048 full steps per revolution
4AF_Stepper stepper(2048, 1);          // 1 = M1 + M2, 2 = M3 + M4
5
6void setup() {
7  stepper.setSpeed(10);               // dakikada 10 tur / 10 RPM
8}
9
10void loop() {
11  stepper.step(2048, FORWARD, DOUBLE);       // bir tur ileri, güçlü tork / one turn forward, more torque
12  delay(500);
13  stepper.step(4096, BACKWARD, INTERLEAVE);  // yarım adımla bir tur geri / one turn back in half steps
14  stepper.release();                         // bobinleri kapat, ısınmasın / de-energise the coils
15  delay(1000);
16}

setSpeed() legt die Umdrehungen pro Minute fest; wegen seines Getriebes schafft der 28BYJ-48 nicht mehr als etwa 10–15 U/min. Achte darauf, dass step() blockierend ist: Bis der Motor die verlangten Schritte erledigt hat, macht loop() nichts anderes. Willst du Sensoren lesen oder DC-Motoren ansteuern, während der Schrittmotor dreht, nutze die Funktion onestep() der Bibliothek zusammen mit der AccelStepper-Bibliothek; das Beispiel AFMotor_ConstantSpeed aus der Bibliothek zeigt genau das. Mit release() schaltest du die Spulen in Pausen ab und vermeidest Erwärmung, die Welle verliert dabei aber ihr Haltemoment.

Die meisten NEMA-17-Motoren ziehen 1,5–2 A pro Spule bei einem Spulenwiderstand von etwa 1,5–3 Ω. Da der L293D keine Strombegrenzung hat, überschreiten diese Motoren an 12 V die Kanalgrenze um ein Vielfaches, und der Chip schaltet sich nach wenigen Sekunden ab. Nutze am L293D Shield nur Schrittmotoren mit hohem Spulenwiderstand, die an 12 V weniger als 0,4 A ziehen; für kräftige NEMA 17 ist ein A4988-Treiber die richtige Wahl.

Servos anschließen: die Anschlüsse SER1 und SERVO_2

Die beiden dreipoligen Stiftleisten in der Ecke des Shields sind für Servos. Laut Beschriftung sind die Pins − (GND), + (5 V) und S (Signal): Das braune Servokabel kommt an −, das rote an + und das orange an S. Laut Schaltplan der Platine ist SER1 mit D10 und SERVO_2 mit D9 verbunden (manche Quellen nennen die Nummern umgekehrt; bewegt sich das Servo nicht, probiere im Code den anderen Pin). Servos steuerst du mit der Standardbibliothek Servo, und der Timer1, den sie auf dem Uno nutzt, kommt den Timern der Motoren nicht in die Quere; DC-Motoren und Servos arbeiten also problemlos gleichzeitig.

Die Servos werden nicht vom Motorakku, sondern von der 5-V-Schiene des Arduino versorgt. Für ein SG90 ist das kein Problem, große Servos wie das MG996R können in Bewegung aber über 1 A ziehen; der Spannungsregler des Arduino wird heiß, die Spannung bricht ein und das Board startet neu. Stecke bei großen Servos nur das Signalkabel auf die Stiftleiste, versorge + und − des Servos aus einer eigenen 5–6-V-Quelle und verbinde die Massen. Details findest du in MG996R Servo am Arduino und Was ist ein Servomotor?. Der folgende Code schwenkt das Servo an SER1 hin und her, während der Motor an M3 läuft:

C++ (Arduino IDE)
1#include <AFMotor.h>
2#include <Servo.h>
3
4AF_DCMotor motor(3);                  // M3 klemensi / M3 terminal
5Servo servo1;                         // SER1 başlığı / SER1 header
6
7void setup() {
8  servo1.attach(10);                  // SER1 = D10, SERVO_2 = D9
9  motor.setSpeed(170);
10  motor.run(FORWARD);                 // motor dönerken servo tarar / servo sweeps while the motor runs
11}
12
13void loop() {
14  for (int a = 20; a <= 160; a += 2) {   // sağa tara / sweep right
15    servo1.write(a);
16    delay(15);
17  }
18  for (int a = 160; a >= 20; a -= 2) {   // sola tara / sweep left
19    servo1.write(a);
20    delay(15);
21  }
22}

Stromgrenze (0,6 A) und Erwärmung

Die wichtigste Zeile im Datenblatt des L293D lautet 0,6 A dauerhaft und 1,2 A Spitze pro Kanal. Der Spitzenwert gilt nur für sehr kurze Impulse; zieht ein Motor sekundenlang 1 A, kommt der Chip an seine Grenzen. Warum er heiß wird, zeigt eine einfache Rechnung: Der L293D ist ein älterer Treiber mit Bipolartransistoren, und bei 0,6 A fallen am oberen Transistor typisch 1,4 V und am unteren 1,2 V ab. Zieht ein Motor 0,6 A, entstehen im Chip also 0,6 A × 2,6 V ≈ 1,6 W Wärme; zwei Motoren am selben Chip erzeugen das Doppelte, etwa 3 W. Ein kleiner DIP-Chip ohne Kühlkörper wird diese Wärme nicht los, seine Temperatur steigt schnell, und schließlich schaltet die Übertemperaturabschaltung die Ausgänge ab. Das Symptom kennst du vielleicht: Die Motoren laufen eine Weile, bleiben stehen und laufen wieder an, sobald der Chip abgekühlt ist.

Gelbe TT-Motoren ziehen ohne Last etwa 150 mA und beim Fahren auf dem Boden 200–300 mA; das liegt innerhalb der Grenzen des Shields. Kritisch sind die Momente, in denen ein Rad gegen ein Hindernis drückt oder das Auto auf der Stelle dreht: Ein blockierter TT-Motor kann 1–1,5 A ziehen, und bei einem 4WD-Auto kämpfen beim Drehen auf der Stelle alle vier Motoren gleichzeitig. Um den echten Strom deines Motors zu messen, schaltest du ein Multimeter in Reihe zum Motor und hältst das Rad kurz mit der Hand fest; wie das geht, zeigt Multimeter richtig benutzen. So bleibt das Shield kühl:

  • Sanft anfahren: Springe nicht von 0 auf 255, sondern erhöhe die Geschwindigkeit über 200–300 ms schrittweise; der Anlaufstrom sinkt deutlich.
  • Motor nicht blockieren lassen: Lass einen Hindernisvermeider anhalten, bevor er gegen das Hindernis fährt; ein blockierter Motor erzeugt die meiste Wärme.
  • Kühlkörper auf die Chips kleben: Kleine Aluminium-Kühlkörper mit Wärmeleitklebeband senken die Temperatur des L293D etwas.
  • Einen zweiten L293D auflöten: Auch Adafruit erwähnt, dass man zur Erhöhung der Strombelastbarkeit einen zweiten L293D Bein an Bein auf die vorhandenen Chips löten kann; die beiden Chips teilen sich dann den Strom.
  • Nicht mehr Spannung als nötig: 12 V an 6-V-Motoren erhöhen Strom und Wärme.
  • Auf den passenden Treiber wechseln: Zieht dein Motor dauerhaft mehr als 0,6 A, nimm einen Treiber mit L298N oder TB6612FNG.

L293D Motor Shield oder L298N?

L298N Doppel-Motortreibermodul
L298N-Modul: zwei H-Brücken in einem Chip, großer Kühlkörper und 2 A pro Kanal; wird mit Kabeln angeschlossen und passt deshalb zu jedem Board.
MerkmalL293D Motor ShieldL298N-Modul
Anzahl Motoren4 DC oder 2 Schrittmotoren + 2 Servos2 DC oder 1 Schrittmotor
Strom pro Kanal0,6 A dauerhaft, 1,2 A Spitze2 A dauerhaft, 3 A Spitze
Motorspannung4,5–25 V5–35 V
SpannungsabfallEtwa 1,5–2,6 VEtwa 2–3 V
AnschlussWird auf den Uno gesteckt, keine KabelJumper-Kabel; Pins frei wählbar
Belegte Pins8 feste Pins + D9 und D10 für Servos6 Pins (ENA, IN1–IN4, ENB)
BibliothekAFMotor nötigNicht nötig (digitalWrite, analogWrite)
ESP32 und PicoNicht geeignetDirekt nutzbar
Ideal für4WD-Autos mit TT-Motoren, LernsetsKräftigere Motoren, 2WD-Roboter

Kurz gesagt: Baust du mit einem Arduino Uno ein 4WD-Auto mit TT-Motoren, hält das L293D Shield die Verkabelung minimal und bringt alle vier Motoren auf eine Platine. Sind deine Motoren kräftiger, ist dein Board ein ESP32 oder Pico, oder willst du die Pins selbst wählen, ist der L298N flexibler; Details stehen in DC-Motor mit L298N steuern. Suchst du etwas Effizienteres als beide, hat der MOSFET-basierte TB6612FNG einen sehr kleinen Spannungsabfall und verlängert die Akkulaufzeit. Welcher Motortyp zu welcher Aufgabe passt, vergleichen wir in DC-Motor, Servo und Schrittmotor.

Funktioniert es mit ESP32, Raspberry Pi Pico oder Mega?

Mit dem Arduino Mega 2560 funktioniert es problemlos: Das Shield sitzt auf den ersten Digital- und Analogpins des Mega, und AFMotor kennt die Timer des Mega. Mit Uno R4, Leonardo, ESP32 und Raspberry Pi Pico funktioniert es dagegen nicht, weil AFMotor direkt in die Timer-Register von ATmega328P und ATmega2560 schreibt. Ist ein ESP32 ausgewählt, bricht der Build mit 'DC_MOTOR_PWM_RATE' was not declared in this scope ab, bei einem Leonardo mit #error "This chip is not supported!". ESP32-Boards im Uno-Format (etwa der ESPDuino-32) passen zwar mechanisch auf das Shield, aber Pinnummern und der 3,3-V-Signalpegel sind anders. Bei diesen Boards ist ein L298N, ein TB6612FNG oder ein einzelner L293D-Chip statt des Shields viel einfacher. Die Eingänge des L293D erkennen alles über 2,3 V als HIGH und arbeiten deshalb direkt mit 3,3-V-Boards:

L293D-PinFunktionRaspberry Pi PicoESP32
1 (1,2EN)Geschwindigkeit (PWM)GP15GPIO 25
2 (1A)Richtung 1GP14GPIO 26
7 (2A)Richtung 2GP13GPIO 27
3 und 6 (1Y, 2Y)MotoranschlüsseZum MotorZum Motor
4, 5, 12, 13GND (auch die Wärme wird über diese Pins abgeführt)GNDGND
16 (VCC1)Logikversorgung, 5 VVBUS (Pin 40)5V (VIN)
8 (VCC2)MotorversorgungPluspol des AkkusPluspol des Akkus
MicroPython
1from machine import Pin, PWM
2import time
3
4en = PWM(Pin(15))                 # L293D pin 1 (1,2EN): hız / speed
5en.freq(1000)
6in1 = Pin(14, Pin.OUT)            # L293D pin 2 (1A): yön / direction
7in2 = Pin(13, Pin.OUT)            # L293D pin 7 (2A): yön / direction
8
9def motor(speed):                 # -100 … 100
10    in1.value(1 if speed > 0 else 0)
11    in2.value(1 if speed < 0 else 0)
12    en.duty_u16(int(abs(speed) * 655.35))
13
14while True:
15    motor(80)                     # ileri / forward
16    time.sleep(2)
17    motor(0)                      # dur / stop
18    time.sleep(0.5)
19    motor(-60)                    # geri / backward
20    time.sleep(2)
21    motor(0)
22    time.sleep(0.5)

Die Masse von Pico und Akku muss unbedingt verbunden sein. Beim ESP32 baust du dieselbe Logik in der Arduino-Sprache auf: Richtung mit digitalWrite, Geschwindigkeit mit analogWrite an den Pins aus der Tabelle. Sind diese Boards neu für dich, beginne mit Was ist der ESP32? und Was ist der Raspberry Pi Pico?.

Motoren drehen nicht: häufige Fehler und Lösungen

SymptomMögliche UrsacheLösung
Kein Motor dreht, PWR-LED ist ausKein Motorstrom: EXT_PWR ist leer oder nur USB ist angeschlossenSchließe einen 6–12-V-Akku an EXT_PWR an; ohne leuchtende LED drehen die Motoren nicht
LED leuchtet, Code ist hochgeladen, aber der Motor rührt sich nichtKein setSpeed() im Code oder Motornummer passt nicht zur KlemmesetSpeed(200) in setup() ergänzen; prüfen, ob AF_DCMotor(1) zu M1 passt
Motor brummt, dreht aber nichtPWM-Wert zu niedrig oder Akku schwachÜber 100 starten; Akku laden oder zwei 18650-Zellen nutzen
„AFMotor.h: No such file or directory“Bibliothek nicht installiert oder V2 installiertDie V1-Bibliothek Adafruit Motor Shield library über den Bibliotheksverwalter installieren
Fehler „This chip is not supported!“ oder „DC_MOTOR_PWM_RATE“Uno R4, Leonardo oder ESP32 als Board ausgewähltUnter Werkzeuge > Board Uno oder Mega auswählen
Arduino startet neu, wenn die Motoren anlaufenDer Anlaufstrom zieht die Akkuspannung herunter (Brownout)Jumper entfernen und Arduino getrennt versorgen; 100-nF-Kondensator an die Motoranschlüsse löten
Motor läuft eine Weile und bleibt stehen, Chip ist sehr heißDie Übertemperaturabschaltung des L293D hat ausgelöstLast verringern, sanft anfahren, Kühlkörper ergänzen oder auf L298N wechseln
Motoren wechseln zufällig die RichtungD4, D7, D8 oder D12 werden im Code anderweitig genutztSensoren auf A0–A5 verlegen
Geschwindigkeit von M1 und M2 lässt sich nicht ändern, M3 und M4 normaltone() oder IRremote nutzt Timer2Diese Motoren auf M3 und M4 legen oder den kollidierenden Code entfernen
Ein Rad dreht falsch herumMotorkabel an der Klemme vertauschtDie beiden Kabel dieses Motors tauschen
Board verhält sich mit aufgestecktem Shield seltsamDie USB-Buchse des Uno berührt Lötstellen unter dem Shield oder ein Pin ist verbogenIsolierband auf die USB-Buchse kleben, Pins geradebiegen und Shield neu aufstecken
Am schnellsten findest du den Fehler, wenn du den Test auf die einfachste Form reduzierst: Leg den ganzen Auto-Sketch beiseite, schließe einen einzigen Motor an M1 an, prüfe, ob die PWR-LED leuchtet, und lade den ersten Sketch von oben hoch. Funktioniert das, liegt das Problem in deinem Code und nicht am Shield; funktioniert es nicht, beginne bei Stromversorgung und Bibliothek. Alle Gründe, warum ein Arduino ständig neu startet, findest du in Arduino startet ständig neu.

Projektideen mit dem L293D Motor Shield

  • Bluetooth-gesteuertes 4WD-Auto: Ein Roboter mit Allradantrieb, den du mit dem Code oben per Handy fährst.
  • Hindernisvermeidender Roboter: Ein Auto, das mit einem HC-SR04 auf dem Servo an SER1 nach vorne scannt und in die freieste Richtung abbiegt; die komplette Anleitung steht in Hindernisvermeidender Roboter mit Arduino.
  • Linienfolger: Folge mit Infrarotsensoren an A0–A3 einer schwarzen Linie auf dem Boden; die PID-Einstellung steht in Linienfolger-Roboter mit Arduino.
  • Kameraslider: Fahre eine Kamera mit einem Schrittmotor langsam über eine Schiene und filme Zeitraffer.
  • Pan-Tilt-Kopf: Stecke zwei Servos an die beiden Servo-Anschlüsse und richte eine Kamera oder einen Laser in zwei Achsen aus; für mehr Servos siehe Arduino Roboterarm bauen.
  • Automatischer Vorhang oder Förderband: Öffne und schließe mit einem DC-Motor einen Vorhang je nach Helligkeit oder baue ein kleines Förderband.

Zusammengefasst nutzt du das L293D Motor Shield richtig, wenn du die V1-Bibliothek installierst, die PWR-LED prüfst, den Jumper passend zur Stromversorgung setzt, setSpeed() nicht vergisst, Sensoren an A0–A5 anschließt und deine Motoren unter der Grenze von 0,6 A hältst. Mit diesen Regeln trägt ein kleines Shield allein die ganze Muskelkraft eines Roboters mit vier Motoren. In der BlueGrays-App findest du das Bluetooth-gesteuerte Auto, den hindernisvermeidenden Roboter sowie Schrittmotor- und Servo-Projekte Schritt für Schritt mit Schaltplänen und Code.

Häufige Fragen

Wie viele Motoren kann das L293D Motor Shield ansteuern?

Das Shield kann 4 DC-Motoren gleichzeitig ansteuern, jeden unabhängig vorwärts, rückwärts und mit eigener Geschwindigkeit. Statt DC-Motoren lassen sich auch 2 Schrittmotoren (die Paare M1–M2 und M3–M4) oder 2 DC-Motoren plus 1 Schrittmotor anschließen. Zusätzlich gibt es zwei Servo-Anschlüsse; die Servos werden unabhängig von den Motoren über D9 und D10 gesteuert.

Wofür ist der PWR-Jumper am L293D Motor Shield?

Mit gestecktem Jumper ist die Motorversorgung des Shields mit der Vin-Leitung des Arduino verbunden, und beide Platinen laufen aus einer Quelle. Versorgst du den Arduino über USB und die Motoren über einen eigenen Akku, musst du den Jumper entfernen. Getrennte Quellen an Hohlbuchse und EXT_PWR bei gestecktem Jumper schließen die beiden Netzteile kurz.

Welcher Akku eignet sich für das L293D Motor Shield?

Für Roboterautos mit TT-Motoren sind zwei 18650-Lithiumzellen (7,4 V) die beste Wahl; da der L293D etwa 2 V verliert, bekommen die Motoren 5,5–6 V. Vier AA-Batterien lassen den Motoren nur rund 4 V, und ein 9-V-Block liefert nicht genug Strom für Motoren. Achte beim Anschluss an EXT_PWR auf die Polung, denn die Klemme hat keinen Verpolungsschutz.

Wie behebe ich „AFMotor.h: No such file or directory“?

Dieser Fehler bedeutet, dass die AFMotor-Bibliothek nicht installiert ist. Suche im Bibliotheksverwalter nach Adafruit Motor Shield und installiere die Adafruit Motor Shield library, in deren Beschreibung V1 steht. Die V2-Bibliothek ist für eine andere Platine und enthält keine AFMotor.h.

Wie viel Strom verträgt das L293D Motor Shield und warum wird es heiß?

Jeder Kanal liefert 0,6 A dauerhaft und 1,2 A für sehr kurze Spitzen. Weil an den Transistoren des L293D bei 0,6 A etwa 2,6 V abfallen, entstehen pro Motor knapp 1,5 W Wärme; deshalb wird der Chip heiß und schaltet sich bei Überschreitung der Grenze ab. Achte darauf, dass die Motoren nicht blockieren, und nimm für Motoren, die dauerhaft mehr als 0,6 A ziehen, einen stärkeren Treiber wie den L298N.

Was ist besser: L293D Motor Shield oder L298N?

Baust du mit einem Arduino Uno ein 4WD-Auto mit TT-Motoren, ist das L293D Shield praktischer, weil es ohne Kabel aufgesteckt wird und vier Motorkanäle hat. Nutzt du kräftigere Motoren, einen ESP32 oder Pico oder willst du die Pins selbst wählen, passt der L298N mit 2 A pro Kanal besser. Beide verlieren etwa 2 V der Motorspannung.

Alle Projekte ansehen
Bluetooth-gesteuertes Auto mit L298N
#80Fortgeschritten
Premium

Bluetooth-gesteuertes Auto mit L298N

Mach dein Handy zur Fernbedienung und steuere dein eigenes Roboterauto. Der Arduino empfängt über ein Bluetooth-Modul die Befehle einer Fernsteuer-App auf dem Handy und treibt die Räder über einen Mot

5.0(38)
65
Roboter zur Hindernisvermeidung
#81Fortgeschritten
Premium

Roboter zur Hindernisvermeidung

Wie wäre es, ein intelligentes Fahrzeug zu bauen, das seinen Weg selbst findet? Der Obstacle Avoiding Robot scannt dank des Ultraschallsensors vor ihm ständig seine Umgebung. Wenn er auf ein Hindernis

5.0(38)
49
Verwendung von Schrittmotoren
#67Mittel
Premium

Verwendung von Schrittmotoren

Ein Motor, der sich Schritt für Schritt genau so weit dreht, wie du willst, wie der Zeiger einer Uhr. Über eine Treiberplatine dreht der Arduino einen kleinen Schrittmotor eine volle Umdrehung in die

4.5(31)
42
360-Grad-Servo aus einem Schrittmotor bauen
#68Mittel
Premium

360-Grad-Servo aus einem Schrittmotor bauen

Bring einem gewöhnlichen Schrittmotor bei, jeden gewünschten Winkel anzufahren, und zwar rund um den ganzen Kreis. Der Arduino berechnet, wie viele Schritte jeder Winkel braucht; der Motor fährt nache

4.5(22)
32
Verwendung von Servomotoren
#35Anfänger
Premium

Verwendung von Servomotoren

Der Arm eines kleinen Servomotors dreht sich nacheinander in drei Stellungen: ganz an den Anfang, genau in die Mitte und ganz ans Ende, mit jeweils zwei Sekunden Pause. Der Arduino sagt dem Motor, bei

4.7(48)
67
Servomotorbetrieb mit Potentiometer
#36Anfänger
Premium

Servomotorbetrieb mit Potentiometer

Während du am Knopf des Potentiometers drehst, dreht sich der Arm des Servomotors einfach mit: Das eine Ende des Knopfes bedeutet null Grad, das andere eine halbe Umdrehung. Der Arduino liest die Stel

4.6(37)
52
LED per Bluetooth mit dem Handy steuern
#34Anfänger
Premium

LED per Bluetooth mit dem Handy steuern

Eine kleine Probe dafür, das Licht in deinem Zimmer vom Handy aus ein- und auszuschalten. Das Bluetooth-Modul leitet die Buchstaben, die du vom Handy schickst, an den Arduino weiter; ein Buchstabe sch

4.8(68)
89
TCRT5000 Schwarz-Weiß-Untergrunderkennung
#78Mittel
Premium

TCRT5000 Schwarz-Weiß-Untergrunderkennung

Mit dem kleinen Sensor, der bei Linienfolger-Robotern als Auge dient, erkennst du, ob der Boden schwarz oder weiß ist. Der TCRT5000 schickt unsichtbares Licht auf den Boden und prüft, wie viel davon z

4.7(40)
49