Bekijk de 38 andere Arduino lessen

8 · Analoge PS2 joystick met drukknop


Introductie

In deze Nederlandstalige Arduino tutorial voor beginners leer ik je hoe je een analoge Playstation 2 joystick kunt uitlezen en de richting samen met de drukknop kunt weergeven op de seriële monitor. 😃

Lesmateriaal

Onderaan op deze pagina vind je de knop lesmateriaal waarmee je het lesmateriaal kunt downloaden. Dit materiaal bestaat uit de code, schakelschema en andere bestanden die in de les worden gebruikt.

Analoge Playstation 2 joystick

In deze les maken we gebruik van de analoge PS2 joystick Deze joystick kun je traploos alle kanten op bewegen. Dit houdt in dat je ook kunt meten hoe ver de joystick in een bepaalde richting wordt gedrukt.

De joystick is analoog. Dit houdt in dat hij niet alleen de richting kan meten, maar ook hoe ver je in een bepaalde richting drukt.

Analoge Playstation 2 joystick
Analoge Playstation 2 joystick

Als je de joystick recht naar beneden drukt kun je een drukknop activeren. Dit kan handig zijn om bijvoorbeeld een keuze in een menu te bevestigen. Als je naar de zijkant van de joystick kijkt kun je de schakelaar zien zitten.

Analoge Playstation 2 joystick
Joystick schakelaar

De joystick heeft 5 gemarkeerde pins:

  • GND is de aarde (Ground)
  • +5V is de 5V
  • VRx is de analoge x-as (Variable Voltage x-axis)
  • VRy is de analoge y-as (Variable Voltage y-axis)
  • SW is de drukknop (Switch)

De schakeling

Analoge Playstation 2 joystick aangesloten op de Arduino
Analoge joystick aangesloten op de Arduino

Druk de joystick in het breadboard en sluit de volgende jumper wires aan:

  • De GND op de Arduino -> de GND pin van de joystick
  • De 5V op de Arduino -> de +5V pin van de joystick
  • De 12 op de Arduino -> de SW pin van de joystick
  • De A0 op de Arduino -> de VRy pin van de joystick
  • De A5 op de Arduino -> de VRx pin van de joystick

Arduino Code

We beginnen de code met het definiëren van drie constanten voor de pin nummers:

1 const int swPin = 12;
2 const int VrxPin = A5;
3 const int VryPin = A0;
  • swPin is de pin waarop we de drukknop hebben aangesloten
  • VrxPin is de pin waarop we de x-as hebben aangesloten
  • VryPin is de pin waarop we de y-as hebben aangesloten

Hierna definiëren we nog drie variabelen om de uitgelezen waarden van de assen en de drukknop in op te slaan:

1 int xDirection = 0;
2 int yDirection = 0;
3 int switchState = 1;

setup()

1 void setup() {
2   Serial.begin(9600);
3   pinMode(swPin, INPUT);
4   digitalWrite(swPin, HIGH);
5 }

Als eerste initialiseren we de seriële monitor. Daarna stellen we de swPin in als invoer en maken deze HIGH. De drukknop is altijd HIGH en LOW zodra de knop wordt ingedrukt.

loop()

De loop() functie bestaat uit 3 delen die hieronder verder staan uitgelegd.

1 // Herhaal oneindig
2 void loop() {
3   xDirection = analogRead(VryPin);
4   yDirection = analogRead(VrxPin);
5 
6   switchState = digitalRead(swPin);
7 
8   Serial.print("Schakelaar:  ");
9   Serial.println(switchState);
10 
11   Serial.print("X-as:        ");
12   Serial.println(xDirection);
13 
14   Serial.print("Y-as:        ");
15   Serial.println(yDirection);
16 
17   Serial.println("");
18 
19   if (!switchState) {
20       Serial.println("Schakelaar ingedrukt");
21   }
22 
23   if (xDirection < 480) {
24       Serial.println("Links");
25   } else if (xDirection > 520) {
26       Serial.println("Rechts");
27   }
28 
29   if (yDirection < 480) {
30       Serial.println("Omlaag");
31   } else if (yDirection > 520) {
32       Serial.println("Omhoog");
33   }
34 
35   delay(500);               
36 }

