ESP32 - Joystick

In deze tutorial leren we hoe u een Joystick kunt gebruiken met de ESP32. We gaan in detail leren:

Joystick Pinout

Hardware Benodigd

1×ESP32 ESP-WROOM-32 Ontwikkelingsmodule
1×USB Kabel Type-C
1×Joystick
1×Breadboard (experimenteerprint)
1×Jumperdraden
1×(Optioneel) DC Voedingsconnector
1×(Aanbevolen) Schroefklem Uitbreidingsboard voor ESP32
1×(Aanbevolen) Breakout Expansion Board for ESP32
1×(Aanbevolen) Stromsplitter voor ESP32

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 bent waarschijnlijk wel eens een Joystick tegengekomen, bijvoorbeeld in een game controller, speelgoedbesturing of zelfs in een grote machine zoals een graafmachinebesturing.

De joystick bestaat uit twee potentiometers die haaks op elkaar staan, en een drukknop. Daarom levert hij de volgende outputs:

  • Een analoge waarde (van 0 tot 4095) gerelateerd aan de horizontale positie (genoemd X-coördinaat)
  • Een analoge waarde (van 0 tot 4095) gerelateerd aan de verticale positie (genoemd Y-coördinaat)
  • Een digitale waarde van een drukknop (HIGH of LOW)

De combinatie van twee analoge waarden kan 2D-coördinaten creëren waarbij het midden de rustpositie van de joystick representeert. De werkelijke richting van de coördinaten is eenvoudig te bepalen als u de testcode runt (in het volgende gedeelte).

Sommige toepassingen gebruiken alle drie outputs, andere alleen een deel ervan.

Pinout

Een Joystick heeft 5 pinnen:

  • GND pin: moet verbonden worden met GND (0V)
  • VCC pin: moet verbonden worden met VCC (5V)
  • VRX pin: geeft een analoge waarde uit die overeenkomt met de horizontale positie (X-coördinaat)
  • VRY pin: geeft een analoge waarde uit 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 SW HIGH als de knop niet ingedrukt is, en LOW als hij wel ingedrukt is.
Joystick Pinout

Hoe het werkt

  • Wanneer u de joystick naar links of rechts beweegt, verandert de spanning op de VRX pin. Het spanningsbereik is 0 tot 5V (0V links en 5V rechts). De spanning is evenredig met de positie van de joystick ⇒ De uitlezing op de analoge pin van de ESP32 ligt tussen 0 en 4095
  • Wanneer u de joystick naar boven of naar beneden beweegt, verandert de spanning op de VRY pin. Het spanningsbereik is 0 tot 5V (0V boven en 5V onder). De spanning is evenredig met de positie van de joystick ⇒ De uitlezing op de analoge pin van de ESP32 ligt tussen 0 en 4095
  • Wanneer u de joystick in een willekeurige richting beweegt, veranderen de spanningen op zowel VRX als VRY volgens de projectie van de positie op elke as
  • Wanneer u de joystick van boven naar beneden indrukt, wordt de interne drukknop gesloten. Als u een pull-up weerstand gebruikt op de SW pin, verandert de uitgang van SW van 5V naar 0V ⇒ De uitlezing op de digitale pin van de ESP32 gaat van HIGH naar LOW

Aansluitschema

ESP32 Joystick Aansluitschema

This image is created using Fritzing. Click to enlarge image

Hoe ESP32 en joystick aansluiten

Hoe te Programmeren voor Joystick

De joystick heeft twee delen: analoog (X, Y as) en digitaal (drukknop)

  • Voor de analoge delen (X, Y as) hoeft u alleen de waarde van de analoge ingang te lezen met de analogRead() functie.
int valueX = analogRead(A0); int valueY = analogRead(A1);
  • Voor het digitale deel (drukknop): het is een knop. De eenvoudigste en praktischste manier is het gebruik van de ezButton library. Deze library ondersteunt ontprikkeling (debounce) en maakt gebruik van een interne pull-up weerstand. Meer info over knoppen vindt u in de ESP32 - Button tutorial. De code wordt in het volgende hoofdstuk aangeboden.

Na het uitlezen van de analoge waardes, kan het nodig zijn deze om te zetten naar bedieningselementen. Het volgende deel bevat voorbeeldcode hiervoor.

ESP32 Code

Dit gedeelte bevat de volgende voorbeeldcodes voor ESP32:

  • Voorbeeldcode: leest analoge waarden van joystick
  • Voorbeeldcode: leest analoge waarden en de knopstatus van joystick
  • Voorbeeldcode: zet analoge waarde om naar MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN commando's
  • Voorbeeldcode: zet analoge waarden om in hoeken voor aansturing van twee servomotoren (bijv. in een pan-tilt camera)

Leest analoge waarden van joystick

/* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-joystick */ #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRY pin int valueX = 0; // to store the X-axis value int valueY = 0; // to store the Y-axis value void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); } void loop() { // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // print data to Serial Monitor on Arduino IDE Serial.print("x = "); Serial.print(valueX); Serial.print(", y = "); Serial.println(valueY); delay(200); }

