Introduction

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.

Comment fonctionne un keypad ?

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.

Librairie du digicode

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 :

Afficher les chiffres appuyés sur le moniteur série

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 :

  • Les boutons de 1 à 8 permettent d’allumer les leds bleus.
  • Le bouton 9 lui allume toute les leds bleus.
  • Le bouton 0 éteint toute les leds.
  • Les boutons A à D allument les 4 leds rouges
  • Le bouton * allume toutes les leds rouges.
  • Le bouton # éteint toutes les leds rouges.
#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);
}