Waarden uitlezen en printen

We beginnen met het analoog uitlezen van de analoge waarden van de x en y-as.

1 xDirection = analogRead(VryPin);
2 yDirection = analogRead(VrxPin);

Hierna lezen we digitaal de drukknop uit. We gebruiken hier digitalRead() omdat deze drukknop maar twee mogelijkheden heeft: ingedrukt of niet ingedrukt.

1 switchState = digitalRead(swPin);

Vervolgens printen we alle uitgelezen waarden naar de seriële monitor:

1 Serial.print("Schakelaar:  ");
2 Serial.println(switchState);
3 
4 Serial.print("X-as:        ");
5 Serial.println(xDirection);
6 
7 Serial.print("Y-as:        ");
8 Serial.println(yDirection);
9 
10 Serial.println("");

Joystick drukknop omzetten naar tekst

Hierna gaan we de uitgelezen waarden onzetten naar tekst. We beginnen met de drukknop.

1 if (!switchState) {
2     Serial.println("Schakelaar ingedrukt");
3 }

De drukknop werkt in spiegelbeeld van wat je wellicht denkt. Als je hem indrukt wordt the waarde LOW. Om deze reden maken we gebruik van de !. Dit is de logische NOT. Eigenlijk zeggen we: Als de schakelaar niet HIGH is dan print je de tekst.

🎓 Kun je deze if zo schrijven dat we de ! niet nodig hebben maar

1 if (switchState) {

kunnen gebruiken?

Joystick richting omzetten naar tekst

De analoge waarden op de Arduino lopen van 0 tot 1023. Het midden zou dus precies op 512 moeten liggen.

1 if (xDirection < 480) {
2     Serial.println("Links");
3 } else if (xDirection > 520) {
4     Serial.println("Rechts");
5 }

In de code zien we dat het stuk tussen de 480 en 520 als het midden wordt gezien. Dit komt omdat de analoge waarden niet super precies zijn. Het kan dus prima dat bij jouw joystick het midden een waarde van 490 geeft. We nemen dus expres een beetje marge voordat we zeggen dat de joystick naar links of naar rechts staat.

1 if (yDirection < 480) {
2     Serial.println("Omlaag");
3 } else if (yDirection > 520) {
4     Serial.println("Omhoog");
5 }

Voor de y-as doen we precies hetzelfde alleen nu voor de yDirection variabele.

Code uploaden naar Arduino

Ons programma is nu klaar om naar de Arduino te worden gestuurd. Open hierna de seriële monitor:

Hulpmiddelen ▸ Seriële monitor

Uitgelezen joystick waarden op de seriële monitor
Uitgelezen joystick waarden op de seriële monitor

Beweeg nu met de joystick en druk op de bovenkant. Als het goed is zie je de richting en de staat van de drukkop op je seriële monitor.

8 &middot; Analoge PS2 joystick met drukknop schakelschema

Bas van Dijk

Over Bas on Tech


Mijn naam is Bas van Dijk, ondernemer, freelance frontend developer en maker. Onder de naam "Bas on Tech" bied ik op YouTube videolessen aan over technische onderwerpen zoals Arduino en 3D-printen.

De video’s zijn in het Nederlands met ondertiteling, zodat mensen met een gehoorbeperking ze ook kunnen volgen.

Jaren geleden toen ik mijn eerste Arduino kocht had ik maar één doel: zo snel mogelijk een LCD schermpje aansluiten en er een tekst op laten zien. Na allerlei bronnen te hebben geraadpleegd kwam ik er na veel puzzelen eindelijk uit. Ik was als een kind zo blij met die paar letters op een geel schermpje.

Met Bas on Tech wil ik mijn kennis delen zodat ook anderen deze blijheid kunnen ervaren. Ik heb gekozen voor kort en krachtige YouTube video’s, met een duidelijke vaste opbouw en één onderwerp per video. Daarnaast staan onder elke video links naar de broncode en webshops waar de onderdelen te koop zijn.