Snelle Stappen

  • Als dit de eerste keer is dat u ESP32 gebruikt, bekijk dan hoe u de omgeving instelt voor ESP32 in Arduino IDE.
  • Maak de bekabeling zoals op bovenstaande afbeelding.
  • Verbind de ESP32 met uw PC via een micro USB-kabel.
  • Open Arduino IDE op uw PC.
  • Selecteer de juiste ESP32 board (bijv. ESP32 Dev Module) en de COM-poort.
  • Kopieer bovenstaande code en open deze in Arduino IDE.
  • Klik op de Upload knop in Arduino IDE om de code te uploaden naar ESP32.
  • Beweeg de joystick maximaal naar de rand, draai hem dan 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  
  • Terwijl u de joystick draait, kijk naar de Seriële Monitor:
    • Als de X waarde 0 is, merk deze positie dan als links ⇒ de tegenovergestelde richting is rechts
    • Als de Y waarde 0 is, merk deze positie dan als boven ⇒ de tegenovergestelde richting is onder

    U zult merken dat de analoge waarde niet helemaal proportioneel is aan de joystick beweging. Dit komt niet door de joystick zelf, maar door de ADC van de ESP32. Aan het einde van deze tutorial leggen we uit waarom dit gebeurt.

    Leest analoge waarden en de knopstatus van een joystick

    /* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-joystick */ #include <ezButton.h> #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRY pin #define SW_PIN 17 // ESP32 pin GPIO17 connected to SW pin ezButton button(SW_PIN); int valueX = 0; // to store the X-axis value int valueY = 0; // to store the Y-axis value int bValue = 0; // To store value of the button void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = 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(valueX); Serial.print(", y = "); Serial.print(valueY); Serial.print(" : button = "); Serial.println(bValue); }

    Snelle Stappen

    • Klik op het Libraries icoon in de linker balk van Arduino IDE.
    • Zoek op "ezButton" en vind de button library van ArduinoGetStarted.com.
    • Klik op Installeren om de ezButton library te installeren.
    ESP32 button library
    • Kopieer de bovenstaande code en open deze in Arduino IDE.
    • Klik op de Upload knop om de code te uploaden naar ESP32.
    • Beweeg de joystick naar links/rechts/boven/onder.
    • Druk de joystick naar beneden als knop.
    • Bekijk het resultaat op de Seriële Monitor.
    COM6
    Send
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

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

    /* * Deze ESP32 code is ontwikkeld door newbiely.nl * Deze ESP32 code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/esp32/esp32-joystick */ #define VRX_PIN 39 // ESP32 pin GPIO39 (ADC3) connected to VRX pin #define VRY_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRY pin #define LEFT_THRESHOLD 1000 #define RIGHT_THRESHOLD 3000 #define UP_THRESHOLD 1000 #define DOWN_THRESHOLD 3000 #define COMMAND_NO 0x00 #define COMMAND_LEFT 0x01 #define COMMAND_RIGHT 0x02 #define COMMAND_UP 0x04 #define COMMAND_DOWN 0x08 int valueX = 0 ; // to store the X-axis value int valueY = 0 ; // to store the Y-axis value int command = COMMAND_NO; void setup() { Serial.begin(9600); // Set the ADC attenuation to 11 dB (up to ~3.3V input) analogSetAttenuation(ADC_11db); } void loop() { // read X and Y analog values valueX = analogRead(VRX_PIN); valueY = analogRead(VRY_PIN); // converts the analog value to commands // reset commands command = COMMAND_NO; // check left/right commands if (valueX < LEFT_THRESHOLD) command = command | COMMAND_LEFT; else if (valueX > RIGHT_THRESHOLD) command = command | COMMAND_RIGHT; // check up/down commands if (valueY < UP_THRESHOLD) command = command | COMMAND_UP; else if (valueY > 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 } }

    Snelle Stappen

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

    ※ Notiz:

    Er kunnen momenten zijn zonder commando, met één commando of met twee commando's tegelijk (bijvoorbeeld OMHOOG en LINKS tegelijk).

    Zet analoge waarden om in hoeken voor aansturing van twee servomotoren

    De details zijn te vinden in de tutorial ESP32 - Joystick bestuurt Servomotor

    ※ Notiz:

    Deze tutorial gebruikt de analogRead() functie om waarden te lezen van een ADC (Analog-to-Digital Converter) aangesloten op een joystick. De ADC van de ESP32 is geschikt voor projecten die géén hoge nauwkeurigheid vereisen. Voor projecten met precieze metingen geldt:

    • De ADC van de ESP32 is niet perfect nauwkeurig en moet mogelijk worden gekalibreerd voor correcte resultaten. Elke ESP32 board kan iets afwijkend zijn, waardoor u elke individuele ADC moet kalibreren.
    • Kalibreren kan lastig zijn, vooral voor beginners, en levert mogelijk niet altijd perfecte resultaten op.

    Voor projecten met hoge precisie kunt u overwegen een externe ADC te gebruiken (bijv. ADS1115) met de ESP32, of een Arduino die over een betrouwbaardere ADC beschikt. Wilt u de ADC van de ESP32 toch kalibreren, raadpleeg dan de ESP32 ADC Calibratie Driver

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 de stappen beter te begrijpen.

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!