Nr.22 – Joystick Modul am Arduino

Aufgabe 22.1 : Position des Joystick Moduls auslesen und LEDs ansteuern

Material: Arduino / vier Leuchtdioden / Breadboard / Kabel (Materialbeschaffung: www.funduinoshop.com)

In dieser Aufgabe möchten wir die Position des Joystick Moduls mit einem Arduino Mikrocontroller auslesen. Die Messwerte werden genutzt, um LEDs anzusteuern.

Auf den ersten Blick fällt auf, dass das Modul fünf Anschlüsse(Pins) besitzt.

GND – Ground Pin, anzuschließen an den GND Pin des Arduinos.
+5V – Pin für die Stromversorgung, anzuschließen am 5V Pin des Arduinos.
VRx – Pin für die X-Achse des Joystick Moduls, anzuschließen am Pin A0.
VRy – Pin für die Y-Achse des Joystick Moduls, anzuschließen am PIN A1.
SW – Pin für den sogenannten „Switch“. Der Pin wird in diesem Sketch nicht verwendet. Das Joystickmodul besitzt einen Taster, der durch einen Druck senkrecht auf den Joystick aktiviert wird.

Das Joystick Modul besitzt an der X- und Y-Achse ein herkömmliches Potentiometer. Je nach Position des Joysticks  variiert die Ausgangsspannung für beide Achsen (also an den Pins VRx und VRy) zwischen 0V und 5V. Diese Spannung wird über die analogen Eingänge des Arduino Mikrocontrollers ausgelesen und verarbeitet. Dementsprechend speichert der Mikrocontroller die Lage des Joysticks als Zahlenwert zwischen 0 – 1023 ab.

Wenn man das Modul an den Endanschlag auf der linken Seite bewegt, so registriert der Mikrocontroller den Zahlenwert 1023 auf der X-Achse.
Bewegt man den Joystick nun auf die andere Seite, so registriert der Mikrocontroller den Zahlenwert 0 auf der X-Achse.
Ähnlich verhält es sich bei den Anschlägen oben (1023) und unten (0) auf der Y-Achse.

Um die Funktion des Joystickmoduls zu prüfen könnten die Werte von X und Y über den seriellen Monitor angezeigt werden. In diesem Beispiel werden wir jedoch die Endanschläge von X- und Y-Achse direkt durch das Aufleuchten von je einer LED visualisieren.

In unserem Sketch definieren wir die LEDs wie folgt :

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

Der Sketch :

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, der an A0 anliegt. 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 größer als 20 ist, dann...
                 {
                  digitalWrite(ledRechts, HIGH); // ...soll ledRechts leuchten
                 }
             
             if (SensorWert > 20)  // Wenn der Wert kleiner als 20 ist, dann...
                 {
                  digitalWrite(ledRechts, LOW); // ...soll ledRechts nicht mehr leuchten
                 }
       
      
       SensorWert = analogRead(1); // Auslesen des Wertes, der an A1 anliegt. 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 leuchten
                 }
             
             if (SensorWert < 20) // Wenn der Wert kleiner als 20 ist, dann...
                 {  
                  digitalWrite(ledUnten, HIGH); // ...soll ledUnten nicht mehr leuchten
                 } 
}

Aufgabe 22.2 : Position des Joystick Moduls auslesen und LEDs ansteuern. Zusätzlich soll durch die Betätigung des integrierten Tasters ein Ton erzeugt werden.

Material: Arduino / vier Leuchtdioden / Breadboard / Kabel / Piezospeaker (Materialbeschaffung: www.funduinoshop.com)

Das Joystick Modul besitzt einen integrierten Taster, der durch einen Druck senkrecht auf den Joystick aktiviert wird. Den Status des Tasters (An / Aus) möchten wir nun auslesen und in Form einer Tonausgabe darstellen. Dazu schließen wir zusätzlich einen Piezospeaker am Pin 5 des Arduino Mikrocontrollers an.

Eine Besonderheit des Joystickmoduls liegt darin, dass es permanent eine Spannung von ca. 2V an dem Pin „SW“ ausgibt. Sobald der Taster gedrückt wird, liegt auf dem Pin „SW“ keine Spannung mehr an (GND). Aus diesem Grund kann der Taster nicht mit einem digitalen Pin ausgelesen werden, da hierfür die Spannung von 2V im unbetätigten Zustand nicht ausreicht.

Den Ausgabe-Pin des Tasters am Joystickmodul (Pin SW) schließen wir am analogen Pin A2 des Arduino Mikrocontrollers an. Betätigt man nun den Taster, registriert der Mikrocontroller den Zahlenwert 0. Im unbetätigten Zustand beträgt dieser Wert ca. 400, welches der dauerhaften Ausgangsspannung von ca. 2V entspricht.

Der vorhergehende Sketch wird nun durch eine if/else (wenn…dann/sonst…) Bedingung erweitert.

Der Sketch :

int piezo=5; // Hier wird festgelegt, dass der Piezospeaker an Pin 5 angeschlossen wird
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(0);   // Auslesen des Wertes, der an A0 anliegt. 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 größer als 20 ist, dann...
                 {
                  digitalWrite(ledRechts, HIGH); // ...soll ledRechts leuchten
                 }
             
             if (SensorWert > 20)  // Wenn der Wert kleiner als 20 ist, dann...
                 {
                  digitalWrite(ledRechts, LOW); // ...soll ledRechts nicht mehr leuchten
                 }
       
      
       SensorWert = analogRead(1); // Auslesen des Wertes, der an A1 anliegt. 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 leuchten
                 }
             
             if (SensorWert < 20) // Wenn der Wert kleiner als 20 ist, dann...
                 {  
                  digitalWrite(ledUnten, HIGH); // ...soll ledUnten nicht mehr leuchten
                 } 
          

         SensorWert = analogRead(2);  // Auslesen des Wertes, der an A2 anliegt. Hier : Switch(Taster) des Joystick Moduls

         Serial.print(" |Taster:");
         Serial.println(SensorWert,DEC);
         
         if (SensorWert < 20)  // Wenn der Wert kleiner als 20 ist, dann...

         {
          digitalWrite(piezo,HIGH); // ...soll ein Ton ausgegeben werden...
         }

         else   // ...sollte die Bedingung (Sensorwert kleiner 20) nicht erfüllt sein...
         {
          digitalWrite(piezo,LOW); // ...soll der Ton nicht mehr ausgegeben werden
         }
           
}