ESP32 - joystick

Ce tutoriel vous explique comment utiliser un joystick avec l'ESP32 et MicroPython. En détail, nous allons apprendre :

ESP32 MicroPython et joystick

Préparation du matériel

1×Module de développement ESP32 ESP-WROOM-32
1×Câble USB Type-A vers Type-C (pour PC USB-A)
1×Câble USB Type-C vers Type-C (pour PC USB-C)
1×Joystick
1×Fils de connexion
1×Recommandé: Carte d'extension à bornier à vis pour ESP32
1×Recommandé: Breakout Expansion Board for ESP32
1×Recommandé: Répartiteur d'alimentation pour ESP32

Ou vous pouvez acheter les kits suivants:

1×Kit de Démarrage DIYables ESP32 (ESP32 inclus)
1×Kit de Capteurs DIYables (30 capteurs/écrans)
1×Kit de Capteurs DIYables (18 capteurs/écrans)
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 de Joystick

Vous avez peut-être vu un joystick utilisé pour contrôler des jeux, des jouets ou même de grandes machines comme des excavatrices. Le joystick se compose de deux potentiomètres disposés en carré et d'un bouton. Il fournit les sorties suivantes :

  • Une plage de 0 à 4095 pour la position horizontale (de gauche à droite).
  • Une plage de 0 à 4095 pour la position verticale (de haut en bas).
  • L'état du bouton, soit allumé (NIVEAU ÉLEVÉ) ou éteint (NIVEAU FAIBLE).

En combinant les deux valeurs analogiques, le joystick génère des coordonnées en 2D qui sont centrées lorsque le joystick est au repos. Vous pouvez déterminer la direction réelle de ces coordonnées à l’aide d’un code de test, que nous aborderons dans la section suivante. Certaines applications peuvent utiliser les trois sorties, tandis que d’autres n’en utilisent que quelques-unes.

Schéma des broches

Un joystick a cinq broches:

  • GND pin : Se connecte à la masse (0 V).
  • VCC pin : Se connecte à l'alimentation en 3,3 V de l'ESP32.
  • VRX pin : Fournit une valeur analogique pour la position horizontale (coordonnée X) ; connectez cette broche à une broche ADC sur l'ESP32.
  • VRY pin : Fournit une valeur analogique pour la position verticale (coordonnée Y) ; connectez cette broche à une broche ADC sur l'ESP32.
  • SW pin : Connectée au bouton-poussoir du joystick, qui est normalement ouvert. Utilisez une résistance de tirage (pull-up) pour maintenir cette broche à un niveau élevé lorsque le bouton n'est pas enfoncé et à un niveau bas lorsqu'il est enfoncé.
Schéma des broches du joystick

Comment ça fonctionne

  • Mouvement gauche/droite:
    • Déplacer le joystick vers la gauche ou vers la droite modifie la tension sur la broche VRX.
    • Le déplacer vers la gauche réduit la tension à 0 volt, tandis que le déplacer vers la droite augmente la tension à 3,3 volts.
    • L'ESP32 mesure cette tension et la convertit en un nombre entre 0 et 4095, où 0 volt correspond à 0 et 3,3 volts correspond à 4095.
  • Mouvement haut/bas:
    • Déplacer le joystick vers le haut ou vers le bas affecte la tension sur la broche VRY.
    • Le déplacer vers le haut diminue la tension à 0 volt, et le déplacer vers le bas augmente la tension à 3,3 volts.
    • L'ESP32 lit cette tension et la convertit en un nombre entre 0 et 4095, similaire à la broche VRX.
  • Mouvements combinés:
    • Déplacer le joystick dans n'importe quelle direction modifie la tension sur les broches VRX et VRY, selon sa position sur chacun des axes.
  • Appuyer sur le joystick :
    • Appuyer sur le joystick vers le bas active un bouton interne.
    • Une résistance de tirage vers le haut connectée à la broche SW fait chuter la tension de 3,3 volts à 0 volt lorsqu'on appuie.
    • L'ESP32 l'interprète comme un signal numérique, lisant HIGH (3,3 volts) lorsque non appuyé et LOW (0 volt) lorsque appuyé.

    Lorsque le joystick est déplacé, il ajuste les tensions sur les broches VRX et VRY, que l'ESP32 lit comme des valeurs allant de 0 à 4095. En appuyant sur le joystick, la tension sur la broche SW change, et l'ESP32 détecte ce changement comme HIGH ou LOW.

Diagramme de câblage

  • Comment connecter l'ESP32 et un joystick en utilisant breadboard
Schéma de câblage du joystick ESP32 MicroPython

