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 [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, identifiez si vous disposez d’un ADC0834 ou d’un MCP3008 et suivez 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.

../_images/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 via les 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 de câblage

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 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, elles peuvent donc être lues directement via le GPIO ou encore via l’ADC.

../_images/schematic_2.1.9_joystick_mcp3008.png

Procédures expérimentales

Étape 1 : Construisez le circuit.

../_images/july24_2.1.9_joystick_mcp3008.png

Étape 2 : Accédez au dossier du code.

cd ~/raphael-kit/c/2.1.9-2/

Étape 3 : Compilez le code.

gcc 2.1.9_Joystick.c -o joystick -lwiringPi

Étape 4 : Exécutez l’exécutable.

./joystick

Après exécution du code, tournez le joystick, puis les valeurs correspondantes de x, y et Btn sont affichées à l’écran.

Note

Si cela ne fonctionne pas après exécution ou s’il y a un message d’erreur : « wiringPi.h : No such file or directory », veuillez vous référer à Installer et vérifier WiringPi.

Code

#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>

#define SPI_CHANNEL 0
#define SPI_SPEED   1000000  // 1 MHz
#define BtnPin      3        // WiringPi 3 = BCM GPIO22

// Lecture du 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 la configuration 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

  1. Cette section initialise les bibliothèques nécessaires pour la communication GPIO et SPI.

    #include <wiringPi.h>
    #include <wiringPiSPI.h>
    #include <stdio.h>
    
    #define SPI_CHANNEL 0
    #define SPI_SPEED   1000000  // 1 MHz
    #define BtnPin      3        // WiringPi 3 = BCM GPIO22
    
  2. Définit une fonction read_ADC() pour lire des données analogiques depuis le 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.

    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;
    }
    
  3. La fonction principale initialise les interfaces WiringPi et SPI, configure la broche du bouton du joystick et lit en continu les valeurs du joystick pour les afficher dans la console.

    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 la configuration 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;
    }