Arduino 2axis joystick button

De The Linux Craftsman
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 :

2 axis joystick.jpg
2 axis joystick desc.jpg

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.

Joystick diagram.png

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 :

Arduino joystick reading serial.png