Cette image a été créée avec Fritzing. Cliquez pour agrandir l'image.

Comment connecter l'ESP32 et un joystick

Comment programmer pour un joystick

Heureusement, DIYables a développé une bibliothèque de joystick qui simplifie grandement le processus d'utilisation d'un joystick avec l'ESP32.

Code MicroPython ESP32 - Lit l'état du joystick

Le script MicroPython suivant :

  • Lit les valeurs analogiques d'un joystick.
  • Vérifie si le stick analogique du joystick est enfoncé ou relâché.
  • Lit le nombre d'appuis sur le stick analogique du joystick.
/* * Ce code ESP32 MicroPython a été développé par newbiely.fr * Ce code ESP32 MicroPython 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-micropython/esp32-micropython-joystick */ from DIYables_MicroPython_Joystick import Joystick from machine import Pin, ADC import time VRX_PIN = 39 # The ESP32 pin GPIO39 (ADC3) connected to VRX pin of joystick VRY_PIN = 36 # The ESP32 pin GPIO36 (ADC0) connected to VRY pin of joystick SW_PIN = 17 # The ESP32 pin GPIO17 connected to SW pin of joystick adc_vrx = ADC(Pin(VRX_PIN)) adc_vry = ADC(Pin(VRY_PIN)) # Set the ADC width (resolution) to 12 bits adc_vrx.width(ADC.WIDTH_12BIT) adc_vry.width(ADC.WIDTH_12BIT) # Set the attenuation to 11 dB, allowing input range up to ~3.3V adc_vrx.atten(ADC.ATTN_11DB) adc_vry.atten(ADC.ATTN_11DB) joystick = Joystick(pin_x=VRX_PIN, pin_y=VRY_PIN, pin_button=SW_PIN) # Configure the debounce time if necessary (default is 50ms) joystick.set_debounce_time(100) # debounce time set to 100 milliseconds while True: joystick.loop() # Must be called frequently to process button debouncing # Read the analog values from the X and Y axes x_value = joystick.read_x() y_value = joystick.read_y() press_count = joystick.get_press_count() # Check if the button has been pressed or released if joystick.is_pressed(): print("Button Pressed") if joystick.is_released(): print("Button Released") # Print the joystick's X and Y coordinates, and pressed count print(f'Joystick Position - X: {x_value}, Y: {y_value}, pressed count: {press_count}') time.sleep(0.1) # Delay to reduce the output frequency

Étapes rapides

Voici les instructions pour configurer et exécuter votre code MicroPython sur l’ESP32 en utilisant l’IDE Thonny :

  • Assurez-vous que l’IDE Thonny est installé sur votre ordinateur.
  • Confirmez que le firmware MicroPython est chargé sur votre carte ESP32.
  • Si c’est la première fois que vous utilisez un ESP32 avec MicroPython, consultez le guide ESP32 - Premiers pas. pour des instructions étape par étape.
  • Connectez le joystick à l’ESP32 selon le schéma fourni.
  • Connectez la carte ESP32 à votre ordinateur avec un câble USB.
  • Ouvrez l’IDE Thonny sur votre ordinateur.
  • Dans l’IDE Thonny, allez dans Outils Options.
  • Dans l’onglet Interpréteur, choisissez MicroPython (ESP32) dans le menu déroulant.
  • Assurez-vous que le port correct est sélectionné. L’IDE Thonny le détecte généralement automatiquement, mais vous devrez peut-être le sélectionner manuellement (par exemple COM12 sous Windows ou /dev/ttyACM0 sous Linux).
  • Accédez à Outils Gérer les paquets dans l’IDE Thonny.
  • Recherchez “DIYables-MicroPython-Joystick”, puis trouvez la bibliothèque Joystick créée par DIYables.
  • Cliquez sur DIYables-MicroPython-Joystick, puis cliquez sur le bouton Install pour installer la bibliothèque Joystick.
