Raspberry Pi - Joystick

Ce tutoriel vous explique comment utiliser un joystick avec un Raspberry Pi. Nous examinerons :

Joystick Raspberry Pi

Préparation du matériel

1×Raspberry Pi 4 Model B
1×ADS1115 ADC Module
1×Joystick
1×Jumper Wires
1×(Optional) Screw Terminal Block Shield for Raspberry Pi
1×(Optional) USB-C Power Cable with On/Off Switch for Raspberry Pi 4B
1×(Optional) Plastic Case and Cooling Fan for Raspberry Pi 4B
1×(Optional) HDMI Touch Screen Monitor for Raspberry Pi

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 joystick à 2 axes

Vous avez peut-être rencontré un joystick dans divers endroits, comme une manette de jeu, une manette de jouet, ou même une grande machine comme une manette d'excavatrice.

Le joystick est composé de deux potentiomètres disposés en forme de carré et d'un bouton poussoir. Il fournit les sorties suivantes :

  • Une valeur analogique allant de 0 à 1023 qui correspond à la position horizontale (connue sous le nom de coordonnée X)
  • Une valeur analogique allant de 0 à 1023 qui correspond à la position verticale (connue sous le nom de coordonnée Y)
  • Une valeur numérique du bouton-poussoir (soit HIGH soit LOW)

La combinaison de deux valeurs analogiques peut générer des coordonnées 2D avec le centre représenté par les valeurs lorsque le joystick est en position de repos. Pour déterminer la direction réelle des coordonnées, un code de test peut être exécuté (présenté dans la section suivante).

Certaines applications peuvent utiliser les trois sorties, tandis que d'autres peuvent n'en utiliser que certaines.

Le brochage du Joystick

Un joystick a 5 broches :

  • Broche GND : Celle-ci doit être connectée à GND (0V).
  • Broche VCC : Celle-ci doit être connectée à VCC (5V).
  • Broche VRX : Celle-ci émet une valeur analogique qui correspond à la position horizontale (connue sous le nom de coordonnée X).
  • Broche VRY : Celle-ci émet une valeur analogique qui correspond à la position verticale (connue sous le nom de coordonnée Y).
  • Broche SW : Voici la sortie du bouton-poussoir à l'intérieur du joystick. Elle est normalement ouverte. Si une résistance de tirage est utilisée sur cette broche, la broche SW sera HAUTE lorsqu'elle n'est pas pressée, et BASSE lorsqu'elle est pressée.
joystick schéma de connexion

Comment ça marche

  • Lorsque vous déplacez le pouce du joystick vers la gauche ou la droite, la tension sur la broche VRX change. Cette plage de tension va de 0V à 5V, 0V étant à gauche et 5V à droite, ce qui donne une valeur de lecture sur la broche analogique du Raspberry Pi de 0 à 1023.
  • De même, lorsque vous déplacez le pouce du joystick vers le haut ou le bas, la tension sur la broche VRY change. Cette plage de tension va de 0V à 5V, 0V étant en haut et 5V en bas, ce qui donne une valeur de lecture sur la broche analogique du Raspberry Pi de 0 à 1023.
  • Lorsque vous déplacez le pouce du joystick dans différentes directions, la tension sur les broches VRX et VRY change proportionnellement à la projection de la position sur chaque axe.
  • Lorsque vous appuyez sur le pouce du joystick de haut en 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 passera de 5V à 0V, ce qui entraînera une modification de la valeur de lecture sur la broche numérique du Raspberry Pi de HAUT à BAS.

Diagramme de câblage

Schéma de câblage du joystick Raspberry Pi

This image is created using Fritzing. Click to enlarge image

Pour simplifier et organiser votre câblage, nous vous recommandons d'utiliser un Screw Terminal Block Shield pour Raspberry Pi. Ce shield garantit des connexions plus sûres et plus faciles à gérer, comme illustré ci-dessous :

Raspberry Pi Screw Terminal Block Shield

Code Raspberry Pi

Cette section présentera les exemples de code Raspberry Pi suivants :

  • Exemple de code : Obtention de valeurs analogiques du joystick
  • Exemple de code : Obtention de valeurs analogiques et état du bouton du joystick
  • Exemple de code : Conversion de la valeur analogique en commandes MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN
  • Exemple de code : Conversion des valeurs analogiques en angles pour contrôler deux servomoteurs (par exemple dans une caméra à inclinaison panoramique)

