.. 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