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
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
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é.
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.
Procédures expérimentales
Étape 1 : Construisez le circuit.
É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().