17. Cerradura con teclado matricial 4×4
Introduce un PIN en un teclado y un servo abre la cerradura si es correcto. Aprende escaneo de matrices y máquinas de estado.
🧰 Lista de materiales
🎯 Qué vas a aprender
Cómo un teclado de 16 teclas se lee con solo 8 pines mediante escaneo de matriz, y cómo comparar una secuencia introducida con un PIN guardado. Mueves un servo como actuador del pestillo.
📚 Teoría: escaneo de matriz
El teclado 4×4 organiza 16 botones en 4 filas y 4 columnas. En lugar de 16 cables, el Arduino activa una fila y mira qué columna responde: la intersección identifica la tecla. La librería Keypad hace este barrido por nosotros.
El servo se posiciona por PWM en un ángulo: lo usamos como pestillo (0° cerrado, 90° abierto).
🔌 Conexiones
| Componente | Pines Arduino |
|---|---|
| Teclado filas (4) | D9, D8, D7, D6 |
| Teclado columnas (4) | D5, D4, D3, D2 |
| Servo señal | D11 (PWM ~) |
| Servo VCC/GND | 5 V / GND |
| LED verde / rojo | D12 / D13 vía 220 Ω |
💻 Código completo
Instala las librerías Keypad y usa la integrada Servo.
// Cerradura con teclado 4x4 y servo
#include
#include
const byte FILAS = 4, COLS = 4;
char teclas[FILAS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte pinFilas[FILAS] = {9, 8, 7, 6};
byte pinCols[COLS] = {5, 4, 3, 2};
Keypad teclado = Keypad(makeKeymap(teclas), pinFilas, pinCols, FILAS, COLS);
Servo cerradura;
const String PIN_OK = "1234";
String entrada = "";
const int LED_V = 12, LED_R = 13;
void setup() {
cerradura.attach(11);
cerradura.write(0); // cerrado
pinMode(LED_V, OUTPUT); pinMode(LED_R, OUTPUT);
Serial.begin(9600);
}
void abrir() {
digitalWrite(LED_V, HIGH);
cerradura.write(90); // abre
delay(3000);
cerradura.write(0); // vuelve a cerrar
digitalWrite(LED_V, LOW);
}
void denegar() {
for (int i = 0; i < 3; i++) {
digitalWrite(LED_R, HIGH); delay(150);
digitalWrite(LED_R, LOW); delay(150);
}
}
void loop() {
char k = teclado.getKey();
if (!k) return;
if (k == '#') { // confirmar
if (entrada == PIN_OK) abrir(); else denegar();
entrada = "";
} else if (k == '*') { // borrar
entrada = "";
} else {
entrada += k;
if (entrada.length() > 8) entrada = ""; // límite
}
} 🛠️ Montaje paso a paso
- Conecta las 8 líneas del teclado a D2–D9 según la tabla.
- Cablea el servo (señal a D11, alimentación a 5 V/GND).
- Monta los LEDs verde y rojo.
- Sube el sketch. Teclea 1234 y # para abrir; * para borrar.
🧩 Resolución de problemas
| Síntoma | Causa | Solución |
|---|---|---|
| Teclas equivocadas | Filas/columnas cruzadas | Intercambia pinFilas/pinCols |
| Servo tiembla | Alimentación débil | Aliméntalo con pack aparte, GND común |
| No detecta teclas | Mapa de pines erróneo | Verifica el orden físico del teclado |
🚀 Para ir más lejos
- Guarda el PIN en EEPROM y permite cambiarlo.
- Añade un LCD que muestre asteriscos al teclear.
- Bloquea tras 3 intentos fallidos durante 30 s.