Arduino Nano - Cerradura de Puerta RFID

Este tutorial le enseña cómo construir un sistema de cerradura para puertas con Arduino Nano, un módulo RFID/NFC RC522, un relé, una cerradura de solenoide o una cerradura electromagnética, y opcionalmente una pantalla LCD. Para facilitarle las cosas, el tutorial le indica construir la cerradura RFID a partir de pasos simples hasta complejos. En detalle, haremos:

Si quieres construir un sistema de cerradura de puerta que use contraseña, por favor consulta Arduino Nano - Keypad Door Lock

Acerca del Módulo RFID/NFC RC522, Cerradura de Solenoide y Cerradura Electromagnética

Si no estás familiarizado con el módulo RFID/NFC RC522, la cerradura de solenoide y la cerradura electromagnética (incluido el diagrama de pines, cómo funciona y cómo programarla), los siguientes tutoriales pueden proporcionar más información:

Componentes del sistema de cierre de puertas

Un sistema simple de cerradura para puertas consta de dos componentes:

  • Cerradura de la puerta: un Arduino Nano, un lector RFID/NFC, un relé y una cerradura de solenoide o una cerradura electromagnética
  • Llave de la puerta: etiquetas RFID/NFC
Arduino Nano Arduino RFID cerradura de puerta componente

Cómo funciona la cerradura de puerta RFID/NFC

  • El usuario acerca una etiqueta RFID/NFC al lector RFID/NFC, que lee el UID de la etiqueta.
  • Arduino Nano luego obtiene este UID del lector y lo compara con los UIDs que se han definido en el código del Arduino Nano.
  • Estos UIDs actúan como las llaves autorizadas.
  • Si el UID coincide con alguno de los UIDs predefinidos, Arduino Nano desactivará la cerradura de solenoide para abrir la puerta.
  • Arduino Nano bloqueará la puerta tras un tiempo activando el relé.

Diagrama de Cableado

  • Cerradura de puerta RFID RC522 con solenoide
Diagrama de cableado del sistema de cerradura de solenoide para puerta con Arduino Nano y RFID RC522

This image is created using Fritzing. Click to enlarge image

  • Cerradura de puerta RFID RC522 con bloqueo electromagnético
Diagrama de cableado del sistema de cerradura electromagnética para puerta con Arduino Nano y RFID RC522

This image is created using Fritzing. Click to enlarge image

Para simplificar el proceso de conexión, los pines del módulo RC522 están conectados directamente a los pines del Arduino. Sin embargo, esto puede hacer que el Arduino funcione mal en algunos casos, ya que los pines de salida del Arduino producen 5 V, mientras que los pines del módulo RC522 funcionan a 3,3 V. Como resultado, se recomienda regular la tensión entre los pines del Arduino y el módulo RC522. El diagrama a continuación demuestra cómo se pueden utilizar resistencias para regular de 5 V a 3,3 V.

Arduino Nano RFID RC522 con diagrama de cableado regulado por voltaje

This image is created using Fritzing. Click to enlarge image

※ Nota:

Los fabricantes pueden disponer el orden de los pines de manera diferente, por lo que es importante confiar en las etiquetas impresas en el módulo. El diagrama de pines que se muestra arriba indica la distribución de pines para módulos producidos por el fabricante DIYables.

Código de Arduino Nano - Una sola tecla

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define RC522_SS_PIN 10 // The Arduino Nano pin connected to RC522's SS pin #define RC522_RST_PIN 5 // The Arduino Nano pin connected to RC522's RST pin #define RELAY_PIN A5 // The Arduino Nano pin connected to relay MFRC522 rfid(RC522_SS_PIN, RC522_RST_PIN); byte keyTagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == keyTagUID[0] && rfid.uid.uidByte[1] == keyTagUID[1] && rfid.uid.uidByte[2] == keyTagUID[2] && rfid.uid.uidByte[3] == keyTagUID[3] ) { Serial.println("Access is granted"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.print("Access denied for user with UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Pasos R\u00e1pidos

Para descubrir el UID de una etiqueta RFID/NFC:

  • Carga el código anterior al Arduino Nano usando el IDE de Arduino
  • Abre el Monitor Serial y toca la etiqueta en el módulo RFID-RC522. El UID se mostrará en el Monitor Serial.
COM6
Send
Tap RFID/NFC tag on reader Access denied for user with UID: 3A C9 6A CB
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Una vez que tengas el UID:

  • Modifica la línea 18 del código para reflejar el UID, por ejemplo cambia byte keytagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; a byte keytagUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Carga el código revisado al Arduino Nano
  • Coloca una etiqueta RFID/NFC en el módulo RFID-RC522
  • Verifica la salida en el Monitor Serial