Bibliothèque MicroPython ESP32 Joystick
  • Copiez le code MicroPython fourni et collez-le dans l'éditeur de Thonny.
  • Enregistrez le code sur votre ESP32 en procédant comme suit :
    • Cliquez sur le bouton Enregistrer ou appuyez sur Ctrl+S.
    • Dans la boîte de dialogue d'enregistrement, choisissez l'appareil MicroPython.
    • Nommez le fichier main.py.
  • Cliquez sur le bouton vert Exécuter (ou appuyez sur F5) pour exécuter le script.
  • Faites glisser le joystick vers la gauche, vers la droite, vers le haut ou vers le bas.
  • Appuyez vers le bas sur le dessus du joystick.
  • Consultez le message dans le Shell en bas de Thonny.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot MPY: soft reboot Joystick Position - X: 1808, Y: 1869, pressed count: 0 Joystick Position - X: 1415, Y: 1872, pressed count: 0 Joystick Position - X: 0, Y: 0, pressed count: 0 Joystick Position - X: 0, Y: 590, pressed count: 0 Joystick Position - X: 0, Y: 786, pressed count: 0 Joystick Position - X: 0, Y: 1088, pressed count: 0 Joystick Position - X: 0, Y: 1872, pressed count: 0 Joystick Position - X: 0, Y: 2320, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 834, Y: 4095, pressed count: 0 Joystick Position - X: 1802, Y: 4095, pressed count: 0 Joystick Position - X: 2924, Y: 4095, pressed count: 0 Joystick Position - X: 4095, Y: 4095, pressed count: 0 Joystick Position - X: 4095, Y: 0, pressed count: 0 Joystick Position - X: 4095, Y: 0, pressed count: 0 Joystick Position - X: 2672, Y: 0, pressed count: 0 Joystick Position - X: 1152, Y: 0, pressed count: 0 Joystick Position - X: 0, Y: 0, pressed count: 0 Joystick Position - X: 0, Y: 1872, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 0, Y: 4095, pressed count: 0 Joystick Position - X: 4095, Y: 1879, pressed count: 0 Joystick Position - X: 1800, Y: 1883, pressed count: 0 Joystick Position - X: 1805, Y: 1873, pressed count: 0 Joystick Position - X: 4095, Y: 4095, pressed count: 0 Joystick Position - X: 1803, Y: 1870, pressed count: 0 Joystick Position - X: 1797, Y: 1872, pressed count: 0 Button Pressed Joystick Position - X: 1801, Y: 1873, pressed count: 0 Button Pressed Joystick Position - X: 1803, Y: 4095, pressed count: 0 Button Released Joystick Position - X: 1801, Y: 4095, pressed count: 1 Joystick Position - X: 1797, Y: 4095, pressed count: 1 Joystick Position - X: 1805, Y: 4095, pressed count: 1 Joystick Position - X: 1805, Y: 1869, pressed count: 1 Joystick Position - X: 1802, Y: 1877, pressed count: 1 Joystick Position - X: 1802, Y: 1871, pressed count: 1 Button Pressed Joystick Position - X: 1804, Y: 1872, pressed count: 1 Joystick Position - X: 1799, Y: 1861, pressed count: 1 Joystick Position - X: 1805, Y: 1870, pressed count: 1 Joystick Position - X: 1806, Y: 1877, pressed count: 1 Button Released Joystick Position - X: 1805, Y: 1866, pressed count: 2 Joystick Position - X: 1808, Y: 1859, pressed count: 2 Button Pressed Joystick Position - X: 1799, Y: 1874, pressed count: 2 Joystick Position - X: 1808, Y: 1876, pressed count: 2 Joystick Position - X: 1803, Y: 1874, pressed count: 2 Joystick Position - X: 4095, Y: 4095, pressed count: 2 Button Released Joystick Position - X: 4095, Y: 4095, pressed count: 3 Joystick Position - X: 4095, Y: 4095, pressed count: 3
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

Lors de l'utilisation du joystick, observez le message dans le Shell en bas de Thonny. Si la valeur X est 0, cela indique une position à gauche ; sinon, cela indique à droite. Si la valeur Y est 0, cela représente une position vers le haut ; sinon, cela indique vers le bas.

Gardez à l'esprit que, bien que la plage théorique des valeurs X/Y soit de 0 à 4095, en pratique, les valeurs peuvent ne pas atteindre ces extrêmes en raison des caractéristiques mécaniques du joystick. Cette variation est normale et acceptable pour la plupart des applications.

※ Note:

Ce tutoriel montre comment utiliser la fonction adc.read() pour lire des valeurs depuis un ADC (convertisseur analogique-numérique) connecté à un joystick. L'ADC de l'ESP32 est adapté pour des projets qui ne nécessitent pas une grande précision. Cependant, si votre projet nécessite des mesures précises, gardez à l'esprit ce qui suit:

  • L'ADC de l'ESP32 n'est pas parfaitement précis et peut nécessiter une calibration pour des résultats précis. Chaque carte ESP32 peut varier légèrement, il est donc nécessaire de calibrer chaque carte individuellement.
  • La calibration peut être difficile, surtout pour les débutants, et peut ne pas toujours donner exactement les résultats souhaités.

