DC-Motor & N20 Getriebemotor mit Arduino ansteuern: PWM-Drehzahlregelung Schritt für Schritt
Servos und Schrittmotoren hast du vielleicht schon bewegt – aber der einfache DC-Motor ist der Antrieb, der in fast jedem fahrenden, drehenden oder rührenden Projekt steckt. Und er ist gleichzeitig das Bauteil, mit dem Einsteiger am häufigsten ihren ersten Arduino-Pin zerstören. In diesem Tutorial lernst du, warum ein Motor niemals direkt an einen GPIO gehört, baust die klassische Transistor-Schaltung mit Freilaufdiode auf, regelst die Drehzahl per PWM und steuerst sie am Ende komfortabel mit einem Rotary Encoder. Als Antriebe nutzen wir den kompakten N20-Getriebemotor mit Metallgetriebe und die flotten 130er DC-Motoren.
Getriebemotor oder blanker DC-Motor – was brauchst du?
Ein blanker Bürsten-DC-Motor wie der 130er Micro-Motor dreht extrem schnell – bis zu 20.000 Umdrehungen pro Minute – hat dafür aber kaum Drehmoment. Perfekt für Propeller, Lüfter oder Vibrationseffekte, aber völlig ungeeignet, um ein Rad oder eine Mechanik anzutreiben: Er bleibt bei der kleinsten Last stehen.
Genau dafür gibt es Getriebemotoren wie den N20 mit Vollmetall-Getriebe: Ein Untersetzungsgetriebe tauscht Drehzahl gegen Kraft. Aus 20.000 U/min werden z. B. 40 U/min – dafür dreht die Welle mit so viel Drehmoment, dass sie Roboterräder, Seilwinden oder Drehteller zuverlässig bewegt. Die Faustregel:
| Motortyp | Drehzahl | Drehmoment | Typische Anwendung |
|---|---|---|---|
| 130er DC-Motor | sehr hoch (bis 20.000 U/min) | sehr gering | Propeller, Lüfter, Vibration |
| N20 Getriebemotor | niedrig (z. B. 40 U/min) | hoch | Roboter, Winden, Drehteller |
| Servo (SG90/MG996R) | Positionierung statt Rotation | mittel–hoch | Lenkung, Klappen, Greifer |
| Schrittmotor (28BYJ-48) | präzise Schritte | mittel | exakte Positionierung |
Wann ein Schrittmotor die bessere Wahl ist, liest du im Artikel Schrittmotor 28BYJ-48 mit Arduino ansteuern – heute geht es um die pure Rotation.
Warum der Motor NIEMALS direkt an den Arduino-Pin darf
Ein Arduino-GPIO liefert maximal etwa 40 mA – empfohlen sind 20 mA. Schon der kleine 130er Motor zieht im Anlauf und unter Last aber schnell mehrere hundert Milliampere, im Blockierfall über ein Ampere. Schließt du ihn direkt an einen Pin an, überlastest du den Ausgangstreiber des ATmega328 – im besten Fall stirbt nur der Pin, im schlimmsten der ganze Chip.
Die Lösung ist ein Transistor als elektronischer Schalter: Der Arduino-Pin liefert nur einen winzigen Steuerstrom an die Basis, der Transistor schaltet dafür den großen Motorstrom aus einer separaten Versorgung. Dazu kommen zwei Bauteile, die du nie weglassen darfst:
- Basiswiderstand (ca. 1 kΩ): begrenzt den Steuerstrom aus dem Arduino-Pin – aus dem Widerstands-Sortiment
- Freilaufdiode (z. B. 1N4007) über dem Motor: Ein Motor ist eine Spule. Beim Abschalten erzeugt er eine Spannungsspitze von etlichen Volt, die ungebremst den Transistor oder Arduino zerstört. Die Diode (Kathode/Ring Richtung Plus!) leitet diese Spitze harmlos ab.
⚠️ Getrennte Stromversorgung verwenden: Versorge den Motor aus einem eigenen Batteriepack (z. B. einem AA-Batteriehalter mit 2–4 Zellen), nicht aus dem 5V-Pin des Arduino. Der Spannungsregler des Boards schafft die Anlaufströme nicht – das Board resettet oder der Regler wird heiß. Wichtig: GND von Batteriepack und Arduino verbinden, sonst fehlt der gemeinsame Bezugspunkt.
Das brauchst du
1Aufbau & erster Test: Motor ein- und ausschalten
So verkabelst du die Transistor-Schaltung auf dem Breadboard:
| Verbindung | Von | Nach |
|---|---|---|
| Steuerleitung | Arduino D9 | 1-kΩ-Widerstand → Basis des Transistors |
| Motor-Minus | Motoranschluss 2 | Kollektor des Transistors |
| Motor-Plus | Motoranschluss 1 | Plus vom Batteriepack (3–6 V) |
| Schaltstrecke | Emitter des Transistors | GND (Breadboard-Minusschiene) |
| Freilaufdiode | parallel zum Motor | Ring (Kathode) Richtung Plus |
| Masseverbindung | Batteriepack-Minus | Arduino GND |
Der erste Sketch schaltet den Motor im Zwei-Sekunden-Takt – damit prüfst du, ob die Schaltung stimmt:
const int MOTOR = 9; // D9 = PWM-faehiger Pin
void setup() {
pinMode(MOTOR, OUTPUT);
}
void loop() {
digitalWrite(MOTOR, HIGH); // Transistor schaltet durch -> Motor laeuft
delay(2000);
digitalWrite(MOTOR, LOW); // Motor aus
delay(2000);
}
ℹ️ Motor läuft \"falsch herum\"? Bei einem Bürsten-DC-Motor bestimmt die Polarität die Drehrichtung. Einfach die beiden Motoranschlüsse tauschen. Eine elektronische Richtungsumkehr braucht eine H-Brücke – dazu unten mehr.
2Drehzahl regeln mit PWM
Ein DC-Motor kennt eigentlich nur an und aus. Der Trick der Drehzahlregelung heißt PWM (Pulsweitenmodulation): Der Arduino schaltet den Transistor hunderte Male pro Sekunde ein und aus. Ist er 50 % der Zeit an, bekommt der Motor im Mittel die halbe Leistung – er dreht langsamer. Die Trägheit des Ankers glättet das Pulsen zu einer runden Drehbewegung. Auf den PWM-Pins (beim Nano: D3, D5, D6, D9, D10, D11) erledigt analogWrite() das für dich mit Werten von 0 bis 255:
const int MOTOR = 9;
void setup() {
pinMode(MOTOR, OUTPUT);
}
void loop() {
// sanft beschleunigen
for (int tempo = 0; tempo <= 255; tempo += 5) {
analogWrite(MOTOR, tempo);
delay(100);
}
delay(1500); // kurz Vollgas halten
// sanft abbremsen
for (int tempo = 255; tempo >= 0; tempo -= 5) {
analogWrite(MOTOR, tempo);
delay(100);
}
delay(1500);
}
💡 Warum der Motor bei kleinen Werten stehen bleibt: Unterhalb eines gewissen PWM-Werts (oft ~60–80) reicht die mittlere Spannung nicht, um Haftreibung und Getriebewiderstand zu überwinden – der Motor brummt nur. Praxis-Trick: kurz mit hohem Wert \"anstoßen\" und dann auf den Wunschwert herunterregeln. Beim N20-Getriebemotor ist dieser Effekt stärker als beim 130er, weil das Getriebe zusätzliche Reibung mitbringt.
3Drehzahl per Rotary Encoder einstellen
Feintuning per Code-Upload ist mühsam – ein KY-040 Rotary Encoder macht daraus ein echtes Bedienelement: Drehen ändert die Drehzahl, Drücken stoppt den Motor. Verkabelung: CLK an D2, DT an D3, SW an D4, + an 5V, GND an GND.
const int MOTOR = 9;
const int CLK = 2;
const int DT = 3;
const int SW = 4;
volatile int tempo = 0; // 0..255
volatile int letzterCLK;
bool motorAn = true;
void encoderISR() {
int clk = digitalRead(CLK);
if (clk != letzterCLK && clk == LOW) {
if (digitalRead(DT) != clk) tempo += 10; // rechtsherum: schneller
else tempo -= 10; // linksherum: langsamer
tempo = constrain(tempo, 0, 255);
}
letzterCLK = clk;
}
void setup() {
Serial.begin(115200);
pinMode(MOTOR, OUTPUT);
pinMode(CLK, INPUT);
pinMode(DT, INPUT);
pinMode(SW, INPUT_PULLUP);
letzterCLK = digitalRead(CLK);
attachInterrupt(digitalPinToInterrupt(CLK), encoderISR, CHANGE);
}
void loop() {
// Taster: Motor stoppen / starten (mit einfachem Entprellen)
if (digitalRead(SW) == LOW) {
motorAn = !motorAn;
delay(300);
}
analogWrite(MOTOR, motorAn ? tempo : 0);
static unsigned long letzteAusgabe = 0;
if (millis() - letzteAusgabe > 500) {
letzteAusgabe = millis();
Serial.printf("Tempo: %d/255 (%s)\n", tempo, motorAn ? "AN" : "STOP");
}
}
Wie der Encoder intern funktioniert und wie du ihn sauber entprellst, erklärt ausführlich der Artikel Rotary Encoder KY-040 mit Arduino auslesen.
ℹ️ Hinweis für den klassischen Nano: Serial.printf gibt es nur auf ESP32/ESP8266. Auf dem Nano nutzt du stattdessen Serial.print(tempo); und Serial.println(motorAn ? " AN" : " STOP"); – der Rest des Sketches läuft unverändert.
Ausblick: Drehrichtung wechseln mit der H-Brücke
Mit einem einzelnen Transistor kannst du den Motor nur ein- und ausschalten und seine Drehzahl regeln – die Drehrichtung bleibt fest. Für Vor- und Rückwärtsfahrt braucht es eine H-Brücke: vier Schalter in H-Anordnung, die den Strom wahlweise in beide Richtungen durch den Motor leiten. In der Praxis nimmt man dafür fertige Treiber-ICs (klassisch L298N oder moderner DRV8833/TB6612), die zwei Motoren gleichzeitig mit Richtung und PWM-Tempo steuern – die Grundlage für jedes zweirädrige Roboterfahrzeug.
⚙️ Ideen zum Weiterbauen
- Mini-Seilwinde: N20-Motor + Garnrolle hebt kleine Lasten – das Metallgetriebe macht's möglich
- Rührwerk / Drehteller: langsam laufender N20 als Antrieb für Zeitraffer-Aufnahmen
- Mini-Ventilator: 130er Motor mit Propeller, Drehzahl per Encoder – das perfekte Sommerprojekt
- Anzeige nachrüsten: aktuelles Tempo auf einem OLED zeigen – siehe OLED Display SSD1306 mit Arduino
Perfekt für: Robotik-Einstieg, bewegte Sommerprojekte, alles was dreht und fährt
Troubleshooting
⚠️ Motor dreht gar nicht: Miss zuerst die Batteriespannung unter Last. Prüfe dann die Transistor-Beinchen (Basis/Kollektor/Emitter je nach Typ unterschiedlich belegt!) und ob GND von Arduino und Batteriepack wirklich verbunden ist – die fehlende Massebrücke ist Fehlerquelle Nummer eins.
⚠️ Arduino resettet, sobald der Motor anläuft: Der Anlaufstrom bricht die Versorgung ein. Motor auf ein eigenes Batteriepack legen und einen Elko (100–470 µF) über die Motorversorgung setzen.
⚠️ Transistor wird heiß: Basiswiderstand zu groß (Transistor schaltet nicht voll durch) oder der Motor zieht mehr Strom, als der Transistor verträgt. Bei größeren Motoren auf einen Logic-Level-MOSFET wechseln.
⚠️ Motor pfeift hörbar: Das ist die PWM-Frequenz (beim Nano ca. 490 Hz). Meist harmlos – stört das Pfeifen, kannst du die PWM-Frequenz per Timer-Register erhöhen.
⚠️ Störungen bei Sensoren, sobald der Motor läuft: Bürstenfeuer erzeugt elektrische Störungen. Ein 100-nF-Keramikkondensator direkt über die Motoranschlüsse und getrennte, kurze Leitungen schaffen Abhilfe.
🚀 Alles für deine Motorsteuerung
Diese Teile bringen dein Projekt in Bewegung:
- N20 Getriebemotor mit Metallgetriebe – kompakter Kraftprotz für Robotik
- 130 Micro DC-Motor (3er-Set) – schnelle Motoren zum Experimentieren
- Arduino Nano V3 (USB-C) – die kompakte Steuerzentrale
- KY-040 Rotary Encoder – Drehzahl komfortabel einstellen
- Widerstands-Sortiment 600 Teile – Basiswiderstände immer parat
- AA-Batteriehalter (5er-Set) – separate Motorversorgung
- Breadboard 400 Kontakte – für den Aufbau
Fazit
DC-Motoren anzusteuern ist keine Raketenwissenschaft – aber es gibt drei Regeln, die über Leben und Tod deines Arduino entscheiden: Der Motor hängt nie direkt am GPIO, die Freilaufdiode fehlt nie, und die Massen von Motor- und Logikversorgung sind immer verbunden. Mit der Transistor-Schaltung hast du die universelle Grundschaltung aufgebaut, mit PWM die Drehzahl stufenlos geregelt und mit dem Rotary Encoder ein richtiges Bedieninterface geschaffen.
Du weißt jetzt auch, wann welcher Motor der richtige ist: der 130er für hohe Drehzahlen ohne Last, der N20-Getriebemotor, wenn echtes Drehmoment gefragt ist – und die H-Brücke als nächster Schritt, sobald dein Projekt rückwärts fahren soll. Damit steht deinem ersten fahrenden Roboter nur noch die Frage im Weg, welche Farbe das Chassis bekommt. Viel Spaß beim Bauen!