.. note::
Bonjour et bienvenue dans la communauté SunFounder dédiée aux passionnés de Raspberry Pi, Arduino et ESP32 sur Facebook ! Explorez en profondeur les possibilités offertes par ces technologies avec d'autres amateurs éclairés.
**Pourquoi nous rejoindre ?**
- **Support d'experts** : Résolvez les problèmes après-vente et surmontez les défis techniques grâce à l'aide de notre communauté et de notre équipe.
- **Apprendre & Partager** : Échangez des astuces et des tutoriels pour perfectionner vos compétences.
- **Aperçus exclusifs** : Bénéficiez d'un accès anticipé aux nouvelles annonces de produits et aux avant-premières.
- **Réductions spéciales** : Profitez de réductions exclusives sur nos produits les plus récents.
- **Promotions festives et cadeaux** : Participez à des concours et des promotions spéciales à l'occasion des fêtes.
👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] pour nous rejoindre dès aujourd'hui !
.. _py_pi5_keypad:
2.1.5 Pavé numérique
========================
Introduction
-----------------
Un pavé numérique est un tableau rectangulaire de boutons. Dans ce projet,
nous allons l'utiliser pour saisir des caractères.
Composants nécessaires
-------------------------
Pour ce projet, nous aurons besoin des composants suivants.
.. image:: ../python_pi5/img/2.1.5_keypad_list.png
.. raw:: html
Schéma de circuit
---------------------
.. image:: ../python_pi5/img/2.1.5_keypad_chematic_1.png
.. image:: ../python_pi5/img/2.1.5_keypad_chematic_2.png
Procédure expérimentale
--------------------------
**Étape 1 :** Construisez le circuit.
.. image:: ../python_pi5/img/2.1.5_keypad_circuit.png
**Étape 2 :** Ouvrez le fichier de code.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**Étape 3 :** Exécutez le code.
.. raw:: html
.. code-block::
sudo python3 2.1.5_Keypad.py
Une fois le code lancé, les valeurs des boutons pressés sur le pavé
numérique (valeur des boutons) s'afficheront à l'écran.
.. warning::
En cas d'erreur ``RuntimeError: Cannot determine SOC peripheral base address``, veuillez consulter :ref:`faq_soc`.
**Code**
.. note::
Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci-dessous. Mais avant cela, assurez-vous de vous rendre dans le répertoire source, tel que ``davinci-kit-for-raspberry-pi/python-pi5``. Après modification, vous pouvez exécuter le code pour observer le résultat.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import DigitalOutputDevice, Button
from time import sleep
class Keypad:
def __init__(self, rows_pins, cols_pins, keys):
"""
Initialize the Keypad with specified row and column pins and keypad layout.
:param rows_pins: List of GPIO pins for the rows.
:param cols_pins: List of GPIO pins for the columns.
:param keys: List of keys in the keypad layout.
"""
# Initialisation des broches de lignes comme DigitalOutputDevice
self.rows = [DigitalOutputDevice(pin) for pin in rows_pins]
# Initialisation des broches de colonnes comme Boutons
self.cols = [Button(pin, pull_up=False) for pin in cols_pins]
self.keys = keys # Définir la disposition des touches du pavé
def read(self):
"""
Read the currently pressed keys on the keypad.
:return: A list of pressed keys.
"""
pressed_keys = []
# Parcourt chaque ligne et colonne pour identifier les touches pressées
for i, row in enumerate(self.rows):
row.on() # Activer la ligne actuelle
for j, col in enumerate(self.cols):
if col.is_pressed: # Vérifier si le bouton de la colonne est pressé
# Calculer l'index de la touche en fonction de la ligne et de la colonne
index = i * len(self.cols) + j
pressed_keys.append(self.keys[index])
row.off() # Désactiver la ligne actuelle
return pressed_keys
try:
# Configuration des broches de lignes, colonnes et disposition des touches
rows_pins = [18, 23, 24, 25]
cols_pins = [10, 22, 27, 17]
keys = ["1", "2", "3", "A",
"4", "5", "6", "B",
"7", "8", "9", "C",
"*", "0", "#", "D"]
# Crée une instance de la classe Keypad
keypad = Keypad(rows_pins, cols_pins, keys)
last_key_pressed = []
# Lecture continue du pavé et affichage des touches nouvellement pressées
while True:
pressed_keys = keypad.read()
if pressed_keys and pressed_keys != last_key_pressed:
print(pressed_keys) # Afficher la liste des touches pressées
last_key_pressed = pressed_keys
sleep(0.1) # Petite pause pour réduire la charge du CPU
except KeyboardInterrupt:
# Gérer une interruption clavier (Ctrl+C) pour une sortie propre
pass
**Explication du code**
#. Importation des classes ``DigitalOutputDevice`` et ``Button`` de la bibliothèque ``gpiozero`` et de la fonction ``sleep`` pour les temporisations.
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import DigitalOutputDevice, Button
from time import sleep
#. Définition de la classe ``Keypad``. La méthode ``__init__`` initialise le pavé avec les broches de lignes, de colonnes et les touches spécifiées. La méthode ``read`` parcourt le pavé et retourne la liste des touches pressées.
.. code-block:: python
class Keypad:
def __init__(self, rows_pins, cols_pins, keys):
"""
Initialize the Keypad with specified row and column pins and keypad layout.
:param rows_pins: List of GPIO pins for the rows.
:param cols_pins: List of GPIO pins for the columns.
:param keys: List of keys in the keypad layout.
"""
self.rows = [DigitalOutputDevice(pin) for pin in rows_pins]
self.cols = [Button(pin, pull_up=False) for pin in cols_pins]
self.keys = keys
def read(self):
"""
Read the currently pressed keys on the keypad.
:return: A list of pressed keys.
"""
pressed_keys = []
# Scan each row and column to identify pressed keys
for i, row in enumerate(self.rows):
row.on() # Enable the current row
for j, col in enumerate(self.cols):
if col.is_pressed: # Check if the column button is pressed
# Calculate the key index based on row and column
index = i * len(self.cols) + j
pressed_keys.append(self.keys[index])
row.off() # Disable the current row
return pressed_keys
#. Configure les broches GPIO pour les lignes et les colonnes, et définit la disposition du pavé.
.. code-block:: python
try:
# Configure rows, columns, and keypad layout
rows_pins = [18, 23, 24, 25]
cols_pins = [10, 22, 27, 17]
keys = ["1", "2", "3", "A",
"4", "5", "6", "B",
"7", "8", "9", "C",
"*", "0", "#", "D"]
#. Crée une instance de la classe ``Keypad`` avec la configuration spécifiée.
.. code-block:: python
try:
...
# Create an instance of the Keypad class
keypad = Keypad(rows_pins, cols_pins, keys)
last_key_pressed = []
#. Lecture continue du pavé pour détecter les nouvelles touches pressées et affichage des changements d'état des touches. Le script s'arrête proprement lors d'une interruption clavier (Ctrl+C).
.. code-block:: python
try:
...
# Continuously read the keypad and print newly pressed keys
while True:
pressed_keys = keypad.read()
if pressed_keys and pressed_keys != last_key_pressed:
print(pressed_keys) # Print the list of pressed keys
last_key_pressed = pressed_keys
sleep(0.1) # Short delay to reduce CPU load
except KeyboardInterrupt:
# Handle a keyboard interrupt (Ctrl+C) for a clean exit
pass