Note

Bonjour et bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts sur Facebook ! Rejoignez d’autres passionnés pour approfondir vos connaissances sur le Raspberry Pi, Arduino et ESP32.

Pourquoi nous rejoindre ?

  • Support d’experts : Résolvez les problèmes post-vente et relevez les défis techniques grâce à 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 à des aperçus exclusifs.

  • Remises spéciales : Profitez de réductions exclusives sur nos produits les plus récents.

  • Promotions festives et cadeaux : Participez à des promotions spéciales et des concours pendant les périodes de fêtes.

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

2.1.6 Joystick

Note

../_images/mcp3008_and_adc0834.jpg

Selon la version de votre kit, identifiez si vous disposez du ADC0834 ou du MCP3008 et suivez la section correspondante.

Introduction

Dans ce projet, nous allons découvrir le fonctionnement d’un joystick. Nous allons manipuler le joystick et afficher les résultats sur l’écran.

Composants

../_images/image3171.png

Principe

Joystick

L’idée de base d’un joystick est de traduire les mouvements d’un levier en informations électroniques que l’ordinateur peut interpréter.

Pour transmettre une gamme complète de mouvements à l’ordinateur, un joystick doit mesurer la position du levier sur deux axes — l’axe X (de gauche à droite) et l’axe Y (de haut en bas). Comme en géométrie de base, les coordonnées X-Y déterminent exactement la position du levier.

Pour déterminer l’emplacement du levier, le système de contrôle du joystick surveille simplement la position de chaque axe. La conception conventionnelle d’un joystick analogique utilise deux potentiomètres, ou résistances variables.

Le joystick possède également une entrée numérique activée lorsque le levier est enfoncé.

../_images/image3181.png

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, nécessitant l’utilisation de l’ADC0834 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 bien vous pouvez également utiliser l’ADC pour les lire.

../_images/image3191.png ../_images/image3201.png

Procédures expérimentales

Étape 1 : Construisez le circuit.

../_images/image1931.png

Étape 2 : Accédez au dossier contenant le code.

cd ~/davinci-kit-for-raspberry-pi/c/2.1.6/

Étape 3 : Compilez le code.

gcc 2.1.6_Joystick.c -lwiringPi

Étape 4 : Exécutez le fichier exécutable.

sudo ./a.out

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

Note

Si le programme ne fonctionne pas après l’exécution, ou s’il y a un message d’erreur : « wiringPi.h: No such file or directory », veuillez vous référer à Le code C ne fonctionne pas ?.

Code

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

typedef unsigned char uchar;
typedef unsigned int uint;

#define     ADC_CS    0
#define     ADC_CLK   1
#define     ADC_DIO   2
#define     BtnPin    3

uchar get_ADC_Result(uint channel)
{
    uchar i;
    uchar dat1=0, dat2=0;
    int sel = channel > 1 & 1;
    int odd = channel & 1;

    digitalWrite(ADC_CLK, 1);
    delayMicroseconds(2);
    digitalWrite(ADC_CLK, 0);
    delayMicroseconds(2);

    pinMode(ADC_DIO, OUTPUT);
    digitalWrite(ADC_CS, 0);
    // Start bit
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    //Single End mode
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    // ODD
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,odd);  delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    //Select
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,sel);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);

    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);

    for(i=0;i<8;i++)
    {
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);    delayMicroseconds(2);
        pinMode(ADC_DIO, INPUT);
        dat1=dat1<<1 | digitalRead(ADC_DIO);
    }
    for(i=0;i<8;i++)
    {
        dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))<<i);
        digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
        digitalWrite(ADC_CLK,0);    delayMicroseconds(2);
    }
    digitalWrite(ADC_CS,1);
    pinMode(ADC_DIO, OUTPUT);
    return(dat1==dat2) ? dat1 : 0;
}
int main(void)
{
    uchar x_val;
    uchar y_val;
    uchar btn_val;
    if(wiringPiSetup() == -1){ // En cas d'échec de l'initialisation de wiringPi, affichage du message d'erreur
        printf("setup wiringPi failed !");
        return 1;
    }
    pinMode(BtnPin,  INPUT);
    pullUpDnControl(BtnPin, PUD_UP);
    pinMode(ADC_CS,  OUTPUT);
    pinMode(ADC_CLK, OUTPUT);

    while(1){
        x_val = get_ADC_Result(0);
        y_val = get_ADC_Result(1);
        btn_val = digitalRead(BtnPin);
        printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val);
        delay(100);
    }
    return 0;
}

Explication du Code

uchar get_ADC_Result(uint channel)
{
    uchar i;
    uchar dat1=0, dat2=0;
    int sel = channel > 1 & 1;
    int odd = channel & 1;

    digitalWrite(ADC_CLK, 1);
    delayMicroseconds(2);
    digitalWrite(ADC_CLK, 0);
    delayMicroseconds(2);

    pinMode(ADC_DIO, OUTPUT);
    digitalWrite(ADC_CS, 0);
    // Start bit
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    //Single End mode
    digitalWrite(ADC_CLK,0);
    digitalWrite(ADC_DIO,1);    delayMicroseconds(2);
    digitalWrite(ADC_CLK,1);    delayMicroseconds(2);
    ......

Le processus de fonctionnement de la fonction est détaillé dans la section 2.1.4 Potentiomètre.

while(1){
        x_val = get_ADC_Result(0);
        y_val = get_ADC_Result(1);
        btn_val = digitalRead(BtnPin);
        printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val);
        delay(100);
    }

VRX et VRY du joystick sont connectés à CH0 et CH1 de l’ADC0834 respectivement. La fonction getResult() est donc appelée pour lire les valeurs de CH0 et CH1. Ensuite, les valeurs lues sont stockées dans les variables x_val et y_val. De plus, la valeur de SW du joystick est lue et stockée dans la variable Btn_val. Enfin, les valeurs de x_val, y_val et Btn_val sont affichées avec la fonction printf().