
Si chaque bouton devait être connecté une un entrée, 16 GPIO seraient réservés pour ces boutons.
Pour réduire le nombre de connexions, on utilise un clavier matriciel, construit selon le schéma ci-dessous, comme son nom l’indique, c’est une matrice d’interrupteurs, identifiés par des lignes et des colonnes.
Le principe de lecture d’une touche est de mettre une tension sur une colonne, l’une après l’autre, et de lire ensuite les 4 lignes. Si un interrupteur est pressé, alors une entrée indiquera un ‘1’,
Par exemple, on presse la touche SW7. Lorsqu’une tension est appliquée sur l’entrée Col3, on lira une ‘1’ sur l’entrée Row2.
Il suffit ensuite de faire une correspondance entre l’interrupteur pressé et un nombre, une lettre ou un symbole.

Commutateurs :
Tous les interrupteurs du bloc de gauche doivent être sur ON.
Le logiciel
Nous allons à nouveau utiliser une classe, proposée par stenobot.
Le pseudo-code :
- Importation des librairies
- Classe ButtonMatrix
- Instanciation d’un clavier
- Dans une boucle infinie (arrêt avec CTRL-C) :
- Tester le tilt
En python :
# Author : original author stenobot
# Original Author Github: https://github.com/stenobot/SoundMatrixPi
import RPi.GPIO as GPIO
import time
class ButtonMatrix():
def __init__(self):
GPIO.setmode(GPIO.BOARD)
# Disposition des touches
self.buttonIDs = [[4,3,2,1],[8,7,6,5],[12,11,10,9],[16,15,14,13]]
# Broches des lignes
self.rowPins = [13,15,29,31]
# Broches des colonnes
self.columnPins = [33,35,37,22]
# Entrées
for i in range(len(self.rowPins)):
GPIO.setup(self.rowPins[i], GPIO.IN, pull_up_down = GPIO.PUD_UP)
# Sorties
for j in range(len(self.columnPins)):
GPIO.setup(self.columnPins[j], GPIO.OUT)
GPIO.output(self.columnPins[j], 1)
def activateButton(self, rowPin, colPin):
# Affiche le texte du bouton pressé
btnIndex = self.buttonIDs[rowPin][colPin] - 1
print("button " + str(btnIndex + 1) + " pressed")
# Attente
time.sleep(.3)
def buttonHeldDown(self,pin):
if(GPIO.input(self.rowPins[pin]) == 0):
return True
return False
def main():
# Clavier
buttons = ButtonMatrix()
try:
while(True):
for j in range(len(buttons.columnPins)):
# Chque sortie = 0 l'une après l'autre
GPIO.output(buttons.columnPins[j],0)
for i in range(len(buttons.rowPins)):
if GPIO.input(buttons.rowPins[i]) == 0:
buttons.activateButton(i,j)
# Attend que le bouton soit relâché
while(buttons.buttonHeldDown(i)):
pass
GPIO.output(buttons.columnPins[j],1)
except KeyboardInterrupt:
GPIO.cleanup()
if __name__ == "__main__":
main()