ESP32 - Joystick

Dans ce tutoriel, nous allons apprendre à utiliser un joystick avec l'ESP32. En détail, nous apprendrons :

Brochage du joystick

Préparation du matériel

1×ESP-WROOM-32 Dev Module
1×USB Cable Type-C
1×Joystick
1×Breadboard
1×Jumper Wires
1×(Optional) DC Power Jack
1×(Recommended) ESP32 Screw Terminal Adapter

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos du capteur de joystick

Vous voyez probablement le joystick quelque part, comme une manette de jeu, une commande de jouet, ou même sur une grande machine réelle comme une commande d'excavatrice.

Le joystick est composé de deux potentiomètres perpendiculaires l'un à l'autre, et d'un bouton-poussoir. Par conséquent, il fournit les sorties suivantes :

  • Une valeur analogique (de 0 à 4095) correspondant à la position horizontale (appelée coordonnée X)
  • Une valeur analogique (de 0 à 4095) correspondant à la position verticale (appelée coordonnée Y)
  • Une valeur numérique d'un bouton-poussoir (HAUT ou BAS)

La combinaison de deux valeurs analogiques peut créer des coordonnées 2D dont les valeurs centrales correspondent à la position de repos du joystick. La direction réelle des coordonnées peut être simplement identifiée lorsque vous exécutez un code de test (dans la partie suivante).

Certaines applications peuvent utiliser les trois sorties, d'autres peuvent en utiliser certaines parmi les trois.

Brochage

Un joystick a 5 broches :

  • Broche GND : doit être connectée à GND (0V)
  • Broche VCC : doit être connectée à VCC (5V)
  • Broche VRX : fournit une valeur analogique correspondant à la position horizontale (appelée coordonnée X).
  • Broche VRY : fournit une valeur analogique correspondant à la position verticale (appelée coordonnée Y).
  • Broche SW : correspond à la sortie du bouton-poussoir à l'intérieur du joystick. Elle est normalement ouverte. Si nous utilisons une résistance de tirage sur cette broche, la broche SW sera HAUTE lorsqu'elle n'est pas pressée, et BASSE lorsqu'elle est pressée.
Branchements du joystick

Comment cela fonctionne

  • Lorsque vous poussez le pouce du joystick vers la gauche/droite, la tension dans la broche VRX change. La plage de tension va de 0 à 5V (0 à gauche et 5V à droite). La valeur de la tension est proportionnelle à la position du pouce ⇒ La valeur lue sur la broche analogique de l'ESP32 est de 0 à 4095.
  • Lorsque vous poussez le pouce du joystick vers le haut/bas, la tension dans la broche VRY change. La plage de tension va de 0 à 5V (0 en haut et 5V en bas). La valeur de la tension est proportionnelle à la position du pouce ⇒ La valeur lue sur la broche analogique de l'ESP32 est de 0 à 4095.
  • Lorsque vous poussez le pouce du joystick dans n'importe quelle direction, la tension dans les broches VRX et VRY change proportionnellement à la projection de la position sur chaque axe.
  • Lorsque vous poussez le pouce du joystick du haut vers le bas, le bouton-poussoir à l'intérieur du joystick se ferme. Si nous utilisons une résistance de tirage sur la broche SW, la sortie de la broche SW passe de 5V à 0V ⇒ La valeur lue sur la broche numérique de l'ESP32 passe de HIGH à LOW.

Diagramme de câblage

Schéma de câblage du joystick ESP32

This image is created using Fritzing. Click to enlarge image

Si vous ne savez pas comment alimenter l'ESP32 et d'autres composants, vous pouvez trouver des conseils dans le tutoriel suivant : Comment alimenter l'ESP32.

Comment programmer pour joystick

Le joystick comporte deux parties : analogique (axe X, Y) et numérique (bouton-poussoir).

  • Pour les parties analogiques (axes X, Y), il suffit de lire la valeur à partir de la broche d'entrée analogique en utilisant la fonction analogRead().
int valueX = analogRead(A0); int valueY = analogRead(A1);
  • Pour la partie numérique (bouton-poussoir) : il s'agit d'un bouton. La manière la plus simple et pratique est d'utiliser la bibliothèque ezButton. Cette bibliothèque prend en charge l'anti-rebond pour les boutons et active également une résistance de tirage interne. Vous pouvez en savoir plus sur les boutons dans le tutoriel ESP32 - Bouton. Le code sera présenté dans la prochaine session de ce tutoriel.