Lit les valeurs analogiques du joystick

Étapes rapides

  • Assurez-vous d'avoir Raspbian ou tout autre système d'exploitation compatible avec Raspberry Pi installé sur votre Pi.
  • Assurez-vous que votre Raspberry Pi est connecté au même réseau local que votre PC.
  • Assurez-vous que votre Raspberry Pi est connecté à Internet si vous devez installer des bibliothèques.
  • Si c'est la première fois que vous utilisez Raspberry Pi, consultez Installation du logiciel - Raspberry Pi..
  • Connectez votre PC au Raspberry Pi via SSH en utilisant le client SSH intégré sur Linux et macOS ou PuTTY sur Windows. Consultez comment connecter votre PC au Raspberry Pi via SSH.
  • Assurez-vous d'avoir installé la bibliothèque RPi.GPIO. Si ce n'est pas le cas, installez-la en utilisant la commande suivante :
sudo apt-get update sudo apt-get install python3-rpi.gpio
  • Installez la bibliothèque Adafruit_ADS1x15 en exécutant les commandes suivantes dans le terminal de votre Raspberry Pi :
sudo pip install Adafruit-ADS1x15
  • Créez un fichier script Python joystick.py et ajoutez le code suivant :
# Ce code Raspberry Pi a été développé par newbiely.fr # Ce code Raspberry Pi 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/raspberry-pi/raspberry-pi-joystick import time import Adafruit_ADS1x15 # Create an ADS1115 instance ADC = Adafruit_ADS1x15.ADS1115() # Set the gain to ±4.096V (adjust if needed) GAIN = 1 # Specify the ADC channels for the joystick axes X_CHANNEL = 0 Y_CHANNEL = 1 try: while True: x_value = ADC.read_adc(X_CHANNEL, gain=GAIN) y_value = ADC.read_adc(Y_CHANNEL, gain=GAIN) print(f"X-axis Value: {x_value}, Y-axis Value: {y_value}") time.sleep(0.1) except KeyboardInterrupt: pass
  • Enregardez le fichier et exécutez le script Python en exécutant la commande suivante dans le terminal :
python3 joystick.py
  • Poussez le pouce du joystick à son maximum, puis tournez-le dans le sens horaire ou antihoraire.
  • Vérifiez les résultats sur le terminal.
PuTTY - Raspberry Pi
X-axis Value: 256, Y-axis Value: 256 X-axis Value: 500, Y-axis Value: 500 X-axis Value: 800, Y-axis Value: 800 X-axis Value: 1000, Y-axis Value: 1000 X-axis Value: 1000, Y-axis Value: 1000 X-axis Value: 1000, Y-axis Value: 1000 X-axis Value: 900, Y-axis Value: 900 X-axis Value: 600, Y-axis Value: 600 X-axis Value: 300, Y-axis Value: 300 X-axis Value: 50, Y-axis Value: 50 X-axis Value: 50, Y-axis Value: 50

Tout en tournant le pouce du joystick, gardez un œil sur le Terminal.

Si la valeur de X est 0, notez ou retenez la position actuelle comme gauche, avec la direction opposée étant droite.

Si la valeur Y est 0, notez ou retenez la position actuelle comme étant vers le haut, avec la direction opposée étant vers le bas.

Le script s'exécute dans une boucle infinie en continu jusqu'à ce que vous appuyiez sur Ctrl + C dans le terminal.

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

Étapes rapides

  • Créez un fichier de script Python joystick_sw.py et ajoutez le code suivant :
