Note

Bonjour et bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 sur Facebook ! Plongez plus profondément dans l’univers Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.

Pourquoi rejoindre ?

  • Support d’experts : Résolvez les problèmes après‑vente et les défis techniques avec l’aide de notre communauté et de notre équipe.

  • Apprendre et partager : Échangez des astuces et des tutoriels pour améliorer vos compétences.

  • Aperçus exclusifs : Obtenez un accès anticipé aux annonces de nouveaux produits et aux avant‑premières.

  • Réductions spéciales : Profitez de remises exclusives sur nos derniers produits.

  • Promotions et concours festifs : Participez à des concours et promotions de vacances.

👉 Prêt à explorer et à créer avec nous ? Cliquez sur [Ici] et rejoignez‑nous dès aujourd’hui !

2.1.9 Joystick (MCP3008)

Note

../_images/mcp3008_and_adc0834.jpg

Selon la version de votre kit, veuillez identifier si vous avez ADC0834 ou MCP3008 et suivre la section correspondante.

Introduction

Dans ce projet, nous allons apprendre comment fonctionne un joystick. Nous manipulons le joystick et affichons les résultats à l’écran.

Composants requis

Dans ce projet, nous avons besoin des composants suivants :

img/image317-Copy.png

Il est bien sûr pratique d’acheter un kit complet, voici le lien :

Nom

ÉLÉMENTS DANS CE KIT

LIEN

Kit Raphael

337

Raphael Kit

Vous pouvez également les acheter séparément à partir des liens ci‑dessous.

INTRODUCTION DU COMPOSANT

LIEN D’ACHAT

Carte d’extension GPIO

ACHETER

Plaque d’expérimentation (Breadboard)

ACHETER

Fils de Liaison

ACHETER

Résistance

ACHETER

Module Joystick

-

MCP3008

-

Schéma

Lors de la lecture des données du joystick, il existe des différences entre les axes : les données des axes X et Y sont analogiques, nécessitant l’utilisation du MCP3008 pour convertir la valeur analogique en valeur numérique. Les données de l’axe Z sont numériques ; vous pouvez donc utiliser directement un GPIO ou également lire via l’ADC.

../_images/schematic_2.1.9_joystick_mcp3008.png

Procédure expérimentale

Étape 1 : Construire le circuit.

../_images/july24_2.1.9_joystick_mcp3008.png

Étape 2 : Configurer l’interface SPI et installer la bibliothèque spidev (voir Configuration SPI pour les instructions détaillées). Si vous avez déjà effectué ces étapes, vous pouvez les ignorer.

Étape 3 : Aller dans le dossier contenant le code.

cd ~/raphael-kit/python

Étape 4 : Exécuter le programme.

sudo python3 2.1.9-2_Joystick.py

Après l’exécution du programme, tournez le joystick : les valeurs correspondantes de X, Y et Btn s’afficheront à l’écran.

Avertissement

Si un message d’erreur RuntimeError: Cannot determine SOC peripheral base address apparaît, reportez‑vous à Si « gpiozero » ne fonctionne pas..

Code

Note

Vous pouvez Modifier/Réinitialiser/Copier/Exécuter/Arrêter le code ci‑dessous. Mais avant cela, vous devez vous placer dans le chemin du code source, comme raphael-kit/python. Après modification, vous pouvez exécuter directement le programme pour voir l’effet.

#!/usr/bin/env python3

import RPi.GPIO as GPIO
import spidev
import time

# Définir la broche GPIO pour le bouton du joystick (broche SW)
BTN_PIN = 22

# Configurer le mode GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)  # Utiliser la résistance pull-up interne

# Initialiser la communication SPI avec le MCP3008
spi = spidev.SpiDev()
spi.open(0, 0)  # Bus SPI 0, CE0
spi.max_speed_hz = 1000000  # 1 MHz

def read_adc(channel):
    """
    Lit la valeur analogique du canal MCP3008 spécifié (0–7)
    :param channel: numéro du canal ADC (0–7)
    :return: valeur entière sur 10 bits (0–1023)
    """
    if channel < 0 or channel > 7:
        return -1
    adc = spi.xfer2([1, (8 + channel) << 4, 0])
    value = ((adc[1] & 0x03) << 8) | adc[2]
    return value

try:
    # Boucle principale pour lire et afficher les valeurs du joystick et l’état du bouton
    while True:
        # Lire les valeurs X et Y à partir des canaux 1 et 2 du MCP3008
        x_val = read_adc(1)  # Joystick VRX connecté à CH1
        y_val = read_adc(2)  # Joystick VRY connecté à CH2

        # Lire l’état du bouton du joystick (SW)
        Btn_val = GPIO.input(BTN_PIN)  # 0 = appuyé, 1 = relâché

        # Afficher les valeurs lues
        print('X: %d  Y: %d  Btn: %d' % (x_val, y_val, Btn_val))

        time.sleep(0.2)

except KeyboardInterrupt:
    pass

finally:
    spi.close()
    GPIO.cleanup()

Explication du code

#!/usr/bin/env python3

import RPi.GPIO as GPIO
import spidev
import time

Cette section importe les bibliothèques nécessaires :

  • RPi.GPIO est utilisée pour gérer l’entrée GPIO (bouton du joystick).

  • spidev est utilisée pour communiquer avec la puce ADC MCP3008 via SPI.

  • time est utilisée pour introduire des temporisations entre les lectures.

BTN_PIN = 22

GPIO.setmode(GPIO.BCM)
GPIO.setup(BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000

Cette section configure le mode GPIO BCM, initialise le bouton du joystick sur la broche 22 avec résistance pull‑up, et configure l’interface SPI avec le MCP3008 (bus 0, CE0) à 1 MHz.

def read_adc(channel):
    if channel < 0 or channel > 7:
        return -1
    adc = spi.xfer2([1, (8 + channel) << 4, 0])
    value = ((adc[1] & 0x03) << 8) | adc[2]
    return value

La fonction read_adc() lit une valeur analogique sur un canal spécifique du MCP3008. Elle envoie trois octets via SPI et interprète la réponse pour retourner une valeur sur 10 bits (0–1023).

try:
    while True:
        x_val = read_adc(1)
        y_val = read_adc(2)
        Btn_val = GPIO.input(BTN_PIN)

        print('X: %d  Y: %d  Btn: %d' % (x_val, y_val, Btn_val))
        time.sleep(0.2)

except KeyboardInterrupt:
    pass

finally:
    spi.close()
    GPIO.cleanup()

Cette boucle principale lit et affiche toutes les 200 ms les positions analogiques X/Y du joystick et l’état de son bouton. Si le script est interrompu via le clavier (Ctrl+C), le SPI et les GPIO sont correctement libérés.