In diesem Beitrag zeige ich dir wie du an einem Arduino UNO einen DC Motor mithilfe eines 2 Achsen Joystick steuern kannst.
Für dieses Projekt verwende ich zusätzlich die H-Brücke vom Typ L298N welche ich dir bereits im Beitrag H-Brücke L298N am Arduino UNO vorgestellt habe.
Benötigte Ressourcen für dieses Projekt
Für den Nachbau dieses kleines Projektes benötigst du:
- einen Arduino UNO R3*,
- ein USB Datenkabel*,
- einen kleinen DC Motor mit 5V Spannung*,
- ein Batteriehalter für 4x AA Batterien*,
- drei AA Batterien* **,
- einen Joystick*,
- ein L298N DC Motor-Driver Shield*,
- ein paar Breadboardkabel*, sowie
- ein Breadboard*,
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
** Die AA Mignon Batterien bekommst du auch recht günstig im Discounter um die Ecke, aber auf ebay.de findest du auch recht günstige Angebote von Namhaften Herstellern.
In diesem Beitrag habe ich als Batterien die Hausmarke “B1” vom Toom Baumarkt verwendet, diese hatten leider nur kurze Zeit die Leistung um den DC Motor auf “Fullspeed” anzutreiben.
Daher würde ich empfehlen ein Namhaften Hersteller wie Duracel, Varta oder ähnliches zu verwenden.
Alternative Sets
Du findest einen passenden Motor und einen Arduino UNO auch in einem Set wie Bsp. in dem ELEGOO UNOR3 Arduino Projekt Baukasten Ultimate Starter Kit auf ebay.de.
Das Joystick Shield für den Arduino bzw. Raspberry Pi habe ich dir bereits im Beitrag Arduino Lektion 38: Joystick vorgestellt und auch im Beitrag Arduino Leonardo & Joystick als Mausersatz gezeigt wie du damit deinen Mauszeiger am Computer steuern kannst.
Werkzeuge & Verbrauchsmaterial
Der DC Motor kommt ggf. mit Lötanschlüssen daher, an diese müssen wir zunächst zwei Litzen anlöten und benötigen folgende Werkzeuge & Verbrauchsmaterial:
- einen 30 Watt Lötkolben*,
- Lötzinn*,
- Lötfett*,
- ein hitzebeständige Unterlage*,
- eine Dritte Hand*,
- Litze 0,5 mm*
Aufbau der Schaltung
An den Arduino UNO werden die beiden Module wiefolgt angeschlossen:
Sensor / Aktor | Arduino UNO R3 |
---|---|
Joystick | |
GND | GND |
+5V | 5V |
VRX | analoger Pin A0 |
L298N DC Motor Shield | |
IN1 | digitaler Pin D1 |
IN2 | digitaler Pin D2 |
Das L298N Modul kannst du mit einer Spannung von +5V bis max. +35V betreiben. Die Eingangsspannung muss ca. 2V über der gewünschten Ausgangsspannung liegen, daher verwende ich in dem finalen Aufbau einen 4x AA Batteriehalter ca. 6,5V (gemessen 6,46V).
Somit ergibt sich folgender zusätzlicher Aufbau mit dem Modul L298N DC Motor Driver Shield:
L298N DC Motor Driver Shield | Bauteil |
---|---|
OUT1 | DC Motor Pin 1 |
OUT2 | DC Motor Pin 2 |
+7V | Batteriepack, Pluspol |
GND | GND von dem Batteriepack und zusätzlich an den GND des Arduinos |
Hier nun der Aufbau der Schaltung inkl. 9V Blockbatterie:
In der Grafik habe ich eine 9V Blockbatterie verwendet, natürlich ist die Ausgangsspannung von knapp 7V deutlich zu hoch für einen 5V Motor, jedoch gibt das Tool zum Erstellen dieser Schaltungen keine passendere Spannungsquelle bereit.
Programmieren des Joysticks & DC Motor in der Arduino IDE
Ermitteln der Joystick Positionswerte
Zunächst müssen wir ermitteln, welche Werte der Joystick liefert.
In meinem Fall habe ich den Joystick am analogen Pin A0 angeschlossen und dieser ist in der mittleren Position beim Wert von 500 und ganz links auf 0 und ganz rechts auf 1023.
void setup() { Serial.begin(9600); } void loop() { Serial.println(analogRead(A0)); delay(15); }
Somit haben wir den Wertebereich 500..0 für “Motor drehen nach links” und 500..1023 “Motor drehen nach rechts”.
Mappen der Werte für den Motor
Ein möglicher analoger Wert am Arduino UNO liegt zwischen 0 und 1023. Diesen müssen wir nun teilen (für links / rechts drehen) und auf ein PWM Signal (0..255) mappen.
#define joystick A0 int value = -1; void setup() { Serial.begin(9600); } void loop() { int tmpValue = analogRead(joystick); if(tmpValue == value){ return; } else { value = tmpValue; } int motorgeschwindkeit = 0; if (value >= 0 && value < 495) { motorgeschwindkeit = map(value, 500, 0, 0, 255); Serial.println("Motor links drehen!"); } else if (value > 505) { motorgeschwindkeit = map(value, 500, 1023, 0, 255); Serial.println("Motor rechts drehen!"); } else if (value == 500) { Serial.println("Motor STOPP!"); } Serial.println(motorgeschwindkeit); delay(15); }
steuern des Motors über die H-Brücke L298N
Wir haben nun die Geschwindigkeit und die Richtung des Motors ermittelt, mit diesen Werten können wir nun mithilfe einer H-Brücke L298N den Motor vorwärts / rückwärts in einer definierbaren Geschwindigkeit drehen lassen.
#define joystick A0 // DC Motor 1 int ena = 10; int in1 = 9; int in2 = 8; const int MOTOR_PWM_START = 45; int value = -1; void stoppMotor() { digitalWrite(in1, LOW); digitalWrite(in2, LOW); } void moveMotor(bool forward, int motorSpeed) { analogWrite(ena, motorSpeed); if (forward) { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); } else { digitalWrite(in1, LOW); digitalWrite(in2, HIGH); } } void setup() { Serial.begin(9600); pinMode(ena, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); } void loop() { int tmpValue = analogRead(joystick); if (tmpValue == value) { return; } else { value = tmpValue; } int motorgeschwindkeit = 0; if (value >= 0 && value < 495) { motorgeschwindkeit = map(value, 500, 0, MOTOR_PWM_START, 255); Serial.println("Motor links drehen!"); moveMotor(true, motorgeschwindkeit); } else if (value > 505) { motorgeschwindkeit = map(value, 500, 1023, MOTOR_PWM_START, 255); Serial.println("Motor rechts drehen!"); moveMotor(false, motorgeschwindkeit); } else if (value > 495 && value < 505) { Serial.println("Motor STOPP!"); stoppMotor(); } Serial.println(motorgeschwindkeit); delay(15); }
In nachfolgendem Video zeige ich dir nun wie du mit einem Joystick am Arduino UNO einen DC Motor steuern kannst.
Dabei wird die mittlere Position des Joysticks als “Motor AUS” verwendet.
Hallo Stefan, danke für die schnelle Lösungsdarstellung. Jetzt wird modifiziert.
Hi Michael,
gerne geschehen, ich bin ja auch etwas abhängig von euren Ideen / Problemen damit ich Inhalt auf meinem Blog bringen kann.
Solltest du also mal wieder was haben du weißt ja wie du mich erreichen kannst.
Gruß,
Stefan Draeger
Hallo Herr Draeger,
wie würde es jetzt funktionieren einen 2. Motor über den selben Joystick anzusteuern? Würde man dann einfach eine zweite Funktion “moveMotor” erzeugen und dann entsprechend die Daten aus dem Joystick abrufen?
VG
Andreas
Hi,
hier benötigt man noch zusätzlich eine zweite H-Brücke und eine extra Funktion.
Damit man den Code trotzdem übersichtlich und einfach hat, würde ich dazu tendieren eine Funktion zu schreiben, welche die Richtung und den Motor enthält.
Gruß, Stefan
Hallo Herr Draeger,
Tatsächlich funktioniert es auch mit der selben H-Brücke. In der ersten if Anweisung habe ich anstelle des TempValues den Code selbst nochmal aufgerufen mit dem jeweiligen Funktionen und Variablen als Stoppmotor2 z.B. das funktioniert.
Viele Grüße
Andreas
Hi,
ja das denke ich schon nur wie sieht es mit der Last aus?
Man sollte hier die Temperatur im Auge behalten nicht, dass wenn die Motoren zu viel Strom ziehen, etwas kaputtgeht.
Daher der Ansatz mit einer zweiten H-Brücke.
Gruß, Stefan