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()