.. 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 [|link_sf_facebook|] et rejoignez‑nous dès aujourd’hui ! .. _2.1.9_py_mcp3008: 2.1.9 Joystick (MCP3008) ========================= .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left 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 : .. image:: ../img/image317 - Copy.png Il est bien sûr pratique d’acheter un kit complet, voici le lien : .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nom - ÉLÉMENTS DANS CE KIT - LIEN * - Kit Raphael - 337 - |link_Raphael_kit| Vous pouvez également les acheter séparément à partir des liens ci‑dessous. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCTION DU COMPOSANT - LIEN D’ACHAT * - :ref:`cpn_gpio_extension_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_joystick` - \- * - :ref:`cpn_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. .. .. image:: ../img/2.1.9_joystick_schematic_1.png * - Nom T‑Board - physique - WiringPi - BCM * - SPICE0 - pin24 - 10 - 8 * - SPIMOSI - pin19 - 12 - 10 * - SPIMISO - pin21 - 13 - 9 * - SPISCLK - pin23 - 14 - 11 * - GPIO22 - pin15 - 3 - 22 .. image:: ../img/schematic_2.1.9_joystick_mcp3008.png Procédure expérimentale ----------------------- **Étape 1 :** Construire le circuit. .. image:: ../img/july24_2.1.9_joystick_mcp3008.png **Étape 2 :** Configurer l’interface SPI et installer la bibliothèque ``spidev`` (voir :ref:`spi_configuration` 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. .. raw:: html .. code-block:: cd ~/raphael-kit/python **Étape 4 :** Exécuter le programme. .. raw:: html .. code-block:: 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. .. warning:: Si un message d’erreur ``RuntimeError: Cannot determine SOC peripheral base address`` apparaît, reportez‑vous à :ref:`faq_soc`. 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. .. raw:: html .. code-block:: python #!/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 ------------------- .. code-block:: python #!/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. .. code-block:: python 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. .. code-block:: python 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). .. code-block:: python 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.