Arduino UNO – steuern eines DC Motors mit dem Joystick

In diesem Beitrag zeige ich dir wie du an einem Arduino UNO einen DC Motor mithilfe eines 2 Achsen Joystick steuern kannst.

kontrollieren eines DC Motors mit einem Joystick am Arduino UNO
kontrollieren eines DC Motors mit einem Joystick am Arduino UNO

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.

L298N DC Motor Shield
L298N DC Motor Shield

Benötigte Ressourcen für dieses Projekt

Für den Nachbau dieses kleines Projektes benötigst du:

* 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 Namenhaften 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 Namenhaften 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üsse daher, an diese müssen wir zunächst zwei Litzen anlöten und benötigen folgende Werkzeuge & Verbrauchsmaterial:

Aufbau der Schaltung

An den Arduino UNO werden die beiden Module wiefolgt angeschlossen:

Sensor / AktorArduino UNO R3
Joystick
GNDGND
+5V5V
VRXanaloger Pin A0
L298N DC Motor Shield
IN1digitaler Pin D1
IN2digitaler 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 ShieldBauteil
OUT1DC Motor Pin 1
OUT2DC Motor Pin 2
+7VBatteriepack, Pluspol
GNDGND von dem Batteriepack
und zusätzlich an den GND des Arduinos

Hier nun der Aufbau der Schaltung inkl. 9V Blockbatterie:

Aufbau der Schaltung - L298N DC Motor Shield & Joystick am Arduino UNO
Aufbau der Schaltung – L298N DC Motor Shield & Joystick am Arduino UNO

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.

kontrollieren eines DC Motors am Arduino UNO mit einem Joystick
Dieses Video ansehen auf YouTube.

2 Kommentare

    1. 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

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.