Ir al contenido
← Volver a Formación Arduino Intermedio

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.

Dificultad: Intermedio · Tiempo: 75 min · Cerebro: Arduino Uno

🧰 Lista de materiales

Arduino Uno R3 (ATmega328P)
Arduino Uno R3 (ATmega328P)
Cerebro de la cerradura
sin foto
Teclado matricial membrana 4×4
Introducción del PIN (4×4)
Microservo SG90 9 g
Microservo SG90 9 g
Mecanismo del pestillo
LED 5 mm verde difuso
LED 5 mm verde difuso
Acceso concedido
LED 5 mm rojo difuso
LED 5 mm rojo difuso
Acceso denegado
sin foto
Resistencias película metálica 1/4 W
220 Ω ×2
Breadboard 830 puntos
Breadboard 830 puntos
Montaje

🎯 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

ComponentePines Arduino
Teclado filas (4)D9, D8, D7, D6
Teclado columnas (4)D5, D4, D3, D2
Servo señalD11 (PWM ~)
Servo VCC/GND5 V / GND
LED verde / rojoD12 / 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

  1. Conecta las 8 líneas del teclado a D2–D9 según la tabla.
  2. Cablea el servo (señal a D11, alimentación a 5 V/GND).
  3. Monta los LEDs verde y rojo.
  4. Sube el sketch. Teclea 1234 y # para abrir; * para borrar.

🧩 Resolución de problemas

SíntomaCausaSolución
Teclas equivocadasFilas/columnas cruzadasIntercambia pinFilas/pinCols
Servo tiemblaAlimentación débilAliméntalo con pack aparte, GND común
No detecta teclasMapa de pines erróneoVerifica 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.
← Volver a Formación Arduino