Skip to content

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 :

https://www.keyestudio.com/products/3pcs-lot-44-matrix-array-matrix-keyboard-16-key-membrane-switch-keypad-for-arduino-4x4-matrix-keyboard

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

Le code ci-dessus montre qu'un librairie est loin d'être indispensable !