Joystick-Modul am Arduino auslesen

FunduinoZuletzt aktualisiert am

Zwei Achsen und den Taster auslesen, LEDs und einen Ton ansteuern

Ein Joystick-Modul ist im Grunde nichts anderes als zwei Potentiometer in einem Gehäuse – eines für die x-Achse, eines für die y-Achse – plus ein Taster, den du durch Drücken auf den Joystick auslöst.

In dieser Anleitung liest du zuerst die Position des Joysticks aus und machst die vier Endanschläge mit je einer LED sichtbar. Danach kommt der Taster dazu: Drückst du ihn, gibt ein Piezo-Speaker einen Ton aus.

Schaltplan: Joystick-Modul und vier LEDs am Arduino UNO
Schaltplan für Aufgabe 1: Joystick-Modul und vier LEDs

So funktioniert das Joystick-Modul

Das Modul hat fünf Anschlüsse (Pins):

  • GND – Masse, an den GND-Pin des Arduino
  • +5V – Stromversorgung, an den 5V-Pin des Arduino
  • VRx – x-Achse, an den Pin A0
  • VRy – y-Achse, an den Pin A1
  • SW – der „Switch“. Das Modul hat einen Taster, den du auslöst, indem du senkrecht auf den Joystick drückst. In Aufgabe 1 bleibt dieser Pin unbenutzt.

Hinter der x- und der y-Achse steckt jeweils ein ganz gewöhnliches Potentiometer. Je nachdem, wohin du den Joystick bewegst, gibt jede Achse an ihrem Pin eine Spannung zwischen 0 V und 5 V aus. Der Arduino liest diese Spannung über seine analogen Eingänge ein und speichert die Lage des Joysticks als Zahlenwert zwischen 0 und 1023.

Bewegst du den Joystick bis zum Endanschlag nach links, registriert der Mikrocontroller auf der x-Achse den Wert 1023. Am gegenüberliegenden Anschlag ist es der Wert 0. Auf der y-Achse ist es genauso: oben 1023, unten 0.

Du könntest die Werte von x und y einfach am seriellen Monitor anzeigen lassen. In dieser Anleitung machst du die Endanschläge stattdessen direkt sichtbar: Für jede Richtung leuchtet eine eigene LED auf.

Aufgabe 1: Position auslesen und LEDs ansteuern

Baue die Schaltung nach dem Schaltplan auf. Die vier LEDs sind im Sketch so festgelegt:

  • LED für den Anschlag „unten“ an Pin 6
  • LED für den Anschlag „oben“ an Pin 7
  • LED für den Anschlag „links“ an Pin 8
  • LED für den Anschlag „rechts“ an Pin 9

Jede LED bekommt einen 220-Ohm-Vorwiderstand. Der Sketch liest nacheinander beide Achsen ein, gibt die Werte am seriellen Monitor aus und schaltet die passende LED, sobald ein Endanschlag erreicht ist.

Prüfe die Pin-Nummern der LEDs gegen deinen eigenen Aufbau. Vertauschst du zwei LEDs, leuchtet die falsche Richtung – kaputtgehen kann dabei nichts.

Schaltplan: Joystick-Modul und vier LEDs am Arduino UNO
Schaltplan für Aufgabe 1: Joystick-Modul und vier LEDs
Aufgabe 1: Joystick auslesen und LEDs ansteuern
int ledUnten = 6;
int ledOben = 7;
int ledLinks = 8;
int ledRechts = 9;
int SensorWert = 0;              // Festlegen der Variablen

