Componenti · 5 min di lettura

Come usare un tastierino (keypad): serratura a codice 4x4 con Arduino

Come funziona un tastierino a matrice? Collegamento dei keypad 4x4 e 3x4, scansione righe-colonne, libreria Keypad, lettura dei tasti, inserimento del codice e serratura con servo, uso con LCD, ESP32 e Pico.

Un keypad (tastierino) è un dispositivo di input economico, simile ai tasti di un telefono, che ti permette di inserire numeri o lettere nel tuo progetto. Con un tastierino si realizzano serrature a codice, casseforti, calcolatrici, centraline d'allarme e sistemi a menu. I modelli più comuni sono tastierini a membrana sottili con retro adesivo, nei formati 4x4 (16 tasti) e 3x4 (12 tasti).

Tastierino a membrana 4x4
Tastierino a membrana 4x4: cifre 0–9, lettere A–D e i tasti * e #; il cavo piatto in basso ha 8 pin.

Come funziona un tastierino? La matrice righe-colonne

Se ognuno dei 16 tasti avesse un pin tutto suo, servirebbero 16 pin. Il tastierino invece dispone i tasti in una matrice: 4 righe e 4 colonne; ogni tasto si trova all'incrocio di una riga e di una colonna e, premendolo, collega quella riga a quella colonna. Arduino porta le righe a LOW una alla volta e legge le colonne; la colonna che legge LOW mentre una certa riga è a LOW indica quale tasto è premuto. Poiché questa scansione avviene centinaia di volte al secondo, bastano 8 pin per leggere 16 tasti.

