Arduino - Joystick

In deze handleiding leren we hoe u een joystick gebruikt met Arduino. We behandelen in detail:

Joystick Pinout

Hardware Benodigd

1×Arduino Uno R3
1×USB 2.0 kabel type A/B
1×Joystick
1×Jumper wires (verbindingsdraadjes)
1×(Aanbevolen) Schroefklem Block Shield voor Arduino Uno
1×(Aanbevolen) Breadboard-Shield voor Arduino Uno
1×(Aanbevolen) Behuizing voor Arduino Uno
1×(Aanbevolen) Prototyping Basisplaat & Breadboard Kit voor Arduino Uno

Of u kunt de volgende kits kopen:

1×DIYables Sensorkit (30 sensoren/displays)
1×DIYables Sensorkit (18 sensoren/displays)
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

Over de Joystick Sensor

U heeft waarschijnlijk een joystick gezien in bijvoorbeeld een gamecontroller, speelgoedcontroller, of zelfs in grote machines zoals een graafmachinebesturing.

De joystick bestaat uit twee potentiometers die loodrecht op elkaar staan en één drukknop. Daarom levert hij de volgende outputs:

  • Een analoge waarde (van 0 tot 1023) die overeenkomt met de horizontale positie (X-coördinaat genoemd)
  • Een analoge waarde (van 0 tot 1023) die overeenkomt met de verticale positie (Y-coördinaat genoemd)
  • Een digitale waarde van een drukknop (HIGH of LOW)

De combinatie van de twee analoge waarden kan 2D-coördinaten creëren waarbij de middenstand de rustpositie aangeeft. De werkelijke richting van de coördinaten is eenvoudig te identificeren bij het uitvoeren van een testcode (in het volgende gedeelte).

Sommige toepassingen gebruiken alle drie de outputs, andere slechts een deel daarvan.

Pinout

Een joystick heeft 5 pennen:

  • GND pin: moet worden verbonden met GND (0V)
  • VCC pin: moet worden verbonden met VCC (5V)
  • VRX pin: geeft een analoge waarde die overeenkomt met de horizontale positie (X-coördinaat)
  • VRY pin: geeft een analoge waarde die overeenkomt met de verticale positie (Y-coördinaat)
  • SW pin: is de output van de drukknop in de joystick. Deze is normaal open. Als u een pull-up weerstand gebruikt op deze pin, is de SW-pin HIGH wanneer niet ingedrukt en LOW wanneer ingedrukt.
Joystick Pinout

Hoe Werkt Het

  • Wanneer u de joystickhendel naar links of rechts duwt, verandert de spanning op de VRX-pin. Het spanningsbereik is van 0 tot 5V (0 aan de linkerkant en 5V aan de rechterkant). De spanning is evenredig met de positie van de hendel ⇒ de uitleeswaarde op de analoge pin van Arduino ligt tussen 0 en 1023
  • Wanneer u de joystickhendel naar boven of beneden duwt, verandert de spanning op de VRY-pin. Het spanningsbereik is van 0 tot 5V (0 boven en 5V onder). De spanning is evenredig met de positie van de hendel ⇒ de uitleeswaarde op de analoge pin van Arduino ligt tussen 0 en 1023
  • Wanneer u de joystickhendel in elke richting beweegt, veranderen de spanningen op zowel VRX als VRY proportioneel met de projectie van de positie op elke as
  • Wanneer u de joystickhendel van boven naar beneden indrukt, sluit de drukknop binnenin de joystick. Als u een pull-up weerstand gebruikt op de SW-pin, verandert de uitgang op SW van 5V naar 0V ⇒ de uitleeswaarde op de digitale pin van Arduino verandert van HIGH naar LOW

Aansluitschema

Arduino Joystick Aansluitschema

This image is created using Fritzing. Click to enlarge image

Hoe Te Programmeren Voor Joystick

De joystick bestaat uit twee delen: analoog (X- en Y-as) en digitaal (drukknop)

  • Voor het analoge deel (X, Y as) hoeft u alleen maar de waarde van de analoge ingang te lezen met de functie analogRead().
int xValue = analogRead(A1); int yValue = analogRead(A0);
  • Voor het digitale deel (drukknop): dit is een knop. De eenvoudigste en handigste manier is het gebruik van de ezButton library. Deze bibliotheek ondersteunt debounce voor knoppen en activeert ook een interne pull-up weerstand. Meer over knoppen vindt u in de Arduino - Button tutorial. De bijbehorende code wordt in de volgende paragraaf van deze handleiding gepresenteerd.

Na het uitlezen van de analoge waarden kan het nodig zijn deze om te zetten naar aanstuurbare waarden. Het volgende deel bevat voorbeeldcodes hiervoor.

Arduino Code

Deze sectie geeft de volgende voorbeelden van Arduino-code:

  • Voorbeeldcode: leest analoge waarden van de joystick
  • Voorbeeldcode: leest analoge waarden en de knopstatus van de joystick
  • Voorbeeldcode: zet analoge waarden om naar MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN commando’s
  • Voorbeeldcode: zet analoge waarden om naar hoeken voor aansturing van twee servo motoren (bijvoorbeeld in een pan-tilt camera)

