.. note:: Bonjour, bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Approfondissez vos connaissances sur 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** : Accédez en avant‑première aux annonces de nouveaux produits et aux aperçus. - **Réductions spéciales** : Profitez de réductions exclusives sur nos tout derniers produits. - **Promotions et cadeaux festifs** : Participez à des concours et promotions spéciales pendant les fêtes. 👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez‑nous dès aujourd’hui ! .. _2.1.9_c_pi5_mcp3008: 2.1.9 Joystick (MCP3008) ======================== .. note:: .. image:: ../img/mcp3008_and_adc0834.jpg :width: 25% :align: left Selon la version de votre kit, identifiez si vous disposez d’un **ADC0834** ou d’un **MCP3008** et suivez la section correspondante. Introduction ------------ Dans ce projet, nous allons apprendre le fonctionnement d’un joystick. Nous allons manipuler le joystick et afficher 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 via les 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 de câblage ----------------- Lorsque les données du joystick sont lues, il existe certaines différences entre les axes : les données des axes X et Y sont analogiques et nécessitent l’utilisation du MCP3008 pour convertir la valeur analogique en valeur numérique. Les données de l’axe Z sont numériques, donc vous pouvez directement utiliser le GPIO pour les lire, ou encore utiliser l’ADC. .. .. image:: ../img/image319.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édures expérimentales ------------------------- **Étape 1 :** Construisez le circuit. .. image:: ../img/july24_2.1.9_joystick_mcp3008.png **Étape 2 :** Accédez au dossier contenant le code. .. raw:: html .. code-block:: cd ~/raphael-kit/c/2.1.9-2/ **Étape 3 :** Compilez le code. .. raw:: html .. code-block:: gcc 2.1.9_Joystick.c -o joystick -lwiringPi **Étape 4 :** Exécutez le fichier exécutable. .. raw:: html .. code-block:: ./joystick Après l’exécution du code, déplacez le joystick, les valeurs correspondantes de x, y et Btn s’affichent à l’écran. .. note:: Si cela ne fonctionne pas après l’exécution ou si un message d’erreur apparaît : « wiringPi.h: No such file or directory », veuillez vous référer à :ref:`install_wiringpi_pi5`. Code ---- .. code-block:: c #include #include #include #define SPI_CHANNEL 0 #define SPI_SPEED 1000000 // 1 MHz #define BtnPin 3 // WiringPi 3 = BCM GPIO22 // Lecture depuis le canal MCP3008 (0–7) int read_ADC(int channel) { if (channel < 0 || channel > 7) return -1; unsigned char buffer[3]; buffer[0] = 1; // Bit de démarrage buffer[1] = (8 + channel) << 4; // Configuration du canal buffer[2] = 0; wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3); int result = ((buffer[1] & 0x03) << 8) | buffer[2]; return result; } int main(void) { if (wiringPiSetup() == -1) { printf("Échec de l’initialisation de WiringPi !\n"); return 1; } if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { printf("Échec de l’initialisation du SPI !\n"); return 1; } pinMode(BtnPin, INPUT); pullUpDnControl(BtnPin, PUD_UP); while (1) { int x_val = read_ADC(0); // VRX sur CH0 int y_val = read_ADC(1); // VRY sur CH1 int btn_val = digitalRead(BtnPin); // Bouton SW printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val); delay(100); } return 0; } Explication du code ------------------- #. Cette section initialise les bibliothèques nécessaires pour la communication GPIO et SPI. .. code-block:: c #include #include #include #define SPI_CHANNEL 0 #define SPI_SPEED 1000000 // 1 MHz #define BtnPin 3 // WiringPi 3 = BCM GPIO22 #. Définit une fonction ``read_ADC()`` pour lire les données analogiques du MCP3008. Elle communique via SPI pour demander les données d’un canal donné (0–7), puis analyse la réponse pour obtenir un résultat ADC 10 bits. .. code-block:: c int read_ADC(int channel) { if (channel < 0 || channel > 7) return -1; unsigned char buffer[3]; buffer[0] = 1; buffer[1] = (8 + channel) << 4; buffer[2] = 0; wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3); int result = ((buffer[1] & 0x03) << 8) | buffer[2]; return result; } #. La fonction principale initialise les interfaces WiringPi et SPI, configure la broche du bouton du joystick et lit en continu les valeurs du joystick en les affichant sur la console. .. code-block:: c int main(void) { if (wiringPiSetup() == -1) { printf("Échec de l’initialisation de WiringPi !\n"); return 1; } if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { printf("Échec de l’initialisation du SPI !\n"); return 1; } pinMode(BtnPin, INPUT); pullUpDnControl(BtnPin, PUD_UP); while (1) { int x_val = read_ADC(0); // VRX vers CH0 int y_val = read_ADC(1); // VRY vers CH1 int btn_val = digitalRead(BtnPin); // SW vers GPIO22 printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val); delay(100); } return 0; } #. Dans ce programme : - Le VRX du joystick est connecté à CH0 du MCP3008. - Le VRY est connecté à CH1. - Le bouton (SW) est connecté à GPIO22 (broche 3 WiringPi). - La fonction ``read_ADC()`` est utilisée pour lire les valeurs analogiques de VRX et VRY. - La valeur numérique du bouton du joystick est lue avec ``digitalRead()``. - Toutes les valeurs sont affichées en continu toutes les 100 millisecondes.