void setup()
{
  pinMode(ledUnten, OUTPUT);     // Definieren der LEDs
  pinMode(ledOben, OUTPUT);
  pinMode(ledLinks, OUTPUT);
  pinMode(ledRechts, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  SensorWert = analogRead(A0);   // Auslesen des Wertes an A0. Hier: VRx, X-Achse
  Serial.print("X:");            // Darstellung des Wertes im seriellen Monitor
  Serial.print(SensorWert, DEC); // Darstellung des Wertes als Dezimalzahl

  if (SensorWert > 1010)         // Wenn der Wert größer als 1010 ist, dann ...
  {
    digitalWrite(ledLinks, HIGH);  // ... soll ledLinks leuchten
  }
  if (SensorWert < 1010)         // Wenn der Wert kleiner als 1010 ist, dann ...
  {
    digitalWrite(ledLinks, LOW);   // ... soll ledLinks nicht mehr leuchten
  }
  if (SensorWert < 20)           // Wenn der Wert kleiner als 20 ist, dann ...
  {
    digitalWrite(ledRechts, HIGH); // ... soll ledRechts leuchten
  }
  if (SensorWert > 20)           // Wenn der Wert größer als 20 ist, dann ...
  {
    digitalWrite(ledRechts, LOW);  // ... soll ledRechts nicht mehr leuchten
  }

  SensorWert = analogRead(A1);   // Auslesen des Wertes an A1. Hier: VRy, Y-Achse
  Serial.print(" |Y:");
  Serial.println(SensorWert, DEC);

  if (SensorWert > 1010)         // Wenn der Wert größer als 1010 ist, dann ...
  {
    digitalWrite(ledOben, HIGH);   // ... soll ledOben leuchten
  }
  if (SensorWert < 1010)         // Wenn der Wert kleiner als 1010 ist, dann ...
  {
    digitalWrite(ledOben, LOW);    // ... soll ledOben nicht mehr leuchten
  }
  if (SensorWert > 20)           // Wenn der Wert größer als 20 ist, dann ...
  {
    digitalWrite(ledUnten, LOW);   // ... soll ledUnten nicht leuchten
  }
  if (SensorWert < 20)           // Wenn der Wert kleiner als 20 ist, dann ...
  {
    digitalWrite(ledUnten, HIGH);  // ... soll ledUnten leuchten
  }
}

Aufgabe 2: Den Taster auslesen und einen Ton ausgeben

Das Joystick-Modul hat einen eingebauten Taster, den du auslöst, indem du senkrecht auf den Joystick drückst. Seinen Zustand liest du jetzt aus und gibst ihn als Ton aus. Dazu schließt du zusätzlich einen Piezo-Speaker an Pin 5 an.

Eine Besonderheit des Moduls: Am Pin SW liegen dauerhaft etwa 2 Volt an. Sobald du den Taster drückst, liegt dort keine Spannung mehr an (GND). Deshalb lässt sich der Taster nicht an einem digitalen Pin auslesen – 2 Volt reichen dem Arduino im unbetätigten Zustand nicht als klares HIGH-Signal.

Den Pin SW schließt du deshalb am analogen Pin A2 an. Drückst du den Taster, registriert der Mikrocontroller den Wert 0. Unbetätigt liegt der Wert bei etwa 400 – das entspricht den rund 2 Volt.

Den Sketch aus Aufgabe 1 erweiterst du dazu um eine if/else-Bedingung (wenn … dann … sonst …).

Schaltplan: Joystick-Modul, vier LEDs und Piezo-Speaker am Arduino UNO
Schaltplan für Aufgabe 2: zusätzlich mit Piezo-Speaker an Pin 5
Aufgabe 2: zusätzlich den Taster auslesen und einen Ton ausgeben
int piezo = 5;                   // Der Piezo-Speaker wird an Pin 5 angeschlossen
int ledUnten = 6;
int ledOben = 7;
int ledLinks = 8;
int ledRechts = 9;
int SensorWert = 0;              // Festlegen der Variablen

void setup()
{
  pinMode(piezo, OUTPUT);        // Definieren des Speakers als Ausgang
  pinMode(ledUnten, OUTPUT);     // Definieren der LEDs
  pinMode(ledOben, OUTPUT);
  pinMode(ledLinks, OUTPUT);
  pinMode(ledRechts, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  SensorWert = analogRead(A0);   // Auslesen des Wertes an A0. Hier: VRx, X-Achse
  Serial.print("X:");            // Darstellung des Wertes im seriellen Monitor
  Serial.print(SensorWert, DEC); // Darstellung des Wertes als Dezimalzahl

  if (SensorWert > 1010)         // Wenn der Wert größer als 1010 ist, dann ...
  {
    digitalWrite(ledLinks, HIGH);  // ... soll ledLinks leuchten
  }
  if (SensorWert < 1010)         // Wenn der Wert kleiner als 1010 ist, dann ...
  {
    digitalWrite(ledLinks, LOW);   // ... soll ledLinks nicht mehr leuchten
  }
  if (SensorWert < 20)           // Wenn der Wert kleiner als 20 ist, dann ...
  {
    digitalWrite(ledRechts, HIGH); // ... soll ledRechts leuchten
  }
  if (SensorWert > 20)           // Wenn der Wert größer als 20 ist, dann ...
  {
    digitalWrite(ledRechts, LOW);  // ... soll ledRechts nicht mehr leuchten
  }

  SensorWert = analogRead(A1);   // Auslesen des Wertes an A1. Hier: VRy, Y-Achse
  Serial.print(" |Y:");
  Serial.print(SensorWert, DEC);

  if (SensorWert > 1010)         // Wenn der Wert größer als 1010 ist, dann ...
  {
    digitalWrite(ledOben, HIGH);   // ... soll ledOben leuchten
  }
  if (SensorWert < 1010)         // Wenn der Wert kleiner als 1010 ist, dann ...
  {
    digitalWrite(ledOben, LOW);    // ... soll ledOben nicht mehr leuchten
  }
  if (SensorWert > 20)           // Wenn der Wert größer als 20 ist, dann ...
  {
    digitalWrite(ledUnten, LOW);   // ... soll ledUnten nicht leuchten
  }
  if (SensorWert < 20)           // Wenn der Wert kleiner als 20 ist, dann ...
  {
    digitalWrite(ledUnten, HIGH);  // ... soll ledUnten leuchten
  }

  SensorWert = analogRead(A2);   // Auslesen des Wertes an A2. Hier: SW, der Taster
  Serial.print(" |Taster:");
  Serial.println(SensorWert, DEC);

  if (SensorWert < 20)           // Wenn der Wert kleiner als 20 ist, dann ...
  {
    digitalWrite(piezo, HIGH);     // ... soll der Speaker angesteuert werden ...
  }
  else                           // ... ist die Bedingung nicht erfüllt, ...
  {
    digitalWrite(piezo, LOW);      // ... soll der Speaker wieder ausgeschaltet werden
  }
}
Anleitung bewerten

Kommentare

Frage stellen oder Erfahrung teilen

Schreib uns, wenn etwas nicht funktioniert. Nenne dabei dein Board und die Fehlermeldung.

Wir prüfen jeden Kommentar vor der Veröffentlichung. Deine E-Mail-Adresse bleibt bei uns.