Arduino - Sistema de Cerradura de Puerta con RFID/NFC

En este tutorial, vamos a aprender a crear un sistema de cerradura para puertas con Arduino, utilizando un kit RC522 de RFID/NFC y una cerradura electromagnética o de solenoide.

※ Nota:

También tenemos otros tutoriales Arduino - Sistema de cerradura de puerta con teclado.

Acerca de Módulo RFID/NFC RC522 y Cerradura electromagnética

Si no conoces el módulo RFID/NFC RC522, la cerradura electromagnética y la cerradura de solenoide (disposición de pines, cómo funciona, cómo programar...), aprende sobre ellos en los siguientes tutoriales:

Componentes del Sistema

El sistema de cierre de la puerta incluye dos partes principales:

  • Cerradura de la puerta: Arduino + lector RFID/NFC + cerradura electromagnética
  • Llave de la puerta: etiquetas RFID/NFC
Arduino arduino componente de cerradura de puerta RFID

Hay algunos tipos de lectores RFID/NFC que pueden funcionar con Arduino. Este tutorial utiliza el lector RFID-RC522 como lector RFID/NFC porque es barato.

Cómo funciona la cerradura RFID/NFC de la puerta

  • Algunas etiquetas que tienen UIDs configurados en el código de Arduino actúan como llaves autorizadas
  • El usuario acerca una etiqueta RFID/NFC al lector RFID/NFC
  • El lector lee el UID de la etiqueta.
  • Arduino obtiene el UID del lector
  • Arduino compara el UID leído con los UIDs predefinidos
  • Si el UID coincide con alguno de los UIDs predefinidos, Arduino desactiva la cerradura electromagnética para abrir la puerta.

Diagrama de Cableado

  • Cerradura RFID RC522 con cerradura de solenoide
Diagrama de cableado del sistema de cerradura con Arduino RFID RC522

This image is created using Fritzing. Click to enlarge image

  • Cerradura de puerta RFID RC522 con cerradura electromagnética
Diagrama de cableado del sistema de cerradura de la puerta con Arduino RFID RC522

This image is created using Fritzing. Click to enlarge image

Para simplificarlo, los pines del módulo RC522 están conectados directamente a los pines del Arduino. Sin embargo, esto podría hacer que el Arduino deje de funcionar correctamente en ciertos casos, ya que los pines de salida del Arduino generan 5V, mientras que los pines del módulo RC522 funcionan normalmente a 3.3V. Por lo tanto, se recomienda regular la tensión entre los pines del Arduino y los pines del módulo RC522. Para instrucciones más detalladas, consulte el Tutorial de Arduino - RFID RC522. El diagrama a continuación ilustra cómo regular de 5V a 3.3V usando resistencias:

Arduino RFID RC522 con diagrama de cableado de voltaje regulado

This image is created using Fritzing. Click to enlarge image

※ Nota:

El orden de los pines puede variar según los fabricantes. SIEMPRE utiliza las etiquetas impresas en el módulo. La imagen de arriba muestra la asignación de pines de los módulos del fabricante DIYables.

Código de Arduino - Una tecla

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-rfid-nfc-door-lock-system */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 5 #define RELAY_PIN A5 // the Arduino pin connects to relay MFRC522 rfid(SS_PIN, 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

Ya que el UID normalmente no está impreso en la etiqueta RFID/NFC, el primer paso que debemos dar es averiguar el UID de la etiqueta. Esto se puede hacer de las siguientes maneras:

  • Copia el código anterior y ábrelo con Arduino IDE
  • Haz clic en el botón Subir en Arduino IDE para cargar el código al Arduino
  • Abre el Monitor Serial
  • Acerca una etiqueta RFID/NFC al módulo RFID-RC522
  • Obtén el UID 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  

Después de tener UID:

  • Actualiza UID en la línea 18 del código anterior. Por ejemplo, cambia byte keytagUID[4] = {0xFF, 0xFF, 0xFF, 0xFF}; a byte keytagUID[4] = {0x3A, 0xC9, 0x6A, 0xCB};
  • Vuelve a subir el código al Arduino.
  • Acerca una etiqueta RFID/NFC al módulo RFID-RC522.
  • Ver 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  
  • Verifica la cerradura electromagnética; debería estar desbloqueada
  • Acerca otra etiqueta RFID/NFC al módulo RFID-RC522
  • Consulta 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 está configurado en 2 segundos; debería aumentarse en el uso práctico o durante la demostración.
  • Es necesario instalar la biblioteca MFRC522. Ver Arduino - RFID/NFC RC522 tutorial

Código de Arduino - Múltiples Teclas

Imaginemos que una habitación permita que el gerente y la secretaria desbloqueen la puerta.

En este caso, necesitamos usar dos etiquetas RFID/NFC: una para el gerente y la otra para la secretaria. Tenemos que especificar los UIDs de dos etiquetas en el código.

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-rfid-nfc-door-lock-system */ #include <SPI.h> #include <MFRC522.h> #define SS_PIN 10 #define RST_PIN 5 #define RELAY_PIN A5 // the Arduino pin connects to relay MFRC522 rfid(SS_PIN, 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 } } }

Realiza pasos similares a los anteriores y luego acerca cada etiqueta al módulo RFID-RC522, una por una. El resultado en el Monitor Serial se ve a continuación:

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 extender el código anterior para tres, cuatro o más etiquetas.

※ Nota:

En el código anterior, las claves están codificadas de forma fija. En la práctica, debería ser posible añadir/eliminar claves dinámicamente mediante un modo especial. Si es así, las claves deberían guardarse en la memoria EEPROM. El número de claves que se pueden guardar depende del tamaño de la EEPROM. El código se volverá más complicado. Si desea construir tal sistema, ofrecemos un servicio de programación. Por favor, no dude en ponerse en contacto con nosotros.

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!