Clavier matriciel 4x4¶
Description¶
Un clavier matriciel est un dispositif d'entrée mécanique multi-voies.
Principe¶
Le principe est celui de boutons poussoirs répartis en lignes x colonnes.
Modèles¶
Plusieurs modèles possibles (peu importe) :
Le clavier à touches rigides avec connecteur à souder :

https://www.gotronic.fr/art-clavier-economique-kb16m-4379.htm
Le clavier souple avec connecteur femelle :

Le montage¶
On connecte :
| clavier | Pi Pico | 
|---|---|
| L1 | 9 | 
| L2 | 8 | 
| L3 | 7 | 
| L4 | 6 | 
| C1 | 13 | 
| C2 | 12 | 
| C3 | 11 | 
| C4 | 10 | 
Débrouillages dans l'interpréteur¶
# dict
broches = {"L1": 9, "L2": 8, "L3": 7,"L4": 6, "C1": 13, "C2": 12, "C3": 11,"C4": 10}
data.get("L1") #9
# variables
L1,L2,L3,L4=9,8,7,6
C1,C2,C3,C4=13,12,11,10
lignes=[L1,L2,L3,L4]
colonnes=[C1,C2,C3,C4]
# équivalent en 1 fois
lignes=[9,8,7,6]
colonnes=[13,12,11,10]
touches=[['1','2','3','A'],['4','5','6','B'],['7','8','9','C'],['*','0','#','D']]
Le code¶
- Les 4 broches de colonnes sont en sortie.
- Les 4 broches de lignes sont en entrée avec le rappel au plus activé (PULLUP)
Le principe consiste à mettre au niveau HAUT les broches de colonnes par défaut puis à en mettre une à BAS isolément et tester toutes les lignes dans ce cas. 
A l'aide d'un timer, on "scanne" à intervalle régulier les broches de la carte MicroPython :
from machine import Pin, Timer
# déclarations
lignes=[9,8,7,6]
colonnes=[13,12,11,10]
touches=[['1','2','3','A'],['4','5','6','B'],['7','8','9','C'],['*','0','#','D']]
saisie=""
appui=0 # appui sur niveau bas
timer=Timer()
# initialisations
for pin in lignes:
    Pin(pin,Pin.IN, Pin.PULL_UP) # met les lignes en entrée avec pullup actif
for pin in colonnes:
    Pin(pin,Pin.OUT) # met les colonnes en sortie
    Pin(pin).on() # colonnes HIGH par defaut
## code exécuté en boucle
def loop(timer): # il faut que loop soit bcp plus court que période rappel
    global saisie # variable de saisie
    for idxc, colonne in enumerate(colonnes):
        Pin(colonne).off() # colonne courante à LOW
        for idxl, ligne in enumerate(lignes):
            if Pin(ligne).value()==appui :
                touche=touches[idxl][idxc]
                print(touche)
                saisie=saisie+touche
                print (saisie)
        Pin(colonne).on() # remet colonne courante à HIGH
timer.init(freq=4, callback=loop) # rappelle loop
# frequence pas trop élevée vaut anti-rebond
Librairies¶
- Une librairie micropython pour clavier matriciel (keypad matrix) ici : https://github.com/BrendanSimon/micropython_experiments/tree/master/keypad
Le code ci-dessus montre qu'un librairie est loin d'être indispensable !