Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

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.

Resumen

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.

Construye una cerradura RFID con Arduino – Domina la tecnología RFID paso a paso

Cómo funciona RFID


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.

Construye una cerradura RFID con Arduino – Domina la tecnología RFID paso a paso

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.

Construye una cerradura RFID con Arduino – Domina la tecnología RFID paso a paso

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.

RFID y Arduino

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.

Construye una cerradura RFID con Arduino – Domina la tecnología RFID paso a paso

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.

Construye una cerradura RFID con Arduino – Domina la tecnología RFID paso a paso

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.

Construye una cerradura RFID con Arduino – Domina la tecnología RFID paso a paso

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.

Construye una cerradura RFID con Arduino – Domina la tecnología RFID paso a paso

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.

Proyecto de control de acceso: Cerradura RFID con Arduino

Antes de revisar el código de nuestro proyecto de cerradura RFID, veamos los componentes y el esquema del circuito de este proyecto.

Construye una cerradura RFID con Arduino – Domina la tecnología RFID paso a paso

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:

  • Módulo RFID MFRC522 …………………….
  • Servomotor ……………………………………..
  • Pantalla LCD ………………………………………
  • Placa Arduino ………………………………….
  • Protoboard y cables jumper ……………..
  • Sensor de proximidad CNY70 ……………………

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.

Construye una cerradura RFID con Arduino – Domina la tecnología RFID paso a paso

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.

Código Fuente

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.

#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)

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].

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)

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.

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)

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.

void printNormalModeMessage() {
  delay(1500);
  lcd.clear();
  lcd.print("-Access Control-");
  lcd.setCursor(0, 1);
  lcd.print(" Scan Your Tag!");
}Lenguaje: Arduino (arduino)

En el bucle principal empezamos leyendo el valor del sensor de proximidad, que nos dice si la puerta está cerrada o no.

int proximitySensor = analogRead(A0);Lenguaje: Arduino (arduino)

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.

// 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)

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.

// 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)

Eso es prácticamente todo y aquí está el código completo del proyecto:

/* 
 * 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)

Espero que hayas disfrutado este tutorial y siéntete libre de hacer cualquier pregunta en la sección de comentarios a continuación.


Proceso de manufactura

  1. Construye un Cerrajero RFID Seguro con Arduino y RC522 (MIFARE 13.56 MHz)
  2. Crea un Cerrojo RFID Seguro con Arduino – Guía Paso a Paso
  3. Crea un Botón de Teclado Personalizado y "Apuñalable" con Arduino: Guía Paso a Paso
  4. Cerradura de Puerta Segura por Contraseña con Arduino, Teclado y Actuador Lineal
  5. Autómatas Celulares en Tiempo Real con Arduino y Pantalla OLED 128x64
  6. eDOT: Reloj Preciso y Estación Meteorológica Arduino con Control IR Integrado
  7. Sistema de control de asistencia RFID en tiempo real con Arduino y Google Sheets
  8. Genera Tonos Musicales con Arduino: Guía Paso a Paso
  9. Puerta automática con Arduino y sensor ultrasónico HC-SR04
  10. Cerradura Inteligente Sin Llave: Arduino y Android con Bluetooth y Contraseña
  11. Construye una Brújula Digital en Tiempo Real con Arduino y Processing