COM6
Send
Tap RFID/NFC tag on reader Access is granted
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  
  • Verifique que la cerradura de solenoide no esté desactivada.
  • Toque una etiqueta RFID/NFC diferente en el módulo RFID-RC522.
  • Verifique la salida en el Monitor Serial.
COM6
Send
Tap RFID/NFC tag on reader Access is granted Access denied for user with UID: BD 1E 1D 00
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Nota:

  • Para facilitar las pruebas, el tiempo de desbloqueo se ha establecido en 2 segundos; sin embargo, debería aumentarse para uso práctico/demostración.
  • Es necesaria la instalación de la biblioteca MFRC522. Para obtener más información, consulte el tutorial Arduino Nano - RFID/NFC RC522.

Código para Arduino Nano - Varias teclas

Imaginemos una habitación en la que solo el gerente y la secretaria pueden abrir la puerta.

En este caso, se requieren dos etiquetas RFID/NFC: una para el gerente y la otra para la secretaria. Los identificadores únicos (UID) de ambas etiquetas deben especificarse en el código.

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #define RC522_SS_PIN 10 // The Arduino Nano pin connected to RC522's SS pin #define RC522_RST_PIN 5 // The Arduino Nano pin connected to RC522's RST pin #define RELAY_PIN A5 // The Arduino Nano pin connected to relay MFRC522 rfid(RC522_SS_PIN, RC522_RST_PIN); byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("Access is granted for manager"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("Access is granted for secretary"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door } else { Serial.print("Access denied for user with UID:"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

Repite los mismos pasos que antes, y luego selecciona individualmente cada etiqueta en el módulo RFID-RC522. La salida en el Monitor serie debería aparecer así:

COM6
Send
Tap RFID/NFC tag on reader Access is granted for secretary Access is granted for manager
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Puedes ampliar el código mencionado anteriormente para incluir tres, cuatro o más etiquetas.

Añadir pantalla LCD a la cerradura RFID

Opcionalmente podemos añadir una pantalla LCD para mostrar el estado de acceso (p. ej. CONCEDIDO/DENEGADO) a los usuarios. Puedes aprender más sobre LCD en Arduino Nano - Tutorial de LCD.

Diagrama de cableado - Sistema de cerradura de la puerta que utiliza RFID, cerradura de solenoide o cerradura electromagnética, y pantalla LCD

Diagrama de cableado LCD para la cerradura de la puerta con Arduino Nano RFID RC522

This image is created using Fritzing. Click to enlarge image

Ver La mejor forma de alimentar Arduino Nano y otros componentes.

Tenga en cuenta que en el diagrama de cableado anterior se añade alimentación de 5 V porque el pin de 5 V del Arduino no puede suministrar suficiente energía para el relé y la pantalla LCD al mismo tiempo.

Código de Arduino Nano - Sistema de cerradura de puerta con contraseña usando el módulo RFID RC522, cerradura de solenoide o cerradura electromagnética y pantalla LCD

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-rfid-door-lock */ #include <SPI.h> #include <MFRC522.h> #include <LiquidCrystal_I2C.h> #define RC522_SS_PIN 10 // The Arduino Nano pin connected to RC522's SS pin #define RC522_RST_PIN 5 // The Arduino Nano pin connected to RC522's RST pin #define RELAY_PIN A5 // The Arduino Nano pin connected to relay MFRC522 rfid(RC522_SS_PIN, RC522_RST_PIN); LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address 0x27 (from DIYables LCD), 16 column and 2 rows byte managerKeyUID[4] = {0x3A, 0xC9, 0x6A, 0xCB}; byte secretaryKeyUID[4] = {0x30, 0x01, 0x8B, 0x15}; void setup() { Serial.begin(9600); SPI.begin(); // init SPI bus rfid.PCD_Init(); // init MFRC522 pinMode(RELAY_PIN, OUTPUT); // initialize pin as an output. digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.init(); // Initialize the LCD I2C display lcd.backlight(); Serial.println("Tap RFID/NFC Tag on reader"); } void loop() { if (rfid.PICC_IsNewCardPresent()) { // new tag is available if (rfid.PICC_ReadCardSerial()) { // NUID has been readed MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); if (rfid.uid.uidByte[0] == managerKeyUID[0] && rfid.uid.uidByte[1] == managerKeyUID[1] && rfid.uid.uidByte[2] == managerKeyUID[2] && rfid.uid.uidByte[3] == managerKeyUID[3] ) { Serial.println("Access is granted for manager"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.clear(); } else if (rfid.uid.uidByte[0] == secretaryKeyUID[0] && rfid.uid.uidByte[1] == secretaryKeyUID[1] && rfid.uid.uidByte[2] == secretaryKeyUID[2] && rfid.uid.uidByte[3] == secretaryKeyUID[3] ) { Serial.println("Access is granted for secretary"); digitalWrite(RELAY_PIN, LOW); // unlock the door for 2 seconds lcd.clear(); lcd.setCursor(0, 0); lcd.print("CORRECT!"); lcd.setCursor(0, 1); lcd.print("DOOR UNLOCKED!"); delay(2000); digitalWrite(RELAY_PIN, HIGH); // lock the door lcd.clear(); } else { Serial.print("Access denied for user with UID:"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("INCORRECT!"); lcd.setCursor(0, 1); lcd.print("ACCESS DENIED!"); for (int i = 0; i < rfid.uid.size; i++) { Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(rfid.uid.uidByte[i], HEX); } Serial.println(); } rfid.PICC_HaltA(); // halt PICC rfid.PCD_StopCrypto1(); // stop encryption on PCD } } }