Après avoir lu les valeurs des broches analogiques, nous pourrions avoir besoin de les convertir en valeurs contrôlables. La partie suivante fournira les codes d'exemple pour cela.

Code ESP32

Cette section fournira les exemples de codes suivants pour l'ESP32 :

  • Exemple de code : lit les valeurs analogiques d'un joystick
  • Exemple de code : lit les valeurs analogiques et l'état du bouton d'un joystick
  • Exemple de code : convertit la valeur analogique en commandes MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN
  • Exemple de code : convertit les valeurs analogiques en angles pour contrôler deux moteurs servo (par exemple, dans une caméra pan-tilt)

Lit les valeurs analogiques du joystick

/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/esp32-joystick */ #define VRX_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRX pin #define VRY_PIN 39 // ESP32 pin GPIO39 (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) ; } 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); }

Étapes rapides

  • Si c'est la première fois que vous utilisez un ESP32, consultez comment configurer l'environnement pour ESP32 sur Arduino IDE.
  • Faites le câblage comme sur l'image ci-dessus.
  • Connectez la carte ESP32 à votre PC via un câble micro USB
  • Ouvrez Arduino IDE sur votre PC.
  • Sélectionnez la bonne carte ESP32 (par exemple, ESP32 Dev Module) et le port COM.
  • Copiez le code ci-dessus et ouvrez-le avec Arduino IDE.
  • Cliquez sur le bouton Upload dans Arduino IDE pour téléverser le code sur l'ESP32.
  • Poussez le pouce du joystick au maximum vers la limite, puis faites-le tourner en cercle (dans le sens horaire ou anti-horaire).
  • Vérifiez le résultat sur le moniteur série.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • En tournant le pouce du joystick, continuez à observer le moniteur série.
  • Si la valeur X est 0, marquez ou mémorisez la position actuelle comme gauche ⇒ la direction opposée est la droite.
  • Si la valeur Y est 0, marquez ou mémorisez la position actuelle comme haut ⇒ la direction opposée est le bas.

Lit les valeurs analogiques et l'état du bouton d'un joystick

/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/esp32-joystick */ #include <ezButton.h> #define VRX_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRX pin #define VRY_PIN 39 // ESP32 pin GPIO39 (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) ; 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); }

Étapes rapides

  • Cliquez sur l'icône Libraries dans la barre gauche de l'IDE Arduino.
  • Recherchez "ezButton", puis trouvez la bibliothèque de boutons par ArduinoGetStarted.com
  • Cliquez sur le bouton Install pour installer la bibliothèque ezButton.
Bibliothèque de boutons ESP32
  • Copiez le code ci-dessus et ouvrez-le avec l'IDE Arduino
  • Cliquez sur le bouton Upload sur l'IDE Arduino pour charger le code sur l'ESP32
  • Poussez le pouce du joystick vers la gauche/droite/haut/bas
  • Poussez le pouce du joystick depuis le haut
  • Observez le résultat sur le moniteur série.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Convertit la valeur analogique en commandes MOUVEMENT GAUCHE/DROITE/HAUT/BAS

/* * Ce code ESP32 a été développé par newbiely.fr * Ce code ESP32 est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/tutorials/esp32/esp32-joystick */ #define VRX_PIN 36 // ESP32 pin GPIO36 (ADC0) connected to VRX pin #define VRY_PIN 39 // ESP32 pin GPIO39 (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) ; } 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 } }

Étapes rapides

  • Copiez le code ci-dessus et ouvrez-le avec l'IDE Arduino
  • Cliquez sur le bouton Upload de l'IDE Arduino pour charger le code sur l'ESP32
  • Poussez le pouce du joystick à gauche/droite/haut/bas ou dans n'importe quelle direction
  • Regardez le résultat sur le moniteur série.
COM6
Send
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ NOTE THAT:

Il peut n'y avoir aucune commande, une commande ou deux commandes (par exemple, HAUT et GAUCHE en même temps).

Convertit les valeurs analogiques en angles pour contrôler deux moteurs servo.

Le détail est présenté dans le tutoriel ESP32 - Le joystick contrôle le moteur servo.

Vidéo

Références de fonction

Tutoriels connexes

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!