Nota
¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi, Arduino y ESP32 en Facebook. Profundiza en Raspberry Pi, Arduino y ESP32 con otros entusiastas.
¿Por qué unirse?
Soporte Experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.
Aprende y Comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.
Avances Exclusivos: Obtén acceso anticipado a anuncios de nuevos productos y adelantos.
Descuentos Especiales: Disfruta de descuentos exclusivos en nuestros productos más nuevos.
Promociones y Sorteos Festivos: Participa en sorteos y promociones festivas.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo!
2.1.8 Teclado Matricial
Introducción
Un teclado matricial es una matriz rectangular de botones. En este proyecto, lo utilizaremos para ingresar caracteres.
Componentes Necesarios
En este proyecto, necesitaremos los siguientes componentes.
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
Nombre |
COMPONENTES EN ESTE KIT |
ENLACE |
|---|---|---|
Kit Raphael |
337 |
También puedes comprarlos por separado en los enlaces a continuación.
INTRODUCCIÓN DEL COMPONENTE |
ENLACE DE COMPRA |
|---|---|
- |
Diagrama Esquemático
Procedimientos Experimentales
Paso 1: Construye el circuito.
Paso 2: Abre el archivo de código.
cd ~/raphael-kit/python-pi5
Paso 3: Ejecuta.
sudo python3 2.1.8_Keypad_zero.py
Después de ejecutar el código, los valores de los botones presionados en el teclado (Valor del botón) se imprimirán en la pantalla.
Advertencia
Si recibe el mensaje de error RuntimeError: Cannot determine SOC peripheral base address, consulte Si «gpiozero» no funciona.
Código
Nota
Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Pero antes de eso, necesitas ir a la ruta del código fuente como raphael-kit/python-pi5. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.
#!/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.
"""
# Inicializa los pines de las filas como DigitalOutputDevice
self.rows = [DigitalOutputDevice(pin) for pin in rows_pins]
# Inicializa los pines de las columnas como Buttons
self.cols = [Button(pin, pull_up=False) for pin in cols_pins]
self.keys = keys # Establece el diseño del teclado
def read(self):
"""
Read the currently pressed keys on the keypad.
:return: A list of pressed keys.
"""
pressed_keys = []
# Escanea cada fila y columna para identificar las teclas presionadas
for i, row in enumerate(self.rows):
row.on() # Habilita la fila actual
for j, col in enumerate(self.cols):
if col.is_pressed: # Verifica si el botón de la columna está presionado
# Calcula el índice de la tecla basado en la fila y columna
index = i * len(self.cols) + j
pressed_keys.append(self.keys[index])
row.off() # Deshabilita la fila actual
return pressed_keys
try:
# Configura filas, columnas y diseño del teclado
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"]
# Crea una instancia de la clase Keypad
keypad = Keypad(rows_pins, cols_pins, keys)
last_key_pressed = []
# Lee continuamente el teclado e imprime las nuevas teclas presionadas
while True:
pressed_keys = keypad.read()
if pressed_keys and pressed_keys != last_key_pressed:
print(pressed_keys) # Imprime la lista de teclas presionadas
last_key_pressed = pressed_keys
sleep(0.1) # Pequeña pausa para reducir la carga de la CPU
except KeyboardInterrupt:
# Maneja una interrupción del teclado (Ctrl+C) para salir limpiamente
pass
Explicación del Código
Importa las clases
DigitalOutputDeviceyButtonde la bibliotecagpiozero, y la funciónsleeppara manejar retardos.#!/usr/bin/env python3 from gpiozero import DigitalOutputDevice, Button from time import sleep
Define la clase
Keypad. El método__init__inicializa el teclado con los pines de fila y columna dados y las teclas. El métodoreadescanea el teclado y devuelve una lista de teclas presionadas.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. """ # Inicializa los pines de las filas como DigitalOutputDevice self.rows = [DigitalOutputDevice(pin) for pin in rows_pins] # Inicializa los pines de las columnas como Buttons self.cols = [Button(pin, pull_up=False) for pin in cols_pins] self.keys = keys # Establece el diseño del teclado def read(self): """ Read the currently pressed keys on the keypad. :return: A list of pressed keys. """ pressed_keys = [] # Escanea cada fila y columna para identificar las teclas presionadas for i, row in enumerate(self.rows): row.on() # Habilita la fila actual for j, col in enumerate(self.cols): if col.is_pressed: # Verifica si el botón de la columna está presionado # Calcula el índice de la tecla basado en la fila y columna index = i * len(self.cols) + j pressed_keys.append(self.keys[index]) row.off() # Deshabilita la fila actual return pressed_keys
Configura los pines GPIO para las filas y columnas y define el diseño del teclado.
try: # Configura filas, columnas y diseño del teclado 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"]
Crea una instancia de la clase
Keypadcon la configuración especificada.try: ... # Create an instance of the Keypad class keypad = Keypad(rows_pins, cols_pins, keys) last_key_pressed = []
Lee continuamente el teclado para detectar teclas presionadas, imprime cualquier cambio en el estado de las teclas, e introduce un breve retraso para reducir la carga de la CPU. Captura una interrupción de teclado (como Ctrl+C) para permitir una salida limpia del script.
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) # Imprime la lista de teclas presionadas last_key_pressed = pressed_keys sleep(0.1) # Pequeña pausa para reducir la carga de la CPU except KeyboardInterrupt: # Maneja una interrupción del teclado (Ctrl+C) para salir limpiamente pass