Nota

Ciao, benvenuto nella Community di SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci il mondo di Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.

Perché unirti a noi?

  • Supporto Tecnico Esperto: Risolvi i problemi post-vendita e le sfide tecniche con l’aiuto della nostra comunità e del nostro team.

  • Impara e Condividi: Scambia consigli e tutorial per migliorare le tue competenze.

  • Anteprime Esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.

  • Sconti Speciali: Approfitta di sconti esclusivi sui nostri prodotti più recenti.

  • Promozioni Festive e Giveaway: Partecipa a giveaway e promozioni durante le festività.

👉 Sei pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!

2.1.8 Tastiera

Introduzione

Una tastiera è una matrice rettangolare di pulsanti. In questo progetto, la useremo per inserire caratteri.

Componenti Necessari

Per questo progetto, avremo bisogno dei seguenti componenti.

../_images/2.1.8_keypad_list.png

È decisamente conveniente acquistare un kit completo, ecco il link:

Nome

COMPONENTI NEL KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE AI COMPONENTI

LINK D’ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Tastierino

-

Schema Elettrico

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

Procedure Sperimentali

Passo 1: Costruisci il circuito.

../_images/2.1.8_keypad_circuit.png

Passo 2: Apri il file del codice.

cd ~/raphael-kit/python-pi5

Passo 3: Esegui.

sudo python3 2.1.8_Keypad_zero.py

Dopo l’esecuzione del codice, i valori dei tasti premuti sulla tastiera (valore del tasto) verranno visualizzati sullo schermo.

Avvertimento

Se viene visualizzato l’errore RuntimeError: Cannot determine SOC peripheral base address, fare riferimento a If gpiozero doesn’t work..

Code

Nota

Puoi Modificare/Resettare/Copiare/Eseguire/Fermare il codice qui sotto. Ma prima, devi accedere alla directory del codice come raphael-kit/python-pi5. Dopo aver modificato il codice, puoi eseguirlo direttamente per vedere l’effetto.

#!/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.
        """
        # Initialize row pins as DigitalOutputDevice
        self.rows = [DigitalOutputDevice(pin) for pin in rows_pins]
        # Initialize column pins as Buttons
        self.cols = [Button(pin, pull_up=False) for pin in cols_pins]
        self.keys = keys  # Set the keypad layout

    def read(self):
        """
        Read the currently pressed keys on the keypad.
        :return: A list of pressed keys.
        """
        pressed_keys = []
        # Scansiona ogni riga e colonna per identificare i tasti premuti
        for i, row in enumerate(self.rows):
            row.on()  # Abilita la riga corrente
            for j, col in enumerate(self.cols):
                if col.is_pressed:  # Verifica se il pulsante della colonna è premuto
                    # Calcola l'indice del tasto in base a riga e colonna
                    index = i * len(self.cols) + j
                    pressed_keys.append(self.keys[index])
            row.off()  # Disabilita la riga corrente
        return pressed_keys

try:
    # Configura righe, colonne e layout della tastiera
    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 un'istanza della classe Keypad
    keypad = Keypad(rows_pins, cols_pins, keys)
    last_key_pressed = []

    # Leggi continuamente la tastiera e stampa i nuovi tasti premuti
    while True:
        pressed_keys = keypad.read()
        if pressed_keys and pressed_keys != last_key_pressed:
            print(pressed_keys)  # Stampa l'elenco dei tasti premuti
            last_key_pressed = pressed_keys
        sleep(0.1)  # Breve pausa per ridurre il carico della CPU

except KeyboardInterrupt:
    # Gestisce un'interruzione da tastiera (Ctrl+C) per una corretta uscita
    pass

Spiegazione del Codice

  1. Importa le classi DigitalOutputDevice e Button dalla libreria gpiozero, e la funzione sleep per i ritardi.

    #!/usr/bin/env python3
    from gpiozero import DigitalOutputDevice, Button
    from time import sleep
    
  2. Definisce la classe Keypad. Il metodo __init__ inizializza la tastiera con i pin di riga e colonna e i tasti specificati. Il metodo read scansiona la tastiera e restituisce un elenco di tasti premuti.

    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.
            """
            # Initialize row pins as DigitalOutputDevice
            self.rows = [DigitalOutputDevice(pin) for pin in rows_pins]
            # Initialize column pins as Buttons
            self.cols = [Button(pin, pull_up=False) for pin in cols_pins]
            self.keys = keys  # Set the keypad layout
    
        def read(self):
            """
            Read the currently pressed keys on the keypad.
            :return: A list of pressed keys.
            """
            pressed_keys = []
            # Scansiona ogni riga e colonna per identificare i tasti premuti
            for i, row in enumerate(self.rows):
                row.on()  # Abilita la riga corrente
                for j, col in enumerate(self.cols):
                    if col.is_pressed:  # Verifica se il pulsante della colonna è premuto
                        # Calcola l'indice del tasto in base a riga e colonna
                        index = i * len(self.cols) + j
                        pressed_keys.append(self.keys[index])
                row.off()  # Disabilita la riga corrente
            return pressed_keys
    
  3. Configura i pin GPIO per righe e colonne e definisce il layout della tastiera.

    try:
        # Configura righe, colonne e layout della tastiera
        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 un’istanza della classe Keypad con la configurazione specificata.

    try:
        ...
    
        # Crea un'istanza della classe Keypad
        keypad = Keypad(rows_pins, cols_pins, keys)
        last_key_pressed = []
    
  5. Legge continuamente la tastiera per i tasti premuti, stampa eventuali variazioni di stato dei tasti e introduce una breve pausa per ridurre il carico della CPU. Gestisce un’interruzione da tastiera (Ctrl+C) per consentire un’uscita pulita dallo script.

    try:
        ...
    
        # Leggi continuamente la tastiera e stampa i nuovi tasti premuti
        while True:
            pressed_keys = keypad.read()
            if pressed_keys and pressed_keys != last_key_pressed:
                print(pressed_keys)  # Stampa l'elenco dei tasti premuti
                last_key_pressed = pressed_keys
            sleep(0.1)  # Breve pausa per ridurre il carico della CPU
    
    except KeyboardInterrupt:
        # Gestisce un'interruzione da tastiera (Ctrl+C) per una corretta uscita
        pass