# Ce code Raspberry Pi a été développé par newbiely.fr # Ce code Raspberry Pi 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/raspberry-pi/raspberry-pi-joystick import time import Adafruit_ADS1x15 # Create an ADS1115 instance ADC = Adafruit_ADS1x15.ADS1115() # Set the gain to ±4.096V (adjust if needed) GAIN = 1 # Specify the ADC channels for the joystick axes X_CHANNEL = 0 Y_CHANNEL = 1 # Define the GPIO pin for the push button BUTTON_PIN = 16 # GPIO16 # Initialize the GPIO pin for the button import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Initialize variable for previous button state prev_button_state = GPIO.HIGH try: while True: x_value = ADC.read_adc(X_CHANNEL, gain=GAIN) y_value = ADC.read_adc(Y_CHANNEL, gain=GAIN) button_state = GPIO.input(BUTTON_PIN) print(f"X-axis Value: {x_value}, Y-axis Value: {y_value}, Button State: {button_state}") # Detect button press event (transition from HIGH to LOW) if prev_button_state == GPIO.HIGH and button_state == GPIO.LOW: print("Button Pressed!") # Detect button release event (transition from LOW to HIGH) if prev_button_state == GPIO.LOW and button_state == GPIO.HIGH: print("Button Released!") prev_button_state = button_state time.sleep(0.1) except KeyboardInterrupt: pass finally: GPIO.cleanup()
  • Enregistrez le fichier et exécutez le script Python en entrant la commande suivante dans le terminal :
python3 joystick_sw.py
  • Déplacez le pouce du joystick vers la gauche, la droite, le haut ou le bas.
  • Appuyez sur le pouce du joystick par le haut.
  • Vérifiez les résultats sur le Terminal.

Convertit la valeur analogique en commandes DÉPLACER GAUCHE/DROITE/HAUT/BAS

Étapes rapides

  • Créez un fichier de script Python joystick_cmd.py et ajoutez le code suivant :
# Ce code Raspberry Pi a été développé par newbiely.fr # Ce code Raspberry Pi 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/raspberry-pi/raspberry-pi-joystick import time import Adafruit_ADS1x15 # Create an ADS1115 instance ADC = Adafruit_ADS1x15.ADS1115() # Set the gain to ±4.096V (adjust if needed) GAIN = 1 # Specify the ADC channels for the joystick axes X_CHANNEL = 0 Y_CHANNEL = 1 # Read center values initially to calculate thresholds CENTER_SAMPLES = 100 x_center = sum([ADC.read_adc(X_CHANNEL, gain=GAIN) for _ in range(CENTER_SAMPLES)]) / CENTER_SAMPLES y_center = sum([ADC.read_adc(Y_CHANNEL, gain=GAIN) for _ in range(CENTER_SAMPLES)]) / CENTER_SAMPLES # Calculate thresholds based on center values THRESHOLD_DELTA = 200 # Adjust this value as needed LEFT_THRESHOLD = x_center - THRESHOLD_DELTA RIGHT_THRESHOLD = x_center + THRESHOLD_DELTA UP_THRESHOLD = y_center - THRESHOLD_DELTA DOWN_THRESHOLD = y_center + THRESHOLD_DELTA COMMAND_NO = 0x00 COMMAND_LEFT = 0x01 COMMAND_RIGHT = 0x02 COMMAND_UP = 0x04 COMMAND_DOWN = 0x08 try: while True: value_X = ADC.read_adc(X_CHANNEL, gain=GAIN) value_Y = ADC.read_adc(Y_CHANNEL, gain=GAIN) command = COMMAND_NO if value_X < LEFT_THRESHOLD: command |= COMMAND_LEFT elif value_X > RIGHT_THRESHOLD: command |= COMMAND_RIGHT if value_Y < UP_THRESHOLD: command |= COMMAND_UP elif value_Y > DOWN_THRESHOLD: command |= COMMAND_DOWN if command & COMMAND_LEFT: print("COMMAND LEFT") # TODO: Add your task here if command & COMMAND_RIGHT: print("COMMAND RIGHT") # TODO: Add your task here if command & COMMAND_UP: print("COMMAND UP") # TODO: Add your task here if command & COMMAND_DOWN: print("COMMAND DOWN") # TODO: Add your task here time.sleep(0.1) except KeyboardInterrupt: pass
  • Enregistrez le fichier et exécutez le script Python en exécutant la commande suivante dans le terminal :
python3 joystick_cmd.py
  • Déplacez le joystick dans n'importe quelle direction.
  • Vérifiez le résultat dans le Terminal.
PuTTY - Raspberry Pi
COMMAND UP COMMAND DOWN COMMAND LEFT COMMAND RIGHT

※ Note:

À un moment donné, il peut n'y avoir aucune commande, une commande ou deux commandes simultanément (par exemple, HAUT et GAUCHE).

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

Les détails peuvent être trouvés dans le tutoriel intitulé Raspberry Pi - Joystick contrôle le moteur Servo.

Vidéo

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!