TipoTastiPinUso tipico
Membrana 4x416 (0–9, A–D, *, #)8Codici, menu, calcolatrici
Membrana 3x412 (0–9, *, #)7Inserimento di numeri come su un telefono
Membrana 1x445Menu semplici e tasti di selezione

Piedinatura e collegamento del tastierino

Con i tasti rivolti verso di te, i pin del cavo piatto sono di solito, da sinistra a destra, R1, R2, R3, R4, C1, C2, C3, C4: i primi quattro sono le righe e gli ultimi quattro le colonne. Non servono resistenze: la libreria usa le resistenze di pull-up interne di Arduino per le colonne.

Pin del tastierinoFunzioneArduino Uno
1R1 (1, 2, 3, A)D9
2R2 (4, 5, 6, B)D8
3R3 (7, 8, 9, C)D7
4R4 (*, 0, #, D)D6
5C1 (1, 4, 7, *)D5
6C2 (2, 5, 8, 0)D4
7C3 (3, 6, 9, #)D3
8C4 (A, B, C, D)D2
Se premendo 1 ottieni D e premendo 4 ottieni C, l'ordine di righe e colonne è invertito. Invece di rifare i collegamenti, basta invertire l'ordine degli array rowPins e colPins nel codice.

Leggere i tasti con la libreria Keypad

Nel Gestore librerie cerca Keypad e installa la libreria di Mark Stanley e Alexander Brevig. Il codice qui sotto scrive nel Monitor seriale ogni tasto che premi:

Arduino (C++)
1#include <Keypad.h>
2
3const byte ROWS = 4, COLS = 4;
4char keys[ROWS][COLS] = {
5  {'1', '2', '3', 'A'},
6  {'4', '5', '6', 'B'},
7  {'7', '8', '9', 'C'},
8  {'*', '0', '#', 'D'}
9};
10byte rowPins[ROWS] = {9, 8, 7, 6};     // R1–R4
11byte colPins[COLS] = {5, 4, 3, 2};     // C1–C4
12Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
13
14void setup() {
15  Serial.begin(9600);
16}
17
18void loop() {
19  char key = keypad.getKey();          // tuş yoksa 0 döner / returns 0 if no key
20  if (key) {
21    Serial.println(key);
22  }
23}

getKey() non blocca il programma: se in quel momento non c'è un tasto premuto restituisce subito 0, così puoi fare altro in loop(). La libreria gestisce da sola il rimbalzo dei tasti e segnala ogni pressione una sola volta. Se vuoi aspettare finché non viene premuto un tasto, usa waitForKey().

Costruire una serratura a codice

Ora raccogliamo i tasti premuti in un testo e lo confrontiamo con un codice salvato. Il tasto * cancella l'inserimento, il tasto # lo conferma. Se il codice è giusto, un servomotore apre la serratura per 3 secondi. Per il collegamento del servo vedi Cos'è un servomotore?

Arduino (C++)
1#include <Keypad.h>
2#include <Servo.h>
3
4const byte ROWS = 4, COLS = 4;
5char keys[ROWS][COLS] = {
6  {'1', '2', '3', 'A'},
7  {'4', '5', '6', 'B'},
8  {'7', '8', '9', 'C'},
9  {'*', '0', '#', 'D'}
10};
11byte rowPins[ROWS] = {9, 8, 7, 6};
12byte colPins[COLS] = {5, 4, 3, 2};
13Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
14
15Servo lock;
16const String PASSWORD = "1234";
17String input = "";
18
19void setup() {
20  Serial.begin(9600);
21  lock.attach(10);
22  lock.write(0);                        // kilitli / locked
23}
24
25void loop() {
26  char key = keypad.getKey();
27  if (!key) return;
28  if (key == '*') {                     // temizle / clear
29    input = "";
30  } else if (key == '#') {              // onayla / confirm
31    if (input == PASSWORD) {
32      Serial.println("Doğru, açılıyor / correct, opening");
33      lock.write(90);
34      delay(3000);
35      lock.write(0);
36    } else {
37      Serial.println("Yanlış şifre / wrong code");
38    }
39    input = "";
40  } else if (input.length() < 8) {
41    input += key;
42    Serial.print('*');                  // tuşu gizle / hide the key
43  }
44}
Questa serratura è pensata per imparare e per i progetti hobbistici. Per una porta vera aggiungi un tempo di blocco dopo alcuni tentativi sbagliati, salva il codice nella EEPROM invece di scriverlo in chiaro nel programma e colloca l'elettronica dove nessuno possa raggiungerla dall'esterno.

Usarlo con un display LCD

Un display rende molto più comodo vedere cosa stai facendo mentre inserisci il codice. Un LCD I2C usa solo i pin A4 e A5, quindi non tocca gli 8 pin digitali del tastierino. A ogni pressione scrivi un asterisco sulla riga inferiore dell'LCD e, dopo la conferma, mostra "Aperto" o "Errato" sulla riga superiore. Collegamento e comandi del display sono spiegati in Usare un display LCD I2C.

Meno pin: tastierini I2C e analogici

Il tastierino da solo occupa 8 dei 20 pin dell'Uno. Quando i pin non bastano ci sono due soluzioni: un adattatore I2C per tastierino basato sul PCF8574 riduce il tutto a due fili e condivide il bus con l'LCD. Nei tastierini analogici ogni tasto crea una resistenza diversa e l'intero tastierino si legge da un solo pin analogico; servono meno fili, ma non si possono rilevare due tasti premuti insieme.

Tastierino con ESP32 e Raspberry Pi Pico

La libreria Keypad funziona anche sull'ESP32. Poiché i pin delle righe fanno da uscite e quelli delle colonne da ingressi con pull-up, evita i GPIO 34–39, che non possono fare da uscita e non hanno pull-up; per esempio usa 13, 12, 14 e 27 per le righe e 26, 25, 33 e 32 per le colonne. Sul Pico con MicroPython puoi scrivere tu stesso la scansione in poche righe:

MicroPython
1from machine import Pin
2import time
3
4KEYS = ["123A", "456B", "789C", "*0#D"]
5rows = [Pin(n, Pin.OUT, value=1) for n in (2, 3, 4, 5)]        # R1–R4
6cols = [Pin(n, Pin.IN, Pin.PULL_UP) for n in (6, 7, 8, 9)]     # C1–C4
7
8def scan():
9    for r, row in enumerate(rows):
10        row.value(0)                         # bu satırı etkinleştir / activate this row
11        for c, col in enumerate(cols):
12            if col.value() == 0:             # tuş basılı / key pressed
13                row.value(1)
14                return KEYS[r][c]
15        row.value(1)
16    return None
17
18last = None
19while True:
20    key = scan()
21    if key and key != last:                  # her basışı bir kez yaz / print each press once
22        print(key)
23    last = key
24    time.sleep_ms(50)

Idee di progetti con il tastierino

  • Cassaforte a codice: una scatola che si apre inserendo il codice, con servomotore, display LCD e buzzer.
  • Calcolatrice: usa i tasti A–D per le quattro operazioni e mostra il risultato su un LCD.
  • Selettore di colore: cambia il colore di un LED RGB in base al numero inserito.
  • Centralina d'allarme: attiva e disattiva con un codice un allarme con sensore PIR.
  • Gioco indovina il numero: trova il numero scelto da Arduino con gli indizi "più alto" e "più basso".
  • Tastiera di scorciatoie: trasforma ogni tasto in una scorciatoia del computer con un Arduino Leonardo.

Errori comuni e come risolverli

  • Viene letto un tasto diverso da quello premuto: l'ordine di righe e colonne è invertito; inverti l'ordine degli array rowPins e colPins.
  • Non viene letto nessun tasto: il cavo piatto è inserito spostato di un pin, oppure i pin di righe e colonne non corrispondono al codice.
  • Alcuni tasti non funzionano mai: un filo di riga o di colonna fa falso contatto; se non funzionano tutti i tasti di una riga o colonna, è questo il segnale.
  • Usare i pin 0 e 1: servono alla comunicazione seriale USB; caricare il codice con il tastierino collegato può dare errore.
  • Sull'ESP32 alcune colonne sembrano sempre premute: si stanno usando i GPIO 34–39, privi di pull-up; spostale su altri pin.
  • Aspettarsi ripetizioni tenendo premuto: getKey() segnala ogni pressione una volta; per rilevare un tasto tenuto premuto usa lo stato HOLD della libreria.

Un tastierino in fondo è fatto di pulsanti disposti a matrice; la logica dei pulsanti è spiegata in Come collegare un pulsante ad Arduino. Nell'app BlueGrays trovi progetti sull'uso dei tastierini 3x4 e 4x4, un'app per codici con LCD, una cassaforte elettronica intelligente, una calcolatrice I2C e il controllo di un LED RGB con tastierino, con schemi e codice.

Domande frequenti

Quanti pin usa un tastierino 4x4?

Un tastierino 4x4 usa 8 pin: 4 righe e 4 colonne. Uno 3x4 ne usa 7 e uno 1x4 ne usa 5. Se i pin non bastano, puoi scendere a 2 fili con un adattatore I2C o a un solo pin analogico con un tastierino analogico.

Il tastierino ha bisogno di resistenze?

No. La libreria Keypad attiva le resistenze di pull-up interne di Arduino sui pin delle colonne, quindi non serve aggiungere resistenze. Puoi collegare il tastierino direttamente ai pin digitali.

A quali pin si collega un tastierino?

A 8 pin digitali qualsiasi; anche i pin analogici si possono usare come digitali. Sull'Uno evita i pin 0 e 1, usati per la comunicazione seriale USB. Sull'ESP32 non usare i GPIO 34–39, che non possono fare da uscita e non hanno pull-up.

Posso rilevare due tasti premuti contemporaneamente?

Sì, la funzione getKeys() della libreria Keypad rileva fino a 10 tasti premuti insieme. Però nei tastierini a membrana senza diodi alcune combinazioni di tre tasti possono far sembrare premuto un tasto che non lo è (ghosting).

Se cambio il codice, viene dimenticato dopo un blackout?

Un codice tenuto in una variabile torna al valore predefinito del programma quando Arduino si riavvia. Se vuoi che il nuovo codice resti, salvalo nella EEPROM e rileggilo da lì all'avvio.

Quanto è resistente un tastierino a membrana?

I tastierini a membrana resistono di solito a circa 1 milione di pressioni per tasto e, essendo sottili e leggeri, si incollano facilmente su una scatola o un coperchio. Non sono del tutto protetti da acqua e polvere; all'aperto si preferiscono tastierini con tasti in metallo o silicone.

Vedi tutti i progetti
Funzionamento del tastierino 3x4
#61Principiante
Premium

Funzionamento del tastierino 3x4

Progetto di base che legge il tasto premuto dalla tastiera 3x4 e lo visualizza sul monitor seriale. Insegna l'uso della libreria di tastiere e della tastiera a matrice.

4.5(24)
31
Controllo LED con tastierino 3x4
#62Intermedio
Premium

Controllo LED con tastierino 3x4

Progetto in grado di accendere e spegnere 3 LED in modo indipendente con 3x4 tasti della tastiera e di eseguire il controllo batch. Insegna il controllo di più uscite con il tastierino.

4.6(29)
38
Funzionamento del tastierino 4x4
#63Principiante
Premium

Funzionamento del tastierino 4x4

Progetto di base che legge il tasto premuto dalla tastiera 4x4 e lo visualizza sul Serial Monitor. Insegna la configurazione della tastiera estesa a 4 colonne.

4.5(27)
35
Serratura con password, tastierino 4x4 e LCD
#64Avanzato
Premium

Serratura con password, tastierino 4x4 e LCD

Progetto di sicurezza che apre la porta con un servo se è corretta l'immissione di una password con una tastiera 4x4 e accende un LED rosso se è errata. Insegna il confronto delle password e l'integra

4.8(57)
75
Tastiera per sviluppatori software Arduino
#65Intermedio
Premium

Tastiera per sviluppatori software Arduino

Progetto di tastiera programmabile che scrive blocchi di codice Arduino come if, for, digitalWrite sul computer con un solo pulsante con Arduino Leonardo e tastiera 4x4. Insegna l'emulazione della tas

4.7(40)
52
Cassaforte elettronica intelligente
#92Avanzato
Premium

Cassaforte elettronica intelligente

Smart Electronic Safe è un sistema di sicurezza protetto da password basato su Arduino. Attiva e disattiva il meccanismo di chiusura controllato dal servomotore con la password a 4 cifre inserita tram

4.7(42)
63
Calcolatrice Arduino I2C
#94Intermedio
Premium

Calcolatrice Arduino I2C

Si tratta di un progetto di calcolatore basato su Arduino che esegue operazioni di addizione, sottrazione, moltiplicazione e divisione utilizzando una tastiera a membrana 4x4 e un display LCD I2C 16x2. Grazie all'I2C, il collegamento del display avviene con soli 2 cavi, riducendo così l'ingombro dei cavi e mantenendo un maggior numero di pin utilizzabili. Sono inoltre disponibili l'ingresso di numeri decimali e il supporto di numeri negativi.

5.0(31)
43
Controllo LED RGB con tastierino
#95Intermedio
Premium

Controllo LED RGB con tastierino

Questo progetto consente di gestire il LED RGB tra modalità e colori tramite la tastiera 4x4. Grazie alla struttura millis(), i comandi vengono elaborati senza ritardi. 🎮 Guida all'uso: Tasto A: Velocità fissa Effetto dissolvenza. Tasto B: transizione graduale con velocità regolabile. C / D: Aumenta / Diminuisce la velocità dell'effetto. 1 - 9: Selezione rapida del colore master. * / #: Colori intermedi speciali (rosa, verde chiaro, ecc.). Tasto 0: spegne il sistema.

5.0(32)
44

Impara come si leggono 16 tasti con soli 8 pin, a collegare un tastierino ad Arduino, a leggere i tasti premuti e a costruire una serratura a codice che si apre con un servomotore, passo passo.

Come usare un tastierino (keypad): serratura a codice 4x4 con Arduino | BlueGrays