Joystick

Joystick
Joysticks komen van pas bij allerlei spelletjes. Met een Joystick kun je een richting aangeven (naar boven, beneden, links, rechts, of als je dat liever zegt: noord, oost, zuid, west). In werkelijkheid wordt de richting bepaalt door hoe de Joystick is aangebracht. Je kunt op de knop van de joystick drukken om een keuze te bevestigen.
Je kunt ook nagaan hoe ver de knop naar een bepaalde kant is gedrukt.
Sluit bij dit type VCC en GND maar 1 keer aan
De uitlezing van de Joystick is eenvoudig: de drukknop lees je uit als elke andere drukknop, via een digitale invoer pin; de richting via twee analoge invoer pinnen. Als we bijvoorbeeld de links-rechts beweging nemen, dan zal de analoge uitlezing 0 zijn als de knop helemaal links is, 511 in de middenstand en 1023 als de knop helemaal rechts is. Hierbij ga ik ervan uit dat je de Joystick hebt aangesloten op VCC-uitgang van je Arduino - of je een 3,3 V of een 5 V Arduino hebt maakt dan niet uit. In het voorbeeldprogramma laat ik zien hoe je alleen een waarde uitleest als de Joystick bewogen is. Dat is nog lastig, omdat je niet elke trilling wilt waarnemen. Om dit tegen te gaan heb ik een marge heb ingebouwd.
Voorbeeldprogramma:
Uitvoer van het testprogramma
#define knop 2   // Sluit de drukknop aan op pin 2,
#define vert A0  // boven-beneden op A0
#define hor  A1  // en links-rechts op A1
#define marge 20 // Marge voor de bewegingsdetectie

void setup() {
  Serial.begin(9600);
  pinMode(knop, INPUT_PULLUP);
}

int oudHorizontaal = 0, oudVerticaal = 0;
void loop() {
  int waarde = analogRead(vert);
  if ( abs(waarde - oudVerticaal) > marge ) {
    oudVerticaal = waarde;
    if (waarde > 511 + marge) {
      Serial.print( 100.0 / 512 * (waarde - 511), 0 );
      Serial.println( "% naar boven" );
    }
    else if (waarde < 511 - marge) {
      Serial.print( 100.0 / 512 * (511 - waarde), 0 );
      Serial.println( "% naar beneden" );
    }
  }
  waarde = analogRead(hor);
  if (abs(waarde - oudHorizontaal) > marge) {
    oudHorizontaal = waarde;
    if (waarde > 511 + marge) {
      Serial.print( 100.0 / 512 * (waarde - 511), 0 );
      Serial.println( "% naar links" );
    }
    else if (waarde < 511 - marge) {
      Serial.print( 100.0 / 512 * (511 - waarde), 0 );
      Serial.println( "% naar rechts" );
    }
  }
  if ( !digitalRead(knop) ) Serial.println("De knop werd ingedrukt");
  delay(200);
}