Leest analoge waarden van joystick

/* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino/arduino-joystick */ #define VRX_PIN A1 // Arduino pin connected to VRX pin #define VRY_PIN A0 // Arduino pin connected to VRY pin int xValue = 0; // To store value of the X axis int yValue = 0; // To store value of the Y axis void setup() { Serial.begin(9600) ; } void loop() { // read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN); // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(xValue); Serial.print(", y = "); Serial.println(yValue); delay(200); }

Snelstart

  • Kopieer bovenstaande code en open deze met de Arduino IDE
  • Klik op de knop Upload in de Arduino IDE om de code op de Arduino te laden
  • Beweeg de joystickhendel maximaal naar de uiterste positie en draai deze vervolgens in een cirkel (met of tegen de klok in)
  • Bekijk het resultaat in de Seriële Monitor
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Houd tijdens het draaien van de joystickhendel de Seriële Monitor in de gaten
    • Als de X-waarde 0 is, noteer of onthoud dan deze positie als links ⇒ de tegenovergestelde richting is rechts
    • Als de Y-waarde 0 is, noteer of onthoud dan deze positie als boven ⇒ de tegenovergestelde richting is onder

    Leest analoge waarden en knopstatus van joystick

    /* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino/arduino-joystick */ #include <ezButton.h> #define VRX_PIN A1 // Arduino pin connected to VRX pin #define VRY_PIN A0 // Arduino pin connected to VRY pin #define SW_PIN 2 // Arduino pin connected to SW pin ezButton button(SW_PIN); int xValue = 0; // To store value of the X axis int yValue = 0; // To store value of the Y axis int bValue = 0; // To store value of the button void setup() { Serial.begin(9600) ; button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first // read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN); // Read the button value bValue = button.getState(); if (button.isPressed()) { Serial.println("The button is pressed"); // TODO do something here } if (button.isReleased()) { Serial.println("The button is released"); // TODO do something here } // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(xValue); Serial.print(", y = "); Serial.print(yValue); Serial.print(" : button = "); Serial.println(bValue); }

    Snelstart

    • Ga naar het icoon Libraries in de zijbalk van de Arduino IDE
    • Zoek op “ezButton” en vind de button library van ArduinoGetStarted.com
    • Klik op de knop Install om de ezButton-bibliotheek te installeren
    Arduino button library
    • Kopieer bovenstaande code en open deze met de Arduino IDE
    • Klik op de knop Upload in Arduino IDE om de code in de Arduino te plaatsen
    • Druk de joystickhendel naar links/rechts/boven/beneden
    • Druk de joystickhendel naar beneden (indrukken knop)
    • Bekijk het resultaat in de Seriële Monitor
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    Zet analoge waarde om naar commando’s MOVE LEFT/RIGHT/UP/DOWN

    /* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino/arduino-joystick */ #define VRX_PIN A1 // Arduino pin connected to VRX pin #define VRY_PIN A0 // Arduino pin connected to VRY pin #define LEFT_THRESHOLD 400 #define RIGHT_THRESHOLD 800 #define UP_THRESHOLD 400 #define DOWN_THRESHOLD 800 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 int xValue = 0 ; // To store value of the X axis int yValue = 0 ; // To store value of the Y axis int command = COMMAND_NO; void setup() { Serial.begin(9600) ; } void loop() { // read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN); // converts the analog value to commands // reset commands command = COMMAND_NO; // check left/right commands if (xValue < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (xValue > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // check up/down commands if (yValue < UP_THRESHOLD) command = command | COMMAND_UP; else if (yValue > DOWN_THRESHOLD) command = command | COMMAND_DOWN; // NOTE: AT A TIME, THERE MAY BE NO COMMAND, ONE COMMAND OR TWO COMMANDS // print command to serial and process command if (command & COMMAND_LEFT) { Serial.println("COMMAND LEFT"); // TODO: add your task here } if (command & COMMAND_RIGHT) { Serial.println("COMMAND RIGHT"); // TODO: add your task here } if (command & COMMAND_UP) { Serial.println("COMMAND UP"); // TODO: add your task here } if (command & COMMAND_DOWN) { Serial.println("COMMAND DOWN"); // TODO: add your task here } }

    Snelstart

    • Kopieer bovenstaande code en open met Arduino IDE
    • Klik op de knop Upload om de code op Arduino te plaatsen
    • Beweeg de joystickhendel naar links/rechts/boven/beneden of een willekeurige richting
    • Bekijk het resultaat in de Seriële Monitor
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ Notiz:

    Tegelijkertijd kan er geen, één of twee commando’s actief zijn (bijvoorbeeld UP en LEFT tegelijk).

    Zet analoge waarden om naar hoeken voor aansturing van twee servo motoren

    De details vindt u in de tutorial Arduino - Joystick controls Servo Motor

Video Tutorial

We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en helpt u stap voor stap.

Reacties

Gerelateerde Tutorials

※ ONZE BERICHTEN

  • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!