Bouton/joystick 5 positions sur une seule entrée Arduino

Bonjour,

Aujourd'hui, nous allons nous pencher sur un bouton / joystick de navigation à 5 positions mais surtout, nous n'allons utiliser qu'une seule entrée analogique pour détecter les différentes positions.
C'est donc un montage idéal pour les mini plateformes avec peu d'I/O
Bouton de Navigation + Click
La bonne nouvelle, c'est que ce montage fonctionne aussi bien en 5V qu'en 3.3V. Pour autant que le convertisseur analogique digital soit en 10bits (valeur de 0 à 1023)... ce qui est habituellement la cas.
Commençons par le schéma de principe, le but est d'avoir une tension différente pour chaque bouton pressé !

Interface 5 boutons sur entrée analogique
Détecter la broche le commun

Ceux d'entre-vous qui ont déjà eu ce bouton en main savent qu'il est entièrement symétrique... et qu'il faut donc utiliser le multimètre, sur la position "test de continuité", pour détecter le commun.

Le commun est en bas à droite (et identifier) quand il y a un test de continuité avec la broche en haut à droite lorsque le bouton est pressé...


Sinon faire une rotation de 180° au bouton bouton et refaire le test!

Une fois le commun trouvé, les fonctions se présentent comme suit:

Raccorder

Ensuite l'assemblage utilisant une seule entrée analogique:
Décodage
L'utilisation Arduino se fait très simplement en utilisant quelques définition et une fonction:

#define BTN_NONE   0
#define BTN_CLICK  1
#define BTN_UP     2
#define BTN_DOWN   3
#define BTN_LEFT   4
#define BTN_RIGHT  5

int buttonValue = 0; // Analog input value
byte read_analog_button( int pin ){
  // put your main code here, to run repeatedly:
  buttonValue = analogRead( pin );
  Serial.println( buttonValue );
  //debug: Serial.println( buttonValue );
  if( buttonValue > 760 ) {
    return BTN_CLICK; }
  else if( buttonValue > 580 ) {
    return BTN_RIGHT; }
  else if( buttonValue > 400 ) {
    return BTN_UP; }
  else if( buttonValue > 220 ) {
    return BTN_LEFT;}
  else if( buttonValue > 100 ) {
    return BTN_DOWN; }
  else {
    return BTN_NONE;
  }
}

Un programme d'exemple complet 
Voici un simple programme de test qui utilise le montage sur la broche analogique A3 d'une Arduino Uno.

// Analog Button Testing sketch
//
// Running on Arduino UNO, using analog input A3 with joystick button.
// See Wiring available next to the code 

#define buttonPin A3

void setup() {
  // put your setup code here, to run once:
  Serial.begin( 9600 );
  Serial.println( 'Ready.' );
}


#define BTN_NONE   0
#define BTN_CLICK  1
#define BTN_UP     2
#define BTN_DOWN   3
#define BTN_LEFT   4
#define BTN_RIGHT  5

int buttonValue = 0; // Analog input value
byte read_analog_button( int pin ){
  // put your main code here, to run repeatedly:
  buttonValue = analogRead( pin );
  Serial.println( buttonValue );
  //debug: Serial.println( buttonValue );
  if( buttonValue > 760 ) {
    return BTN_CLICK; }
  else if( buttonValue > 580 ) {
    return BTN_RIGHT; }
  else if( buttonValue > 400 ) {
    return BTN_UP; }
  else if( buttonValue > 220 ) {
    return BTN_LEFT;}
  else if( buttonValue > 100 ) {
    return BTN_DOWN; }
  else {
    return BTN_NONE;
  }
}

byte btn;
void loop() {
  // put your main code here, to run repeatedly:
  btn = read_analog_button( buttonPin );
  Serial.print( btn );
  Serial.print( " : " );
  if( btn == BTN_UP )
     Serial.println( "Up" );
  else if( btn == BTN_DOWN )
     Serial.println( "Down" );
  else if( btn == BTN_RIGHT )
     Serial.println( "->" );
  else if( btn == BTN_LEFT )
     Serial.println( "<-" );
  else if( btn == BTN_CLICK )
     Serial.println( "Click!");
  else
     Serial.println( "..." );
     
  Serial.println( "-------------------" );
  delay( 500 ); 
}
Bonne lecture, Dominique

Aucun commentaire