Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Arduino - clavier matriciel anti-rebond

par Morgan

publié dans Arduino

Bonjour à tous,

 

Nous avons eu un tp sur l'arduino, le principe était de faire fonctionner ce clavier avec l'arduino :

http://www.lextronic.fr/doc/produit/img1_5319.jpg

vous trouverez plus d'information sur le clavier matriciel ici

 

1. Problématique

Comment faire fonctionner le clavier matriciel ?

2. Problèmes rencontrés

  • Déterminer les entrées/sorties du clavier matriciel (x0,x1,x2,x3,y0,y1,y2,y3)

    • Cela à été possible grâce aux fonctions :

      • PinMode(), pour déterminer si la pin est une entrée ou une sortie

      • DigitalWrite() pour modifier la valeur de la tension de la pin

      • DigitalRead() pour lire la valeur de la tension de la pin

  • Résistance de type "Pull-up" :

    • Lorsqu'on utilise une entrée numérique, il est important de s'assurer que le potentiel de l'entrée « au repos » est bien celui auquel on s'attend. En effet, si on laisse l'entrée « libre », c'est-à-dire câblée à rien, le potentiel qu'elle prendra ne sera pas nécessairement 0 V. On parle alors de potentiel flottant car l'électricité statique ambiante ou les perturbations électromagnétiques peuvent faire apparaitre des valeurs très fluctuantes. Pour s'assurer du bon fonctionnement, l'on utilise une liaison protégée par une résistance qui va « tirer vers le haut » (5 V) ou « tirer vers le bas » (0 V) le potentiel au repos, comme une sorte d'élastique. On utilise en général une résistance de 10 kOhms.

       

      • http://fr.flossmanuals.net/arduino/_booki/arduino/static/pullup.png
      • http://fr.flossmanuals.net/arduino/_booki/arduino/static/pulldown.png
      • dans un montage « tiré vers le haut » ou « pull-up », le potentiel de l'entrée au repos est 5 V.

      • dans un montage « tiré vers le bas » ou « pull-down », le potentiel de l'entrée au repos est 0 V.

    • Si la broche est configurée en ENTREE, écrire un niveau HAUT sur cette broche a pour effet d'activer la résistance interne de 20K de "rappel au plus" (pullup) sur cette broche.

  • Système anti-rebond :

    • Au niveau microscopique, lorsque l'on appuie sur le bouton poussoir, le contact n'est pas immédiat et le bouton poussoir, avant de se stabiliser, "rebondit".

    • La conséquence est une suite rapide de changement d'état ( "HAUT" / "BAS") que le programme considérera comme autant d'appuis successifs. D'après mes essaies il faut environs 150ms pour un "filtre anti rebond" efficasse.



 

 

3. Code source

 

/*
 *  Clavier matriciel avec anti-rebond
 * @File : Clavier_matriciel
 * @Date :  02/12/11
 */


// Je met mes caractères en variables global
char chaine[4][4]={'A','0','B','C',
                   '7','8','9','D',
                   '4','5','6','E',
                   '1','2','3','F'};


void setup() {

  // On initialise les pins
  pinMode(11, OUTPUT); // y3
  pinMode(10, OUTPUT); // y2
  pinMode(9, OUTPUT); // y1
  pinMode(8, OUTPUT); // y0
  pinMode(7, INPUT); // x3
  pinMode(6, INPUT); // x2
  pinMode(5, INPUT); // x1
  pinMode(4, INPUT); // x0

 //On "active" la résistance interne
  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);


}

void loop() {

  for (int Y = 8; Y <=11; Y++)
  {
    // On met les pin outpout à 5v
    digitalWrite(8, HIGH);
    digitalWrite(9, HIGH);
    digitalWrite(10, HIGH);
    digitalWrite(11, HIGH);

    // On met la pin étudié à 0V
    digitalWrite(Y, LOW);

    for (int X = 4; X <=7; X++)
    {
      // Si j'appuie sur une touche
      if(digitalRead(X) == LOW)  {
        Serial.println(chaine[X-4][Y-8]);
        delay(200);
        } //FSI
     }// for X

   } // For Y
}



Commenter cet article

ahamedbacar 16/01/2012 12:54


Salut 


Tu peux résoudre ton problème en utilisant une  solution logicielle en utilisant la boucle while, tu peux regarder mon bout de code que j'ai réalisé pour le projet suivant http://www.youtube.com/watch?v=82p-Kz9hgto . T'as accés à l'ensemble de mes projets sur le lien suivant http://www.youtube.com/user/ahamedBacar. 


Voici le code source qui peut résouvre ton souci.


#include


#include


 


// initialize the library with the numbers of the interface pins


LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


const byte ROWS = 4; //four rows


const byte COLS = 3; //three columns


char keys[ROWS][COLS] = {


{'1','2','3'},


{'4','5','6'},


{'7','8','9'},


{'#','0','*'}


};


byte rowPins[ROWS] = {43, 42, 41, 40}; //connect to the row pinouts of the keypad


byte colPins[COLS] = {46, 45, 44}; //connect to the column pinouts of the keypad


 


Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );


void affichageLcd(char key);


int nombre = 0,nombre2=0,resultat=0,touche1 =1;


void setup(){


  DDRC = 0xc0;


  PORTC = 0xc0;


  // set up the LCD's number of columns and rows: 


  lcd.begin(16, 2);


}


 


void loop(){


  char key = keypad.getKey();


 // char key2 = keypad.getKey();


  if (key != NO_KEY){


    affichageLcd(key);


  }


  testeInterrupteur();


  // (note: line 1 is the second row, since counting begins with 0):


 // lcd.setCursor(7, 0);


}


 


void affichageLcd(char key){


  if(key >= 48 && key