Construye una cerradura RFID con Arduino – Domina la tecnología RFID paso a paso
En este tutorial aprenderemos qué es RFID, cómo funciona y cómo hacer una cerradura de puerta basada en Arduino con RFID. Puedes ver el siguiente vídeo o leer el tutorial escrito a continuación para más detalles. RFID significa Identificación por Radiofrecuencia y es una tecnología sin contacto que se usa ampliamente en muchas industrias para tareas como seguimiento de personal, control de acceso, gestión de cadena de suministro, seguimiento de libros en bibliotecas, sistemas de peaje, etc. Un sistema RFID consta de dos componentes principales: un transpondedor o etiqueta (tag) que se coloca en el objeto que queremos identificar, y un transceptor o lector. El lector RFID consiste en un módulo de radiofrecuencia, una unidad de control y una bobina de antena que genera un campo electromagnético de alta frecuencia. Por otro lado, la etiqueta suele ser un componente pasivo, que consta solo de una antena y un microchip electrónico, por lo que cuando se acerca al campo electromagnético del transceptor, debido a la inducción, se genera un voltaje en su bobina de antena y este voltaje sirve de alimentación para el microchip. Ahora, como la etiqueta está alimentada, puede extraer el mensaje transmitido por el lector, y para enviar el mensaje de vuelta al lector, usa una técnica llamada manipulación de carga. Encender y apagar una carga en la antena de la etiqueta afectará el consumo de energía de la antena del lector, lo que se puede medir como caída de voltaje. Estos cambios en el voltaje se capturan como unos y ceros y esa es la forma en que se transfieren los datos de la etiqueta al lector. También hay otra forma de transferencia de datos entre el lector y la etiqueta, llamada acoplamiento por retrodispersión. En este caso, la etiqueta usa parte de la energía recibida para generar otro campo electromagnético que será captado por la antena del lector. Ese es el principio de funcionamiento básico y ahora veamos cómo podemos usar RFID con Arduino y construir nuestra propia cerradura RFID. Usaremos etiquetas basadas en el protocolo MIFARE y el lector RFID MFRC522, que cuestan solo unos pocos dólares. Estas etiquetas tienen 1 KB de memoria y un microchip que puede realizar operaciones aritméticas. Su frecuencia de operación es 13,56 MHz y la distancia de operación es de hasta 10 cm dependiendo de la geometría de la antena. Si ponemos una de estas etiquetas frente a una fuente de luz, podemos notar la antena y el microchip de los que hablamos anteriormente. En cuanto al módulo lector RFID, usa el protocolo SPI para comunicarse con la placa Arduino y aquí está cómo necesitamos conectarlos. Ten en cuenta que debemos conectar el VCC del módulo a 3,3 V y en cuanto a los otros pines no nos tenemos que preocupar ya que son tolerantes a 5 V. Una vez conectado el módulo, necesitamos descargar la librería MFRC522 de GitHub. La librería viene con varios buenos ejemplos desde los cuales podemos aprender a usar el módulo. Primero podemos subir el ejemplo "DumpInfo" y probar si nuestro sistema funciona correctamente. Ahora, si ejecutamos el Monitor Serial y acercamos la etiqueta al módulo, el lector comenzará a leer la etiqueta y toda la información de la etiqueta se mostrará en el monitor serial. Aquí podemos notar el número UID de la etiqueta, así como el 1 KB de memoria que en realidad está dividido en 16 sectores, cada sector en 4 bloques y cada bloque puede almacenar 2 bytes de datos. Para este tutorial no usaremos ninguna de la memoria de la etiqueta, solo usaremos el número UID de la etiqueta. Antes de revisar el código de nuestro proyecto de cerradura RFID, veamos los componentes y el esquema del circuito de este proyecto. Además del módulo RFID usaremos un sensor de proximidad para comprobar si la puerta está cerrada o abierta, un servomotor para el mecanismo de cierre y una pantalla de caracteres. Puedes conseguir los componentes necesarios para este tutorial de Arduino en los enlaces a continuación: El proyecto tiene el siguiente flujo de trabajo: Primero tenemos que establecer una etiqueta maestra y luego el sistema entra en modo normal. Si escaneamos una etiqueta desconocida, el acceso será denegado, pero si escaneamos la maestra entraremos en un modo de programación desde donde podremos añadir y autorizar la etiqueta desconocida. Así que ahora, si escaneamos la etiqueta de nuevo, el acceso será concedido y podremos abrir la puerta. La puerta se bloqueará automáticamente después de cerrarla. Si queremos eliminar una etiqueta del sistema, solo tenemos que entrar de nuevo en modo de programación, escanear la etiqueta conocida y será eliminada. Ahora veamos el código. Primero necesitamos incluir las librerías para el módulo RFID, la pantalla y el servomotor, definir algunas variables necesarias para el programa a continuación, así como crear las instancias de las librerías. En la sección setup, primero inicializamos los módulos y establecemos el valor inicial del servomotor en posición de bloqueo. Luego imprimimos el mensaje inicial en la pantalla y con el siguiente bucle "while" esperamos hasta que se escanee una etiqueta maestra. La función personalizada getID() obtiene el UID de la etiqueta y lo ponemos en la primera posición del array myTags[0]. Veamos la función personalizada getID(). Primero comprueba si hay una nueva etiqueta cerca del lector y, si es así, continuaremos al bucle "for" que obtendrá el UID de la etiqueta. Las etiquetas que usamos tienen un número UID de 4 bytes, por eso necesitamos hacer 4 iteraciones con este bucle, y usando la función concat() añadimos los 4 bytes en una sola variable String. También ponemos todos los caracteres de la cadena en mayúsculas y al final detenemos la lectura. Antes de entrar en el bucle principal, al final de la sección setup, también llamamos a la función personalizada printNormalModeMessage() que imprime el mensaje "Control de Acceso" en la pantalla. En el bucle principal empezamos leyendo el valor del sensor de proximidad, que nos dice si la puerta está cerrada o no. Así que si la puerta está cerrada, usando las mismas líneas que describimos en la función personalizada getID() escanearemos y obtendremos el UID de la nueva etiqueta. Podemos notar aquí que el código no procederá más hasta que escaneemos una etiqueta debido a las líneas "return" en las sentencias "if". Una vez que tenemos la etiqueta escaneada, comprobamos si esa etiqueta es la maestra que registramos anteriormente, y si es cierto entraremos en el modo de programación. En este modo, si escaneamos una etiqueta ya autorizada, será eliminada del sistema, o si la etiqueta es desconocida se añadirá al sistema como autorizada. Fuera del modo de programación, con el siguiente bucle "for" comprobamos si la etiqueta escaneada es igual a cualquiera de las etiquetas registradas y desbloqueamos la puerta o mantenemos el acceso denegado. Al final, en la sentencia "else" esperamos hasta que la puerta se cierre, luego bloqueamos la puerta e imprimimos el mensaje de modo normal de nuevo. Eso es prácticamente todo y aquí está el código completo del proyecto: Espero que hayas disfrutado este tutorial y siéntete libre de hacer cualquier pregunta en la sección de comentarios a continuación.Resumen

