Skip to content

Clavier 4x4 : test simple lignes/colonnes

Schéma électrique

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 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. Il en résulte 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