12 Février 2016


Leçon 25 : le clavier matriciel

pas FB
clavier 16 touches
Ce clavier comprend 16 touches disposées en 4 lignes et 4 colonnes.
L'appui sur une touche fait communiquer une ligne avec une colonne.

matrice du clavier

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.

schéma du clavier souple

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

flèche gauche Retour à la leçon 24           Page Suivante : le détecteur à ultra-sons flèche droite