Cómo funciona RFID


RFID y Arduino




Proyecto de control de acceso: Cerradura RFID con Arduino


Código Fuente
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;
// Crear instancias
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // Parámetros: (rs, enable, d4, d5, d6, d7)
Servo myServo; // ServomotorLenguaje: Arduino (arduino)void setup() {
SPI.begin(); // Bus SPI
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // Pantalla LCD
myServo.attach(8); // Servomotor
myServo.write(10); // Posición inicial de bloqueo del servomotor
// Imprime mensaje inicial
lcd.print("-No Master Tag!-");
lcd.setCursor(0, 1);
lcd.print(" SCAN NOW");
// Espera hasta que se escanee una tarjeta maestra
while (!successRead) {
successRead = getID();
if (successRead == true) {
myTags[tagsCount] = strdup(tagID.c_str()); // Establece etiqueta maestra en posición 0
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Master Tag Set!");
tagsCount++;
}
}
successRead = false;
printNormalModeMessage();
}Lenguaje: Arduino (arduino)uint8_t getID() {
// Preparando para leer PICCs
if (!mfrc522.PICC_IsNewCardPresent()) {
return 0;
}
if (!mfrc522.PICC_ReadCardSerial()) {
return 0;
}
tagID = "";
for (uint8_t i = 0; i < 4; i++) {
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
}
tagID.toUpperCase();
mfrc522.PICC_HaltA(); // Detener lectura
return 1;
}Lenguaje: Arduino (arduino)void printNormalModeMessage() {
delay(1500);
lcd.clear();
lcd.print("-Access Control-");
lcd.setCursor(0, 1);
lcd.print(" Scan Your Tag!");
}Lenguaje: Arduino (arduino)int proximitySensor = analogRead(A0);Lenguaje: Arduino (arduino)// Comprueba si la etiqueta escaneada es la etiqueta maestra
if (tagID == myTags[0]) {
lcd.clear();
lcd.print("Program mode:");
lcd.setCursor(0, 1);
lcd.print("Add/Remove Tag");
while (!successRead) {
successRead = getID();
if (successRead == true) {
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
myTags[i] = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Removed!");
printNormalModeMessage();
return;
}
}
myTags[tagsCount] = strdup(tagID.c_str());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Added!");
printNormalModeMessage();
tagsCount++;
return;
}
}
}Lenguaje: Arduino (arduino)// Comprueba si la etiqueta escaneada está autorizada
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Granted!");
myServo.write(170); // Desbloquea la puerta
printNormalModeMessage();
correctTag = true;
}
}
if (correctTag == false) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Denied!");
printNormalModeMessage();
}
}
// Si la puerta está abierta...
else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Door Opened!");
while (!doorOpened) {
proximitySensor = analogRead(A0);
if (proximitySensor > 200) {
doorOpened = true;
}
}
doorOpened = false;
delay(500);
myServo.write(10); // Bloquea la puerta
printNormalModeMessage();
}Lenguaje: Arduino (arduino)/*
* Proyecto Arduino Cerradura Control Acceso RFID
* by Dejan Nedelkovski, www.HowToMechatronics.com
* Librería: MFRC522, https://github.com/miguelbalboa/rfid
*/
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal.h>
#include <Servo.h>
#define RST_PIN 9
#define SS_PIN 10
byte readCard[4];
char* myTags[100] = {};
int tagsCount = 0;
String tagID = "";
boolean successRead = false;
boolean correctTag = false;
int proximitySensor;
boolean doorOpened = false;
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
Servo myServo;
void setup() {
SPI.begin();
mfrc522.PCD_Init();
lcd.begin(16, 2);
myServo.attach(8);
myServo.write(10);
lcd.print("-No Master Tag!-");
lcd.setCursor(0, 1);
lcd.print(" SCAN NOW");
while (!successRead) {
successRead = getID();
if (successRead == true) {
myTags[tagsCount] = strdup(tagID.c_str());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Master Tag Set!");
tagsCount++;
}
}
successRead = false;
printNormalModeMessage();
}
void loop() {
int proximitySensor = analogRead(A0);
if (proximitySensor > 200) {
if (!mfrc522.PICC_IsNewCardPresent()) return;
if (!mfrc522.PICC_ReadCardSerial()) return;
tagID = "";
for (uint8_t i = 0; i < 4; i++) {
tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
}
tagID.toUpperCase();
mfrc522.PICC_HaltA();
correctTag = false;
if (tagID == myTags[0]) {
lcd.clear();
lcd.print("Program mode:");
lcd.setCursor(0, 1);
lcd.print("Add/Remove Tag");
while (!successRead) {
successRead = getID();
if (successRead == true) {
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
myTags[i] = "";
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Removed!");
printNormalModeMessage();
return;
}
}
myTags[tagsCount] = strdup(tagID.c_str());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Tag Added!");
printNormalModeMessage();
tagsCount++;
return;
}
}
}
successRead = false;
for (int i = 0; i < 100; i++) {
if (tagID == myTags[i]) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Granted!");
myServo.write(170);
printNormalModeMessage();
correctTag = true;
}
}
if (correctTag == false) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Access Denied!");
printNormalModeMessage();
}
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Door Opened!");
while (!doorOpened) {
proximitySensor = analogRead(A0);
if (proximitySensor > 200) {
doorOpened = true;
}
}
doorOpened = false;
delay(500);
myServo.write(10);
printNormalModeMessage();
}
}
uint8_t getID() {
if (!mfrc522.PICC_IsNewCardPresent()) return 0;
if (!mfrc522.PICC_ReadCardSerial()) return 0;
tagID = "";
for (uint8_t i = 0; i < 4; i++) {
readCard[i] = mfrc522.uid.uidByte[i];
tagID.concat(String(mfrc522.uid.uidByte[i], HEX));
}
tagID.toUpperCase();
mfrc522.PICC_HaltA();
return 1;
}
void printNormalModeMessage() {
delay(1500);
lcd.clear();
lcd.print("-Access Control-");
lcd.setCursor(0, 1);
lcd.print(" Scan Your Tag!");
}Lenguaje: Arduino (arduino)
Proceso de manufactura
- Construye un Cerrajero RFID Seguro con Arduino y RC522 (MIFARE 13.56 MHz)
- Crea un Cerrojo RFID Seguro con Arduino – Guía Paso a Paso
- Crea un Botón de Teclado Personalizado y "Apuñalable" con Arduino: Guía Paso a Paso
- Cerradura de Puerta Segura por Contraseña con Arduino, Teclado y Actuador Lineal
- Autómatas Celulares en Tiempo Real con Arduino y Pantalla OLED 128x64
- eDOT: Reloj Preciso y Estación Meteorológica Arduino con Control IR Integrado
- Sistema de control de asistencia RFID en tiempo real con Arduino y Google Sheets
- Genera Tonos Musicales con Arduino: Guía Paso a Paso
- Puerta automática con Arduino y sensor ultrasónico HC-SR04
- Cerradura Inteligente Sin Llave: Arduino y Android con Bluetooth y Contraseña
- Construye una Brújula Digital en Tiempo Real con Arduino y Processing