Pour les projets nécessitant une grande précision, envisagez d'utiliser un ADC externe (par exemple ADS1115) avec l'ESP32 ou optez pour un Arduino, qui dispose d'un ADC plus fiable. Si vous souhaitez tout de même calibrer l'ADC de l'ESP32, reportez-vous au ESP32 ADC Calibration Driver.

Convertit une valeur analogique en commandes de déplacement vers la gauche/droite/haut/bas

Le code MicroPython ci-dessous convertit les valeurs analogiques en commandes : MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN.

/* * Ce code ESP32 MicroPython a été développé par newbiely.fr * Ce code ESP32 MicroPython 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-micropython/esp32-micropython-joystick */ from DIYables_MicroPython_Joystick import Joystick from machine import Pin, ADC import time # Constants for threshold values LEFT_THRESHOLD = 1000 RIGHT_THRESHOLD = 3000 UP_THRESHOLD = 1000 DOWN_THRESHOLD = 3000 # Command constants COMMAND_NO = 0x00 COMMAND_LEFT = 0x01 COMMAND_RIGHT = 0x02 COMMAND_UP = 0x04 COMMAND_DOWN = 0x08 VRX_PIN = 39 # The ESP32 pin GPIO39 (ADC3) connected to VRX pin of joystick VRY_PIN = 36 # The ESP32 pin GPIO36 (ADC0) connected to VRY pin of joystick SW_PIN = 17 # The ESP32 pin GPIO17 connected to SW pin of joystick adc_vrx = ADC(Pin(VRX_PIN)) adc_vry = ADC(Pin(VRY_PIN)) # Set the ADC width (resolution) to 12 bits adc_vrx.width(ADC.WIDTH_12BIT) adc_vry.width(ADC.WIDTH_12BIT) # Set the attenuation to 11 dB, allowing input range up to ~3.3V adc_vrx.atten(ADC.ATTN_11DB) adc_vry.atten(ADC.ATTN_11DB) joystick = Joystick(pin_x=VRX_PIN, pin_y=VRY_PIN, pin_button=SW_PIN) # Configure the debounce time if necessary (default is 50ms) joystick.set_debounce_time(100) # debounce time set to 100 milliseconds def check_commands(x_value, y_value): command = COMMAND_NO # Check for left/right commands if x_value < LEFT_THRESHOLD: command |= COMMAND_LEFT elif x_value > RIGHT_THRESHOLD: command |= COMMAND_RIGHT # Check for up/down commands if y_value < UP_THRESHOLD: command |= COMMAND_UP elif y_value > DOWN_THRESHOLD: command |= COMMAND_DOWN return command while True: x_value = joystick.read_x() y_value = joystick.read_y() command = check_commands(x_value, y_value) if command & COMMAND_LEFT: print("COMMAND LEFT") if command & COMMAND_RIGHT: print("COMMAND RIGHT") if command & COMMAND_UP: print("COMMAND UP") if command & COMMAND_DOWN: print("COMMAND DOWN") time.sleep(0.5) # Delay to reduce the output frequency

Étapes rapides

  • Copiez le code ci-dessus et collez-le dans l'éditeur de l'IDE Thonny.
  • Enregistrez le script sur votre carte ESP32.
  • Cliquez sur le bouton vert Exécuter (ou appuyez sur F5) pour exécuter le script.
  • Déplacez le joystick vers la gauche, vers la droite, vers le haut, vers le bas, ou dans n'importe quelle direction.
  • Consultez le message dans le Shell en bas de Thonny.
Shell x
>>> %Run -c $EDITOR_CONTENT
MPY: soft reboot MPY: soft reboot COMMAND UP COMMAND RIGHT COMMAND DOWN COMMAND DOWN COMMAND DOWN COMMAND RIGHT COMMAND DOWN COMMAND RIGHT COMMAND DOWN COMMAND LEFT COMMAND DOWN
MicroPython (ESP32) • CP2102 USB To UART Bridge Controller @ COM12 ≡

※ Note:

Il peut ne pas y avoir de commande, une commande, ou même deux commandes en même temps, comme HAUT et GAUCHE ensemble.

Convertit des valeurs analogiques en angles pour contrôler deux servomoteurs

Découvrez les détails dans ce tutoriel ESP32 - joystick - servomoteur..

Vidéo

※ NOS MESSAGES

  • N'hésitez pas à partager le lien de ce tutoriel. Cependant, veuillez ne pas utiliser notre contenu sur d'autres sites web. Nous avons investi beaucoup d'efforts et de temps pour créer ce contenu, veuillez respecter notre travail !