Nota
¡Hola! Bienvenido a la Comunidad de Entusiastas de SunFounder para Raspberry Pi, Arduino y ESP32 en Facebook. Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a 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: Accede anticipadamente a anuncios de nuevos productos y adelantos exclusivos.
Descuentos Especiales: Aprovecha descuentos exclusivos en nuestros productos más recientes.
Promociones Festivas y Sorteos: Participa en sorteos y promociones especiales.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.
2.1.5 Teclado
Introducción
Un teclado es una matriz rectangular de botones. En este proyecto, lo utilizaremos para ingresar caracteres.
Componentes Necesarios
En este proyecto, necesitamos los siguientes componentes.

Diagrama de Conexión


Procedimientos del Experimento
Paso 1: Monta el circuito.

Paso 2: Abre el archivo de código.
cd ~/davinci-kit-for-raspberry-pi/python-pi5
Paso 3: Ejecuta el código.
sudo python3 2.1.5_Keypad.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 pantalla.
Advertencia
Si aparece el mensaje de error RuntimeError: Cannot determine SOC peripheral base address
, consulta Si gpiozero no funciona.
Código
Nota
Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el código a continuación. Antes de eso, asegúrate de estar en la ruta del código fuente, como davinci-kit-for-raspberry-pi/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 Botones
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() # Activa 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() # Desactiva 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 teclas presionadas nuevas
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) # Breve pausa para reducir la carga de la CPU
except KeyboardInterrupt:
# Maneja una interrupción de teclado (Ctrl+C) para salir limpiamente
pass
Explicación del Código
Importa las clases
DigitalOutputDevice
yButton
de la bibliotecagpiozero
, y la funciónsleep
para añadir pausas.#!/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 y las teclas. El métodoread
escanea 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 Botones 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() # Activa 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() # Desactiva la fila actual return pressed_keys
Configura los pines GPIO para 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
Keypad
con la configuración especificada.try: ... # Crea una instancia de la clase Keypad keypad = Keypad(rows_pins, cols_pins, keys) last_key_pressed = []
Lee continuamente el teclado en busca de teclas presionadas, imprime cualquier cambio en el estado de las teclas e introduce una breve pausa para reducir la carga de la CPU. Captura una interrupción de teclado (Ctrl+C) para permitir una salida ordenada del script.
try: ... # Lee continuamente el teclado e imprime las teclas presionadas nuevas 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) # Breve pausa para reducir la carga de la CPU except KeyboardInterrupt: # Maneja una interrupción de teclado (Ctrl+C) para salir limpiamente pass