Arduino 2axis joystick button
Aller à la navigation
Aller à la recherche
Partie électronique
Le composant
Un joystick est composé de deux résistances variables accompagnées d'un bouton. Il ressemble à ceci :
Ce composant va permettre de faire varier une tension (différence de potentiel) sur l'axe X ainsi que sur l'axe Y. Il faut mémoriser la valeur de départ comme valeur de référence et on sait que le joystick à bougé que si la valeur est plus petite (bas ou gauche) ou plus grande (haut et droite) que cette valeur de référence.
Le montage
Le montage suivant permet de récupérer les valeurs retournées par le joystick et de les afficher.
Partie logicielle
Voila un exemple qui affiche les différentes valeurs du joystick sur la console.
const uint8_t UP=0;
const uint8_t DOWN=1;
const uint8_t LEFT=2;
const uint8_t RIGHT=3;
const uint8_t OFF=5;
// PIN analogiques
const uint8_t pinX = A0;
const uint8_t pinY = A1;
// Pin digital
const uint8_t pinSW = 2;
// Marge de sensibilité (+/-10% de la valeur de base)
uint8_t margin=10;
int16_t baseX, baseY, xValue, yValue;
uint16_t marginX, marginY;
void setup() {
Serial.begin(9600);
pinMode(pinSW, INPUT_PULLUP);
// On récupére la valeur de référence (Joystick au repos)
calibrate();
Serial.println(F("Calibration datas : "));
Serial.print(F("X base : "));
Serial.println(baseX);
Serial.print(F("Y base : "));
Serial.println(baseY);
Serial.print(F("X marge : "));
Serial.println(marginX);
Serial.print(F("Y marge : "));
Serial.println(marginY);
Serial.println(F("-------------"));
}
void loop(){
xValue = readXAxis();
if(xValue != OFF){
if(xValue == UP){
Serial.println(F("UP"));
}else{
Serial.println(F("DOWN"));
}
}
yValue = readYAxis();
if(yValue != OFF){
if(yValue == RIGHT){
Serial.println(F("RIGHT"));
}else{
Serial.println(F("LEFT"));
}
}
if(isSW()){
Serial.println(F("SW"));
}
if(xValue != OFF || yValue != OFF || isSW()){
Serial.println("-------------");
// Temps de pause entre lecture
delay(500);
}
}
uint8_t readXAxis(){
int16_t value = analogRead(pinX)-baseX;
if(abs(value) > marginX){
if(value > 0){
return UP;
}
return DOWN;
}
return OFF;
}
uint8_t readYAxis(){
int16_t value = analogRead(pinY)-baseY;
if(abs(value) > marginY){
if(value > 0){
return RIGHT;
}
return LEFT;
}
return OFF;
}
bool isSW(){
return digitalRead(pinSW) == 0;
}
void calibrate(){
baseX = analogRead(pinX);
baseY = analogRead(pinY);
marginX = baseX*margin/100;
marginY = baseY*margin/100;
}
Résultat
Voila le résultat :