.. note:: Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci l'uso di Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati. **Perché unirsi?** - **Supporto esperto**: 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 l'accesso anticipato a nuovi annunci di prodotti e anticipazioni. - **Sconti speciali**: goditi sconti esclusivi sui nostri prodotti più recenti. - **Promozioni e omaggi festivi**: partecipa a promozioni speciali e omaggi durante le festività. 👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti subito! .. _2.1.5_keypad_c_pi5: 2.1.5 Tastiera ================= Introduzione --------------- Una tastiera è una matrice rettangolare di pulsanti. In questo progetto, la utilizzeremo per inserire caratteri. Componenti ----------- .. image:: img/list_2.1.5_keypad.png Principio ---------- **Tastiera** Una tastiera è una matrice rettangolare di 12 o 16 pulsanti OFF-(ON). I loro contatti sono accessibili tramite un connettore adatto per un collegamento con un cavo a nastro o per l'inserimento in un circuito stampato. In alcune tastiere, ciascun pulsante si connette a un contatto separato nel connettore, mentre tutti i pulsanti condividono una massa comune. .. image:: img/image314.png Più frequentemente, i pulsanti sono codificati in matrice, il che significa che ognuno di essi unisce una coppia unica di conduttori in una matrice. Questa configurazione è adatta per il polling da parte di un microcontrollore, che può essere programmato per inviare a turno un impulso di uscita a ciascuno dei quattro fili orizzontali. Durante ogni impulso, il microcontrollore verifica in sequenza i quattro fili verticali rimanenti per determinare quale, se presente, stia trasmettendo un segnale. È consigliabile aggiungere resistenze di pullup o pulldown ai fili di ingresso per evitare che i segnali del microcontrollore si comportino in modo imprevedibile quando non è presente alcun segnale. Schema Elettrico ------------------- .. image:: img/image315.png .. image:: img/image316.png Procedure Sperimentali ------------------------ **Passo 1:** Costruisci il circuito. .. image:: img/image186.png :width: 800 **Passo 2:** Apri il file del codice. .. raw:: html .. code-block:: cd ~/davinci-kit-for-raspberry-pi/c/2.1.5/ **Passo 3:** Compila il codice. .. raw:: html .. code-block:: gcc 2.1.5_Keypad.cpp -lwiringPi **Passo 4:** Esegui il programma. .. raw:: html .. code-block:: sudo ./a.out Dopo l'esecuzione del codice, i valori dei pulsanti premuti sulla tastiera (Valore pulsante) verranno stampati sullo schermo. .. note:: Se non funziona dopo l’esecuzione o compare un messaggio di errore: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`. **Codice** .. code-block:: c #include #include #define ROWS 4 #define COLS 4 #define BUTTON_NUM (ROWS * COLS) unsigned char KEYS[BUTTON_NUM] { '1','2','3','A', '4','5','6','B', '7','8','9','C', '*','0','#','D'}; unsigned char rowPins[ROWS] = {1, 4, 5, 6}; unsigned char colPins[COLS] = {12, 3, 2, 0}; void keyRead(unsigned char* result); bool keyCompare(unsigned char* a, unsigned char* b); void keyCopy(unsigned char* a, unsigned char* b); void keyPrint(unsigned char* a); void keyClear(unsigned char* a); int keyIndexOf(const char value); void init(void) { for(int i=0 ; i<4 ; i++) { pinMode(rowPins[i], OUTPUT); pinMode(colPins[i], INPUT); } } int main(void){ unsigned char pressed_keys[BUTTON_NUM]; unsigned char last_key_pressed[BUTTON_NUM]; if(wiringPiSetup() == -1){ //se l'inizializzazione di wiring fallisce, stampa un messaggio a schermo printf("setup wiringPi failed !"); return 1; } init(); while(1){ keyRead(pressed_keys); bool comp = keyCompare(pressed_keys, last_key_pressed); if (!comp){ keyPrint(pressed_keys); keyCopy(last_key_pressed, pressed_keys); } delay(100); } return 0; } void keyRead(unsigned char* result){ int index; int count = 0; keyClear(result); for(int i=0 ; i