Ik vind het belangrijk dat Bas on Tech door iedereen kosteloos gebruikt kan worden.
Help mij de toekomst van Bas on Tech te verzekeren. Je donatie zal o.a. worden gebruikt voor hosting, video's en onderhoud.
Alvast bedankt!
iDEAL en Bancontact vind je onder het "Direct Debit" tabblad in de 4e stap.
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. 😃
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.
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.
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.
De joystick heeft 5 gemarkeerde pins:
GND is de aarde (Ground)+5V is de 5VVRx is de analoge x-as (Variable Voltage x-axis)VRy is de analoge y-as (Variable Voltage y-axis)SW is de drukknop (Switch)
Druk de joystick in het breadboard en sluit de volgende jumper wires aan:
GND op de Arduino -> de GND pin van de joystick5V op de Arduino -> de +5V pin van de joystick12 op de Arduino -> de SW pin van de joystickA0 op de Arduino -> de VRy pin van de joystickA5 op de Arduino -> de VRx pin van de joystickWe 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 aangeslotenVrxPin is de pin waarop we de x-as hebben aangeslotenVryPin is de pin waarop we de y-as hebben aangeslotenHierna 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;
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.
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 }
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("");
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?
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.
Ons programma is nu klaar om naar de Arduino te worden gestuurd. Open hierna 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.