Un clavier matriciel, tel qu’un digicode, est composé d’une grille de boutons. Chaque appui sur une touche établit une connexion électrique unique, identifiable par un microcontrôleur comme la Raspberry Pi Pico. Les lignes et les colonnes de cette grille sont reliées aux entrées du microcontrôleur, permettant ainsi de déterminer avec précision quelle touche a été pressée. Ce système ingénieux permet de gérer un grand nombre de boutons avec un nombre réduit de broches d’entrée.
Le keypad est structuré en une matrice de touches, chaque touche étant positionnée à l’intersection d’une ligne et d’une colonne. Lorsqu’une touche est pressée, elle relie électriquement la ligne et la colonne correspondantes. La Raspberry PICO détermine quelle touche a été actionnée en parcourant systématiquement chaque ligne. En mettant une ligne à la masse, la Raspberry vérifie si une colonne passe également à la masse. Si c’est le cas, cela indique qu’une touche située à l’intersection de cette ligne et de cette colonne a été enfoncée.
Pour pouvoir faire les projets que l’on vous propose vous aurez besoin de la librairie keypad. On va voir tout de suite comment l’installer.
La bibliothèque Keypad vous permettra de faire fonctionner toute matrice de boutons.
Pour commencer, il vous faut d’abord télécharger cette bibliothèque.
Une fois le téléchargement effectué, ouvrez le logiciel Arduino IDE et allez dans le gestionnaire de bibliothèques. Sélectionnez ensuite l’option pour ajouter des bibliothèques au format ZIP :
Ensuite on sélectionne la librairie précédemment téléchargée. Puis on reçoit un message qui nous indique que la librairie a bien été installée :
Voici le schéma du circuit permettant de faire fonctionner le digicode avec la Raspberry PICO :
Le programme que l’on vous propose permet d’allumer une led pour chaque bouton du digicode :
#include <Keypad.h>
const uint8_t LEDS = 12;
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
// Pins connected to LED1, LED2, LED3, ...LED12
uint8_t ledPins[LEDS] = { 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 28, 27 };
uint8_t rowPins[ROWS] = { 26, 22, 21, 20 }; // Pins connected to R1, R2, R3, R4
uint8_t colPins[COLS] = { 19, 18, 17, 16 }; // Pins connected to C1, C2, C3, C4
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
void setup() {
for (uint8_t l = 0; l < LEDS; l++) {
pinMode(ledPins[l], OUTPUT);
digitalWrite(ledPins[l], LOW);
}
}
void loop() {
char key = keypad.getKey();
if (key != NO_KEY) {
switch (key) {
case '1': digitalWrite(ledPins[0], HIGH);
break;
case '2': digitalWrite(ledPins[1], HIGH);
break;
case '3': digitalWrite(ledPins[2], HIGH);
break;
case '4': digitalWrite(ledPins[3], HIGH);
break;
case '5': digitalWrite(ledPins[4], HIGH);
break;
case '6': digitalWrite(ledPins[5], HIGH);
break;
case '7': digitalWrite(ledPins[6], HIGH);
break;
case '8': digitalWrite(ledPins[7], HIGH);
break;
case '9':
for (uint8_t l = 0; l < 8; l++) {
digitalWrite(ledPins[l], HIGH);
}
break;
case '0':
for (uint8_t l = 0; l < 8; l++) {
digitalWrite(ledPins[l], LOW);
}
break;
case 'A': digitalWrite(ledPins[8], HIGH);
break;
case 'B': digitalWrite(ledPins[9], HIGH);
break;
case 'C': digitalWrite(ledPins[10], HIGH);
break;
case 'D': digitalWrite(ledPins[11], HIGH);
break;
case '*':
for (uint8_t l = 8; l < 12; l++) {
digitalWrite(ledPins[l], HIGH);
}
break;
case '#':
for (uint8_t l = 8; l < 12; l++) {
digitalWrite(ledPins[l], LOW);
}
break;
}
}
delay(10);
}