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.

../_images/2.1.8_keypad_list.png

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

Nombre

COMPONENTES EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado en los enlaces a continuación.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Resistor

COMPRAR

Teclado

-

Diagrama Esquemático

../_images/2.1.8_keypad_chematic_1.png ../_images/2.1.8_keypad_chematic_2.png

Procedimientos Experimentales

Paso 1: Construye el circuito.

../_images/2.1.8_keypad_circuit.png

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

  1. Importa las clases DigitalOutputDevice y Button de la biblioteca gpiozero, y la función sleep para manejar retardos.

    #!/usr/bin/env python3
    from gpiozero import DigitalOutputDevice, Button
    from time import sleep
    
  2. Define la clase Keypad. El método __init__ inicializa el teclado con los pines de fila y columna dados y las teclas. El método read 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 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
    
  3. 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"]
    
  4. Crea una instancia de la clase Keypad con la configuración especificada.

    try:
        ...
    
        # Create an instance of the Keypad class
        keypad = Keypad(rows_pins, cols_pins, keys)
        last_key_pressed = []
    
  5. 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