Pour l’Arduino et le Raspberry Pi, il existe des matrices de claviers qui peuvent être connectées et lues relativement facilement. Similaires au pavé numérique d’un clavier, ces claviers ont 3×4 ou 4×4 touches. Ces modules peuvent être utilisés, par exemple, comme serrures à code ou pour la construction d’une petite calculatrice de poche. Avec l’aide de quelques petites modifications, il est même possible de créer un clavier T9, avec lequel on peut taper des textes comme sur les anciens téléphones mobiles.
Dans ce tutoriel, je vais montrer la connexion d’une telle matrice de claviers et comment les lire facilement avec les GPIOs. Afin d’utiliser moins de GPIOs, il est également possible de la connecter via le Port Expander I2C MCP23017.
Pièces de matériel requises
Comme je l’ai déjà mentionné, il existe plusieurs modèles différents de ces « interrupteurs à membrane », qui se distinguent principalement par leur taille et leur étiquetage. Dans ce tutoriel, j’ai utilisé un clavier 3×4, mais il n’y a aucun problème pour l’adapter à un clavier 4×4 (ou plus grand).
Les modèles suivants sont disponibles :
- Matrice de clavier 3×4
- Matrice de claviers 4×4
- variantes spéciales du clavier 4×4 avec lettres imprimées (style T9)
Vous devriez également avoir des câbles jumper mâle-femelle sous la main.
Peu importe le modèle de Raspberry Pi que vous utilisez, tant que vous avez au moins 7 ou 8 GPIO inutilisés.
Connexion et fonction du clavier du Raspberry Pi
En principe, tous les GPIOs libres et contrôlables peuvent être choisis pour cela. Selon que vous avez une membrane de matrice 3×4 ou 4×4, 7 ou 8 broches seront occupées. Les câbles jumper mâle-femelle, qui s’insèrent dans les bornes du clavier, sont les mieux adaptés. La structure de base d’une telle matrice de clavier est la suivante :
Les 4 premières broches en partant de la gauche sont ici pour les lignes, les 3 ou 4 autres connexions pour une colonne. Dès qu’une touche est enfoncée, deux lignes sont connectées. Pour savoir et, le cas échéant, quelle touche a été pressée, un signal est envoyé dans chaque cas par les quatre premières lignes. Les autres broches sont « tapées ».
Si, par exemple, seule la touche 6 a été enfoncée, les lignes « ligne 2 » et « colonne 3 » seront connectées. Ainsi, si nous envoyons un flux au GPIO de la ligne 2, seul un signal haut sera reçu au GPIO de la colonne 3. Tous les autres GPIOs ne reçoivent aucun signal. Donc en envoyant un signal à travers toutes les lignes et en vérifiant ensuite toutes les colonnes, nous pouvons dire si une touche a été pressée et bien sûr laquelle.
Comme déjà mentionné, les 7 ou 8 GPIOs utilisés n’ont pas d’importance, mais cela doit être ajusté plus tard dans le code si nécessaire. Dans cet exemple, j’utilise un clavier 3×4, donc je n’ai que 7 GPIOs à allouer. De gauche à droite, l’occupation est la suivante :
3×4 Keypad | Raspberry Pi |
---|---|
Pin 1 | GPIO 7 (Pin 26) |
Pin 2 | GPIO 8 (Pin 24) |
Pin 3 | GPIO 11 (Pin 23) |
Pin 4 | GPIO 25 (Pin 22) |
Pin 5 | GPIO 9 (Pin 21) |
Pin 6 | GPIO 10 (Pin 19) |
Pin 7 | GPIO 15 (Pin 10) |
Schematically it looks like this:
Code de pilotage du clavier
Pour pouvoir utiliser le petit clavier ensuite, nous nous chargeons d’une petite bibliothèque de GitHub. D’abord nous créons un dossier.
mkdir keypad-rpi && cd keypad-rpi
Ensuite nous téléchargeons le fichier :
wget -O keypad.py https://raw.githubusercontent.com/rainierez/MatrixKeypad_Python/master/matrix_keypad/RPi_GPIO.py
Si vous utilisez un clavier 4×4 ou des GPIOs différents des miens, vous devrez ajuster les numéros GPIO dans le code en conséquence
(sudo nano keypad.py
).
Nous pouvons ensuite utiliser cette classe. Pour clarifier la fonctionnalité, j’ai créé un petit exemple. Pour le copier, créez un nouveau fichier
sudo nano exemple.py
avec le code suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import time import RPi.GPIO as GPIO from keypad import keypad GPIO.setwarnings(False) if __name__ == '__main__': # Initialize kp = keypad(columnCount = 3) # waiting for a keypress digit = None while digit == None: digit = kp.getKey() # Print result print digit time.sleep(0.5) ###### 4 Digit wait ###### seq = [] for i in range(4): digit = None while digit == None: digit = kp.getKey() seq.append(digit) time.sleep(0.4) # Check digit code print(seq) if seq == [1, 2, 3, '#']: print "Code accepted" |
Vous pouvez enregistrer et quitter le fichier avec CTRL + O, CTRL + X.
Si nous exécutons le fichier ensuite, les entrées peuvent être sélectionnées.
sudo python exemple.py
Dans la vidéo suivante, vous pouvez voir à quoi peut ressembler la lecture des chiffres :