.. note:: Ciao e benvenuto nella Community di Appassionati di SunFounder per Raspberry Pi, Arduino ed ESP32 su Facebook! Esplora a fondo il mondo di Raspberry Pi, Arduino ed ESP32 insieme a tanti altri appassionati. **Perché Unirsi?** - **Supporto da Esperti**: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team. - **Impara e Condividi**: Scambia consigli e tutorial per migliorare le tue competenze. - **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci dei nuovi prodotti e a contenuti inediti. - **Sconti Speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti. - **Promozioni Festive e Giveaway**: Partecipa a concorsi e promozioni festive. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso! .. _py_pi5_keypad: 2.1.5 Tastierino =================== Introduzione --------------- Un tastierino è una matrice rettangolare di pulsanti. In questo progetto, lo utilizzeremo per inserire caratteri. Componenti Necessari ------------------------------ In questo progetto, abbiamo bisogno dei seguenti componenti. .. image:: ../python_pi5/img/2.1.5_keypad_list.png .. raw:: html
Schema Elettrico ------------------- .. image:: ../python_pi5/img/2.1.5_keypad_chematic_1.png .. image:: ../python_pi5/img/2.1.5_keypad_chematic_2.png Procedure Sperimentali -------------------------- **Passo 1:** Costruisci il circuito. .. image:: ../python_pi5/img/2.1.5_keypad_circuit.png **Passo 2:** Apri il file del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/python-pi5 **Passo 3:** Esegui. .. raw:: html .. code-block:: sudo python3 2.1.5_Keypad.py Dopo l’esecuzione del codice, i valori dei pulsanti premuti sul tastierino (button Value) verranno stampati sullo schermo. .. warning:: Se compare l'errore ``RuntimeError: Cannot determine SOC peripheral base address``, consulta :ref:`faq_soc` **Codice** .. note:: Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui sotto. Prima di farlo, però, vai al percorso del codice sorgente, come ``davinci-kit-for-raspberry-pi/python-pi5``. Dopo aver modificato il codice, potrai eseguirlo direttamente per vedere il risultato. .. raw:: html .. code-block:: python #!/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. """ # Inizializza i pin delle righe come DigitalOutputDevice self.rows = [DigitalOutputDevice(pin) for pin in rows_pins] # Inizializza i pin delle colonne come pulsanti self.cols = [Button(pin, pull_up=False) for pin in cols_pins] self.keys = keys # Imposta il layout del tastierino 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() # Attiva la riga corrente for j, col in enumerate(self.cols): if col.is_pressed: # Controlla se il pulsante della colonna è premuto # Calcola l'indice del tasto in base alla riga e colonna index = i * len(self.cols) + j pressed_keys.append(self.keys[index]) row.off() # Disattiva la riga corrente return pressed_keys try: # Configura le righe, le colonne e il layout del tastierino 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 il tastierino e stampa i tasti appena premuti while True: pressed_keys = keypad.read() if pressed_keys and pressed_keys != last_key_pressed: print(pressed_keys) # Stampa la lista dei tasti premuti last_key_pressed = pressed_keys sleep(0.1) # Breve ritardo per ridurre il carico sulla CPU except KeyboardInterrupt: # Gestisce un'interruzione da tastiera (Ctrl+C) per un'uscita pulita pass **Spiegazione del Codice** #. Importa le classi ``DigitalOutputDevice`` e ``Button`` dalla libreria ``gpiozero`` e la funzione ``sleep`` per i ritardi. .. code-block:: python #!/usr/bin/env python3 from gpiozero import DigitalOutputDevice, Button from time import sleep #. Definisce la classe ``Keypad``. Il metodo ``__init__`` inizializza il tastierino con i pin di riga e colonna e i tasti. Il metodo ``read`` scansiona il tastierino e restituisce una lista dei tasti premuti. .. code-block:: python 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. """ # Inizializza i pin delle righe come DigitalOutputDevice self.rows = [DigitalOutputDevice(pin) for pin in rows_pins] # Inizializza i pin delle colonne come pulsanti self.cols = [Button(pin, pull_up=False) for pin in cols_pins] self.keys = keys # Imposta il layout del tastierino 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() # Attiva la riga corrente for j, col in enumerate(self.cols): if col.is_pressed: # Controlla se il pulsante della colonna è premuto # Calcola l'indice del tasto in base alla riga e colonna index = i * len(self.cols) + j pressed_keys.append(self.keys[index]) row.off() # Disattiva la riga corrente return pressed_keys #. Configura i pin GPIO per righe e colonne e definisce il layout del tastierino. .. code-block:: python try: # Configura le righe, le colonne e il layout del tastierino 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`` con la configurazione specificata. .. code-block:: python try: ... # Crea un'istanza della classe Keypad keypad = Keypad(rows_pins, cols_pins, keys) last_key_pressed = [] #. Legge continuamente i tasti del tastierino, stampa i nuovi tasti premuti e introduce un breve ritardo per ridurre il carico sulla CPU. Gestisce un'interruzione da tastiera (come Ctrl+C) per un'uscita pulita dallo script. .. code-block:: python try: ... # Leggi continuamente il tastierino e stampa i tasti appena premuti while True: pressed_keys = keypad.read() if pressed_keys and pressed_keys != last_key_pressed: print(pressed_keys) # Stampa la lista dei tasti premuti last_key_pressed = pressed_keys sleep(0.1) # Breve ritardo per ridurre il carico sulla CPU except KeyboardInterrupt: # Gestisce un'interruzione da tastiera (Ctrl+C) per un'uscita pulita pass