※ Nota:

La dirección de la pantalla LCD puede variar según el fabricante. Usamos 0x27 en nuestro código, según lo especificado por DIYables.

Añadiendo un sensor de puerta a la cerradura RFID

En el código anterior, la puerta se bloquearía después de un cierto tiempo desde que fue desbloqueada por el Arduino Nano. Sin embargo, en escenarios del mundo real, un sensor de puerta se integra al sistema. Si la puerta está cerrada, el Arduino Nano bloquearía la puerta de inmediato sin esperar a que expire el tiempo de espera.

Para no sobrecargarte, no añadimos el sensor de la puerta al diagrama de cableado y al código. Dejamos esta parte a tu creatividad. Puedes consultar los tutoriales Arduino Nano - Sensor de Puerta y Arduino Nano - Relé de Control del Sensor de Puerta.

Administrando y almacenando las claves RFID válidas en EEPROM

En el ejemplo anterior, las claves RFID válidas (UID) estaban codificadas de forma fija en el código del Arduino Nano. Esto significa que, si quisieras añadir o eliminar claves RFID, tendrías que modificar el código y volver a cargarlo en el Arduino Nano, lo cual puede resultar inconveniente.

Para hacer las cosas más prácticas, necesitamos una forma de gestionar las claves RFID sin tener que modificar y subir el código al Arduino Nano cada vez. Una solución es almacenar las claves RFID en EEPROM en lugar de codificarlas en el código. En consecuencia, necesitamos un método que permita agregar o eliminar claves RFID desde la EEPROM sin necesidad de cambiar el código.

Hay dos métodos para gestionar claves RFID en la EEPROM:

  • Llaves RFID como llaves maestras
    • Usar una llave RFID como llave maestra ADD para añadir una nueva llave. Después de que el Arduino detecte la llave maestra ADD, cambia entre el modo ADD y el modo OPERACIÓN.
    • En el modo ADD, si el Arduino detecta una nueva llave, la añade a la EEPROM
    • Similar a la llave maestra DELETE y al modo DELETE.
  • Escribir comandos ADD/DELETE vía Serial/Bluetooth/IR
    • Los comandos se envían vía Serial/Bluetooth/IR utilizando Serial Monitor, la app Bluetooth, el controlador IR...
    • Los comandos incluyen: directiva (ADD/DELETE), UID de la llave RFID.
    • Para mejorar la seguridad, el comando también debe incluir una contraseña. El Arduino verifica la contraseña para determinar si el comando es válido o no.

    Ambos métodos requieren añadir una gran cantidad de código de Arduino. Eso no es una tarea fácil para los principiantes. Por lo tanto, este tutorial solo proporciona el conocimiento para ayudar a los principiantes a conocer más sobre el sistema de cerradura de la puerta sin sobrecargar al novato con el código complicado. Si desea implementar esto para uso práctico, por favor contáctenos a través de nuestro servicio de programación de pago.

Almacenando el historial de accesos en la tarjeta SD

Quizás desee almacenar el historial de accesos con la siguiente información: UID de la llave RFID, estado de acceso (CONCEDIDO/DENEGADO) y fecha y hora. Puede usar una tarjeta SD para conservar el historial porque la EEPROM no es lo suficientemente grande para almacenar el historial. Puede consultar este tutorial Arduino Nano - Registrar datos con marca de tiempo en la tarjeta SD.

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!