LE CLAVIER
Le clavier est généralement constitué de 12 ou 16 touches. L’encodage d’un clavier consiste à délivrer un code (en général sur un octet) fonction de la touche activée. Il existe deux types d'encodage de claviers, dépendant de la structure mécanique du clavier utilisé :
-
Le clavier simple
Dans ce cas, le clavier est organisé de manière à ce que toutes ses touches partagent une borne commune (la masse sur le schéma). L'identification de la touche enfoncée se fait en scrutant individuellement toutes les touches jusqu'à ce qu'on détecte un changement d'état dans l'une d'elles. Cette technique est relativement simple, mais le nombre de lignes d'entrée/sortie requis pour le microcontrôleur est égal au nombre de touches, et peut excéder rapidement la capacité du microcontrôleur.
-
Le clavier matriciel
Dans ce cas, le clavier est organisé en une matrice, et c'est l'intersection d'une ligne avec une colonne qui permet d'identifier la touche enfoncée. Avec un clavier matriciel, le nombre de lignes d’entrée/sortie est égal à la somme du nombre de colonnes et du nombre de lignes.
L’identification de la touche enfoncée peut se faire de deux façons :
-
Nous générons un niveau bas sur la 1ère colonne tandis que les autres colonnes restent au niveau haut. Puis, nous décalons le niveau bas sur la 2nde colonne en laissant un niveau haut sur les autres colonnes. Nous balayons indéfiniment et rapidement toutes les colonnes avec ce niveau bas et le microcontrôleur scrute en permanence le niveau sur les lignes. Lorsqu’une touche est enfoncée, la colonne et la ligne correspondante à la touche enfoncée sont toutes les deux au niveau bas. Des résistances de tirage sont nécessaires sur les lignes afin d’imposer un niveau haut sur le port d’entrée/sortie du microcontrôleur lorsqu'aucune touche n’est enfoncée.
-
Nous envoyons un niveau bas simultanément sur chaque colonne et nous lisons le niveau sur chaque ligne. Si une touche est enfoncée, un niveau bas apparaîtra sur la ligne correspondante. Nous renvoyons alors le code lu des lignes vers les colonnes, ce qui fera apparaître un niveau bas dans l’une d’elles. Les positions des deux "0" lus donnent les coordonnées de la touche recherchée. Cette technique est potentiellement plus rapide que la précédente (2 étapes au lieu de N, N étant le nombre de colonnes), mais elle demande des résistances de tirage aussi bien pour les lignes que pour les colonnes.
Dans l'univers Arduino, le clavier est principalement utilisé pour saisir un code, paramétrer une consigne.
Il existe une bibliothèque qui gère l'encodage d'un clavier matriciel. La bibliothèque peut être téléchargée ici et ses principales fonctions sont :
-
Keypad clavier = Keypad( makeKeymap(code), broches_lignes, broches_colonnes, lignes, colonnes) où makeKeymap(code) représente le code ASCII des touches, broches_lignes les numéros de broche de l’Arduino reliées aux lignes du clavier, broches_colonnes les numéros des broches de l'Arduino reliées aux colonnes, lignes le nombre de lignes du clavier et colonnes le nombre de colonnes du clavier. Cette fonction permet de créer l'objet (clavier dans notre écriture).
-
clavier.getKey() qui permet de récupérer le code de la touche.
Exemple :
Nous souhaitons afficher sur le moniteur série le code de la touche activée.
Liste du matériel :
-
1 Arduino Uno
-
1 plaquette d'essai
-
1 clavier matriciel 12 touches
Câblage :
Programme :
/* Clavier est un programme qui affiche la touche activée d'un clavier matriciel dans le moniteur série */
#include <Keypad.h> // appel de la bibliothèque
#define L1 2 // affectation des broches
#define L2 3
#define L3 4
#define L4 5
#define C1 6
#define C2 7
#define C3 8
const byte lignes = 4; // 4 lignes
const byte colonnes = 3; // 3 colonnes
char code[lignes][colonnes] = { // code des touches
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte broches_lignes[lignes] = {L1, L2, L3, L4}; // connexion des lignes
byte broches_colonnes[colonnes] = {C1, C2, C3}; // connexion des colonnes
Keypad clavier = Keypad( makeKeymap(code), broches_lignes, broches_colonnes, lignes, colonnes); // création de l'objet clavier
void setup()
{
Serial.begin(9600); // initialisation du moniteur série
}
void loop()
{
touche = clavier.getKey(); // acquisition de la touche
if (touche != NO_KEY) // si appui sur une touche
{
Serial.println(touche); // affichage du code dans le moniteur série
}
}