Ardu? No!Les boutons ≫ Matrice carrée

Matrice carrée

C'est la matrice la plus utilisée.

Schéma pour la matrice carrée simple

Les boutons sont sur une grille de L lignes et de C colonnes, et on a besoin de L+C entrées sur la carte. La matrice devrait être la plus carrée possible (L et C égaux ou différents de 1). Par exemple pour 12 touches, une matrice 4x3 demande 7 broches, une 2x6 en demande 8 et une 1x12 en demande 13.

Pour lire un bouton, on commence par mettre toutes les broches en INPUT_PULLUP. Cette matrice peut être lue soit en sélectionnant ligne par ligne soit colonne par colonne.

Si une ligne est en sortie à LOW, et que l'on appuie sur un bouton de la ligne correspondante, la colonne du bouton qui était à HIGH grâce à la résistance de pull-up, va passer à LOW, et on peut ainsi détecter un appui.

Pour la programmation, beaucoup utilisent la bibliothèque Keypad. Mais on peut simplement lire les touches sans bibliothèque. Le programme qui suit affiche la ligne et la colonne du bouton pressé. Si il y en a plusieurs, on peut voir des lignes en trop car cette matrice n'est que stéréo.

// Matrice carrée, 16 boutons,
// Colonnes broches 4 à 7, lignes broches 8 à 11

void setup()
{
  Serial.begin(115200); // Régler aussi la console à 115200 bauds!
  for (byte broche=4; broche <=11; broche++) pinMode(broche, INPUT_PULLUP); // Repos, toutes les broches en INPUT_PULLUP
}


void loop()
{
  boolean appui=false; // devient true si une touche est appuyée
  for (byte ligne=8; ligne<=11; ligne++) // Pour toutes les lignes de la matrice
  {
    digitalWrite(ligne, LOW); // Passage de la ligne en sortie à LOW
    pinMode(ligne, OUTPUT);
    for (byte colonne=4; colonne<=7; colonne++) // Pour toutes les colonnes
      if (digitalRead(colonne) == LOW) // une touche est appuyée
      {
        Serial.print("appui ligne ");
        Serial.print(ligne-8);
        Serial.print(", colonne ");
        Serial.println(colonne-4);
        appui = true;
      }
    pinMode(ligne, INPUT_PULLUP); // Retour au repos de la ligne
  }
  if (!appui) Serial.println(); // Aucune touche appuyée
  delay(500); // Pas trop souvent
}

Extrait de la matrice triangulaire

En fait, c'est une partie de la matrice triangulaire. Sur une matrice triangulaire 6 bits, sur les 15 possibilités on ne va en utiliser que 9:

D0D1D2D3D4D5
D0N°1N°2N°3N°4N°5
D1N°1N°6N°7N°8N°9
D2N°2N°6N°10N°11N°12
D3N°3N°7N°10N°13N°14
D4N°4N°8N°11N°13N°15
D5N°5N°9N°12N°14N°15

Ce qui va beaucoup changer, c'est que les lignes et les colonnes sont sur des broches distinctes. On a besoin de plus d'entrées, mais cela va simplifier le code, et cela va nous permettre d'avoir une lecture poly, d'utiliser simplement les interruptions...

Bilan

- lecture plus simple qu'une matrice triangulaire
- pas de composants supplémentaires
- on trouve des claviers 4x3 ou 4x4 déja câblés
- il existe des bibliothèques prévues pour les matrices carrées
- utilisation d'interruption possible
- compromis correct broches/boutons
MAIS
- moins de boutons qu'avec une matrice triangulaire
- lecture stéréo

Du fait des bibliothèques existantes et des claviers pré-câblés, c'est une solution très utilisée si on a plus d'une dizaine de boutons. C'est la solution quasi universelle pour utiliser un clavier tout fait, que l'on pourrait utiliser an analogique ou en matrice triple pour économiser les broches.