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.

../_images/2.1.5_keypad_list.png

Diagrama de Conexión

../_images/2.1.5_keypad_chematic_1.png ../_images/2.1.5_keypad_chematic_2.png

Procedimientos del Experimento

Paso 1: Monta el circuito.

../_images/2.1.5_keypad_circuit.png

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

  1. Importa las clases DigitalOutputDevice y Button de la biblioteca gpiozero, y la función sleep para añadir pausas.

    #!/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 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 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
    
  3. 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"]
    
  4. 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 = []
    
  5. 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