Arduino - clavier matriciel anti-rebond
Bonjour à tous,
Nous avons eu un tp sur l'arduino, le principe était de faire fonctionner ce clavier avec l'arduino :
vous trouverez plus d'information sur le clavier matriciel ici
Comment faire fonctionner le clavier matriciel ?
-
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.
-
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.
-
/*
* 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
}