Joy-PI Leçon #18 : Matrice de boutons

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

Laisser un commentaire