12 Février 2016
Leçon 25 : le clavier matriciel


L'appui sur une touche fait communiquer une ligne avec une colonne.

Description
Les lignes sont des sorties. Les colonnes sont des entrées maintenues au niveau haut par une résistance interne à Arduino.
Le système envoie par balayage un niveau bas sur chaque ligne (1 seule à la fois) et balaye les colonnes en lecture.
Quand il lit un niveau bas, c'est que la colonne est reliée par une touche appuyée à la ligne qui est basse à ce moment.
On n'a pas besoin de programmer ce balayage : c'est la bibliothèque qui le fait.

Les fonctions
Si votre PC ne comprend pas la bibliothèque Keypad, il faut l'installer. Vous pouvez la récupérer
sur cette page
char waitForKey()
attend l'appui sur une touche. A éviter car il bloque le programme.
char getKey()
retourne la valeur de la clé pressée si elle existe. Ne bloque pas le programme.
sinon, elle retourne la constante NO_KEY.
char getState()
renvoie l'état d'une touche choisie.
la valeur renvoyée est une des constantes IDLE, PRESSED, RELEASED ou HOLD.
setHoldTime(unsigned int time)
définit le temps que doit durer l'appui sur une touche pour être pris en compte.
setDebounceTime(unsigned int time)
empêche la prise en compte d'un appui trop proche du précédent (anti-rebond).
Explication
Les fonctions renvoient des nombres qu'on compare à des constantes définies dans la bibliothèque.
exemple :
toto = getState(1); // état de la touche "1"
if (toto == PRESSED) { // on compare avec une constante prédéfinie
// traitement du cas où la touche est enfoncée.
}
1er programme
Chaque fois qu'on appuie sur une touche, on écrit son caractère dans le moniteur série.
/* clavier.ino découverte du clavier matriciel 16 touches lignes en 38 à 44 d'Arduino (paires seulement) colonnes en 46 à 52 */ #include <Keypad.h> // inclusion de la librairie pour clavier matriciel //--- Constantes utilisées avec le clavier 4x4 const byte LIGNES = 4; // 4 lignes const byte COLONNES = 4; // 4 colonnes // déclaration des broches --- const int L1=38; const int L2=40; const int L3=42; const int L4=44; const int C1=46; const int C2=48; const int C3=50; const int C4=52; //--- Définition des touches char touches[LIGNES][COLONNES] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; // tableaux de lignes et colonnes byte BrochesLignes[LIGNES] = {L1, L2, L3, L4}; byte BrochesColonnes[COLONNES] = {C1, C2, C3, C4}; char touche; // variable de stockage de la valeur de la touche appuyée // création d'un objet keypad = initialisation clavier Keypad clavier = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES ); // les broches de lignes sont automatiquement configurées en ENTREE avec pullup interne activé // les broches de colonnes sont automatiquement configurées en SORTIE void setup() { Serial.begin(9600); delay(10); // pause rapide pour laisser temps initialisation Serial.println("init OK") ; // affiche la chaîne texte - message de test delay(2000); // pause de 2 secondes } // fin de la fonction setup() void loop() { touche = clavier.getKey(); // lecture de la touche appuyée if (touche != NO_KEY){ // si une touche a été frappée -- gestion de la touche appuyée Serial.print(touche); Serial.print(" "); delay(300); // pause entre 2 appuis } // fin gestion de la touche appuyée } |
2ème programme
Au lieu d'afficher sur le moniteur série, vous écrivez sur l'afficheur enfichable sur la carte.
La touche # provoquera l'effacement de l'afficheur.
Voici le début du programme que vous devez finir.
/* clavier_et_afficheur.ino Affiche sur le shield LCD d'Arduino les touches tapées sur un clavier matriciel adaptation de l'exemple de Xavier Hinault */ #35;include <LiquidCrystal.h> // Inclusion de la librairie pour afficheur LCD #35;include <Keypad.h> // inclusion de la librairie pour clavier matriciel const byte LIGNES = 4; // 4 lignes const byte COLONNES = 4; //4 colonnes // déclaration des des broches --- const int L1=38; const int L2=40; const int L3=42; const int L4=44; const int C1=46; const int C2=48; const int C3=50; const int C4=52; //--- Définition des touches char touches[LIGNES][COLONNES] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; // tableaux de lignes et colonnes byte BrochesLignes[LIGNES] = {L1, L2, L3, L4}; //connexions utilisées pour les broches de lignes du clavier byte BrochesColonnes[COLONNES] = {C1, C2, C3, C4}; //connexions utilisées pour les broches de colonnes du clavier char touche; // variable de stockage valeur touche appuyée byte colonne, ligne; // --- Déclaration de l'afficheur LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // création d'un objet clavier Keypad clavier = Keypad( makeKeymap(touches), BrochesLignes, BrochesColonnes, LIGNES, COLONNES ); // les broches de lignes sont automatiquement configurées en ENTREE avec pullup interne activé // les broches de colonnes sont automatiquement configurées en SORTIE void setup() { // debut de la fonction setup() colonne = 0; ligne = 0; lcd.begin(16, 2); // Initialise le LCD avec 16 colonnes x 2 lignes delay(10); // pause rapide pour laisser temps de l'initialisation // Test de l'afficheur lcd.print("init OK") ; delay(2000); // pause de 2 secondes lcd.clear(); // efface l'écran et met le curseur en haut à gauche delay(10); // pour laisser temps d'exécuter le Clear() } // fin de la fonction setup() void loop() { // debut de la fonction loop() touche = clavier.getKey(); ---- A COMPLÉTER --- } |
Essayez d'améliorer ce programme. Actuellement, il n'écrit que sur la première ligne. Faites le passer à la seconde ligne quand la première est pleine.
3ème programme
Vous sauvegardez votre programme sous le nom "clavier_et_afficheur_2.ino"
Vous le modifiez pour que la touche "*" efface le dernier caractère entré.
/* clavier_et_afficheur_2.ino étoile utilisée comme Retour-Arrière */ void loop() { // debut de la fonction loop() touche = clavier.getKey(); switch(touche) { case (NO_KEY) : case ('#') : case ('*') : default : } |
Traitez d'abord le cas général de l'effacement d'un caractère dans une ligne.
Étudiez ensuite le cas particulier de l'effacement du dernier caractère de la 1ère ligne.
haut de la page

