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!
PS. 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.
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.