Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

La tecnología RFID ha revolucionado la forma en que interactuamos con la seguridad y la identificación en el mundo actual. En este artículo, te enseñaremos cómo funciona el RFID y cómo puedes utilizarlo para crear una cerradura de puerta basada en Arduino. ¡Descubre cómo llevar tus proyectos de seguridad al siguiente nivel con esta innovadora tecnología!

En este tutorial, aprenderemos qué es RFID, cómo funciona y cómo hacer una cerradura de puerta RFID basada en Arduino. Para obtener más detalles, puede ver el siguiente vídeo o leer el tutorial escrito a continuación.

descripción general

RFID significa Identificación de frecuencia de radio Y es una tecnología sin contacto que se utiliza ampliamente en muchas industrias para tareas como seguimiento de personal, control de acceso, gestión de la cadena de suministro, seguimiento de libros de bibliotecas, sistemas de peajes, etc.[/column]

Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

Cómo funciona la RFID


Un sistema RFID consta de dos componentes principales: un transpondedor o etiqueta que se coloca sobre el objeto que queremos identificar y un transceptor o lector.

Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

El>

Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

Ahora,>

También existe otra forma de transmitir datos entre el lector y la etiqueta, llamada acoplamiento de retrodispersión. En este caso, la etiqueta utiliza parte de la potencia recibida para generar otro campo electromagnético, que es 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 de puerta RFID. Usaremos etiquetas basadas en el protocolo MIFARE y el lector RFID MFRC522, que solo cuestan unos pocos dólares.

Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

Estas>

Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

El>

Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

Una>biblioteca de GitHub. La biblioteca contiene varios buenos ejemplos que podemos usar para aprender a usar el módulo.

Primero, podemos cargar la muestra de DumpInfo y probar si nuestro sistema funciona correctamente. Ahora, cuando ejecutamos el monitor serie 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 serie.

Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

Aquí>

Proyecto de control de acceso de cerradura de puerta Arduino RFID

Antes de repasar el código de nuestro proyecto de cerradura de puerta RFID, echemos un vistazo a los componentes y los esquemas de este proyecto.

Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

Además>

Puede obtener los componentes necesarios para este tutorial de Arduino en los siguientes enlaces:

  • Módulo RFID MFRC522……………………. Amazon / Banggood / AliExpress
  • Servo motor …………………………………….. Amazon / Banggood / AliExpress
  • Pantalla LCD ……………………………………… Amazon / Banggood / AliExpress
  • Placa Arduino……………………………………. Amazon / Banggood / AliExpress
  • Cables de puente y placa de pruebas………….. Amazon / Banggood / AliExpress
  • Sensor de proximidad CNY70…………………… Amazon/AliExpress

Divulgación: estos son enlaces de afiliados. Como asociado de Amazon, gano con compras que califican.

El proyecto tiene el siguiente flujo: Primero tenemos que configurar una etiqueta maestra y luego el sistema entra en modo normal. Si escaneamos una etiqueta desconocida se deniega el acceso, pero si escaneamos el maestro entramos en un modo de programación donde podemos agregar y autorizar la etiqueta desconocida. Ahora, si escaneamos la etiqueta nuevamente, se nos otorgará acceso para que podamos abrir la puerta.

Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

La>

Código fuente

Ahora veamos el código. Entonces, primero tenemos que integrar las bibliotecas para el módulo RFID, la pantalla y el servomotor, definir algunas variables requeridas para el siguiente programa y crear las instancias de las bibliotecas.

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

// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motorCode language: Arduino (arduino)

En la sección de configuración, primero inicializamos los módulos y configuramos el valor inicial del servomotor en una posición de bloqueo. Luego imprimimos el primer mensaje en la pantalla y esperamos con el siguiente bucle » while » hasta que se escanee una etiqueta maestra. La función personalizada getID() obtiene la etiqueta UID y la colocamos en la primera posición de myTags[0] formación.

void setup() {
  // Initiating
  SPI.begin();        // SPI bus
  mfrc522.PCD_Init(); //  MFRC522
  lcd.begin(16, 2);   // LCD screen
  myServo.attach(8);  // Servo motor

  myServo.write(10); // Initial lock position of the servo motor
  // Prints the initial message
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print("    SCAN NOW");
  // Waits until a master card is scanned
  while (!successRead) {
    successRead = getID();
    if ( successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}Code language: Arduino (arduino)

Echemos un vistazo a la función personalizada getID(). Primero se comprueba si hay una nueva etiqueta colocada cerca del lector. En caso afirmativo, procedemos con el bucle «for» que obtiene el UID de la etiqueta. Las etiquetas que estamos usando tienen un número UID de 4 bytes, por lo que necesitamos hacer 4 iteraciones con este bucle y usar la función concat() para agregar los 4 bytes a una sola variable de cadena. También configuramos todos los caracteres de la cadena en mayúsculas y dejamos de leer al final.

uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  tagID = "";
  for ( uint8_t i = 0; i < 4; i++) {  // The MIFARE PICCs that we use have 4 byte UID
    readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}Code language: Arduino (arduino)

Antes de ingresar al bucle principal, también llamamos a la función personalizada printNormalModeMessage() al final de la sección de configuración, 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!");
}Code language: Arduino (arduino)

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

int proximitySensor = analogRead(A0);Code language: Arduino (arduino)

Entonces, cuando la puerta está cerrada, usando las mismas líneas que describimos en la función personalizada getID(), escaneamos y obtenemos el UID de la nueva etiqueta. Podemos notar aquí que debido a las líneas «Retorno» en las declaraciones «Si», el código no avanza hasta que escaneamos una etiqueta.

Una vez que escaneamos la etiqueta, verificamos si esta etiqueta es la maestra que registramos previamente. Si esto es cierto, entramos en modo programación. En este modo, si escaneamos una etiqueta ya autorizada, será eliminada del sistema. Si la etiqueta es desconocida, se agrega al sistema según lo autorizado.

// Checks whether the scanned tag is the master tag
    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;
        }
      }
    }Code language: Arduino (arduino)

Fuera del modo de programación, utilizamos el siguiente bucle «for» para comprobar si la etiqueta escaneada coincide con una de las etiquetas registradas y desbloquear la puerta o dejar el acceso denegado. Al final de la declaración «else», esperamos hasta que se cierre la puerta, luego la bloqueamos y emitimos el mensaje de modo normal nuevamente.

// Checks whether the scanned tag is authorized
    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170); // Unlocks the door
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  }
  // If door is open...
  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); // Locks the door
    printNormalModeMessage();
  }Code language: Arduino (arduino)

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

/*
* Arduino Door Lock Access Control Project
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: 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;

// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor

void setup() {
  // Initiating
  SPI.begin();        // SPI bus
  mfrc522.PCD_Init(); //  MFRC522
  lcd.begin(16, 2);   // LCD screen
  myServo.attach(8);  // Servo motor

  myServo.write(10); // Initial lock position of the servo motor
  // Prints the initial message
  lcd.print("-No Master Tag!-");
  lcd.setCursor(0, 1);
  lcd.print("    SCAN NOW");
  // Waits until a master card is scanned
  while (!successRead) {
    successRead = getID();
    if ( successRead == true) {
      myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Master Tag Set!");
      tagsCount++;
    }
  }
  successRead = false;
  printNormalModeMessage();
}

void loop() {
  int proximitySensor = analogRead(A0);
  // If door is closed...
  if (proximitySensor > 200) {
    if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
      return;
    }
    if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
      return;
    }
    tagID = "";
    // The MIFARE PICCs that we use have 4 byte UID
    for ( uint8_t i = 0; i < 4; i++) {  //
      readCard[i] = mfrc522.uid.uidByte[i];
      tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
    }
    tagID.toUpperCase();
    mfrc522.PICC_HaltA(); // Stop reading

    correctTag = false;
    // Checks whether the scanned tag is the master tag
    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;
    // Checks whether the scanned tag is authorized
    for (int i = 0; i < 100; i++) {
      if (tagID == myTags[i]) {
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print(" Access Granted!");
        myServo.write(170); // Unlocks the door
        printNormalModeMessage();
        correctTag = true;
      }
    }
    if (correctTag == false) {
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(" Access Denied!");
      printNormalModeMessage();
    }
  }
  // If door is open...
  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); // Locks the door
    printNormalModeMessage();
  }
}

uint8_t getID() {
  // Getting ready for Reading PICCs
  if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
    return 0;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {   //Since a PICC placed get Serial and continue
    return 0;
  }
  tagID = "";
  for ( uint8_t i = 0; i < 4; i++) {  // The MIFARE PICCs that we use have 4 byte UID
    readCard[i] = mfrc522.uid.uidByte[i];
    tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable
  }
  tagID.toUpperCase();
  mfrc522.PICC_HaltA(); // Stop reading
  return 1;
}

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

Espero que hayas disfrutado de este tutorial y no dudes en hacer cualquier pregunta en la sección de comentarios a continuación.

Categorías tutoriales de arduino
Error 403 The request cannot be completed because you have exceeded your quota. : quotaExceeded

Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino

En este tutorial aprenderemos qué es RFID, cómo funciona y cómo hacer una cerradura de puerta RFID basada en Arduino. Puedes ver el siguiente vídeo o leer el tutorial escrito a continuación para obtener más detalles.

Visión general

RFID significa Identificación por Radio Frecuencia y es una tecnología sin contacto ampliamente utilizada en muchas industrias para tareas como seguimiento de personal, control de acceso, gestión de la cadena de suministro, seguimiento de libros en bibliotecas, sistemas de peaje, etc.

Cómo funciona RFID

Un sistema RFID consta de dos componentes principales: un transpondedor o tag que se encuentra 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, el tag es generalmente 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 como alimentación para el microchip.

Ahora, una vez que el tag está alimentado, puede extraer el mensaje transmitido por el lector, y para enviar el mensaje de vuelta al lector, utiliza una técnica llamada manipulación de carga. Encender y apagar una carga en la antena del tag afectará el consumo de energía de la antena del lector, que se puede medir como una caída de voltaje. Este cambio en el voltaje se capturará como unos y ceros y así es como se transfiere los datos del tag al lector.

También hay otra forma de transferir datos entre el lector y el tag, llamada acoplamiento por retrodifusión. En este caso, el tag utiliza parte de la energía recibida para generar otro campo electromagnético que será recogido por la antena del lector.

RFID y Arduino

Una vez comprendido el principio de funcionamiento básico, veamos cómo podemos usar RFID con Arduino y construir nuestra propia cerradura de puerta RFID. Utilizaremos tags basados en el protocolo MIFARE y el lector RFID MFRC522, que cuestan solo un par de dólares.

Estos tags tienen 1kb de memoria y un microchip que puede realizar operaciones aritméticas. Su frecuencia de operación es de 13.56 MHz y la distancia de operación es de hasta 10 cm dependiendo de la geometría de la antena. Al acercar uno de estos tags a una fuente de luz, podemos notar la antena y el microchip del que hablamos anteriormente.

En cuanto al módulo del lector RFID, utiliza el protocolo SPI para la comunicación con la placa Arduino y aquí te mostramos cómo debemos conectarlos. Ten en cuenta que debemos conectar el VCC del módulo a 3.3V y en cuanto a los otros pines no tenemos que preocuparnos ya que son tolerantes a 5V.

Una vez que conectamos el módulo, necesitamos descargar la biblioteca MFRC522 desde GitHub. La biblioteca viene con varios buenos ejemplos de los cuales podemos aprender cómo usar el módulo.

Primero podemos cargar el ejemplo «DumpInfo» y probar si nuestro sistema funciona correctamente. Ahora, si ejecutamos el Monitor Serie y acercamos el tag al módulo, el lector comenzará a leer el tag y toda la información del tag se mostrará en el monitor serie.

Aquí podemos notar el número UID del tag, 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 la memoria del tag, solo usaremos el número UID del tag.

Proyecto de control de acceso de cerradura de puerta RFID Arduino

Antes de analizar el código de nuestro proyecto de cerradura de puerta RFID, echemos un vistazo a los componentes y el esquema del circuito de este proyecto.

Además del módulo RFID, utilizaremos un sensor de proximidad para verificar si la puerta está cerrada o abierta, un motor servo para el mecanismo de bloqueo y una pantalla de caracteres.

Puedes obtener los componentes necesarios para este Tutorial de Arduino en los siguientes enlaces:

  • Módulo RFID MFRC522 ……………………. Amazon / Banggood / AliExpress
  • Motor servo …………………………………….. Amazon / Banggood / AliExpress
  • Pantalla LCD ……………………………………… Amazon / Banggood / AliExpress
  • Placa Arduino …………………………………. Amazon / Banggood / AliExpress
  • Protoboard y cables de puente …………….. Amazon / Banggood / AliExpress
  • Sensor de Proximidad CNY70 …………………… Amazon / AliExpress

El proyecto tiene el siguiente flujo de trabajo: Primero debemos configurar un tag maestro y luego el sistema entra en modo normal. Si escaneamos un tag desconocido se denegará el acceso, pero si escaneamos el tag maestro entraremos en un modo de programa desde donde podemos agregar y autorizar el tag desconocido. Entonces, si escaneamos el tag nuevamente, se concederá el acceso para abrir la puerta. La puerta se bloqueará automáticamente después de cerrarla. Si deseamos eliminar un tag del sistema, simplemente debemos ingresar nuevamente en el modo de programa, escanear el tag conocido y se eliminará.

Código fuente

Ahora veamos el código del proyecto de nuestra cerradura de puerta RFID. Primero necesitamos incluir las bibliotecas para el módulo RFID, la pantalla y el motor servo, definir algunas variables necesarias para el programa a continuación y crear las instancias de las bibliotecas.

«`arduino
#include
#include
#include
#include

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

// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor
«`

En la sección de configuración, primero inicializamos los módulos y establecemos el valor inicial del motor servo en una posición de bloqueo. Luego imprimimos el mensaje inicial en la pantalla y con el siguiente bucle «while» esperamos hasta que se escanee un tag maestro. La función personalizada getID() obtiene el UID del tag y lo colocamos en la primera ubicación del array myTags[0].

«`arduino
void setup() {
// Iniciando
SPI.begin(); // Bus SPI
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // Pantalla LCD
myServo.attach(8); // Motor servo

myServo.write(10); // Posición de bloqueo inicial del motor servo
// Imprime el mensaje inicial
lcd.print(«-No Master Tag!»);
lcd.setCursor(0, 1);
lcd.print(» SCAN NOW»);
// Espera hasta que se escanee un tag maestro
while (!successRead) {
successRead = getID();
if ( successRead == true) {
myTags[tagsCount] = strdup(tagID.c_str()); // Establece el tag maestro en la posición 0 en la matriz
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(«Master Tag Set!»);
tagsCount++;
}
}
successRead = false;
printNormalModeMessage();
}
«`

Veamos la función personalizada getID(). Primero verifica si hay un nuevo tag colocado cerca del lector y si es así, continuamos en el bucle «for» que obtendrá el UID del tag. Los tags que estamos utilizando tienen un número UID de 4 bytes, por eso necesitamos hacer 4 iteraciones con este bucle, y mediante la función concat() agregamos los 4 bytes en una sola variable de tipo String. También convertimos todos los caracteres de la cadena a mayúsculas y al final detenemos la lectura.

«`arduino
uint8_t getID() {
// Preparándose para leer PICCs
if ( ! mfrc522.PICC_IsNewCardPresent()) { //Si se coloca un nuevo PICC en el lector RFID, continuar
return 0;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Desde que se coloca un PICC, obtén el Serial y continuar
return 0;
}
tagID = «»;
for ( uint8_t i = 0; i < 4; i++) { // Los PICCs MIFARE que usamos tienen 4 bytes de UID readCard[i] = mfrc522.uid.uidByte[i]; tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Agrega los 4 bytes en una sola variable de tipo String } tagID.toUpperCase(); mfrc522.PICC_HaltA(); // Detener la lectura return 1; } ```

Antes de ingresar al bucle principal, al final de la sección de configuración, también llamamos a la función personalizada printNormalModeMessage() que imprime el mensaje «Control de acceso» en la pantalla.

«`arduino
void printNormalModeMessage() {
delay(1500);
lcd.clear();
lcd.print(«-Access Control-«);
lcd.setCursor(0, 1);
lcd.print(» Scan Your Tag!»);
}
«`

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

«`arduino
int proximitySensor = analogRead(A0);
«`

Entonces, si la puerta está cerrada, usando las mismas líneas que describimos en la función personalizada getID() escaneamos y obtenemos el UID del nuevo tag. Podemos notar aquí que el código no avanzará más allá hasta que escaneemos un tag debido a las líneas de «return» en las declaraciones «if».

Una vez que escaneamos el tag, verificamos si ese tag es el maestro que registramos anteriormente, y si es así, ingresamos al modo de programa. En este modo, si escaneamos un tag ya autorizado, se eliminará del sistema, o si el tag es desconocido, se agregará al sistema como autorizado. Al final, en la declaración «else», esperamos hasta que la puerta esté cerrada, luego bloqueamos la puerta e imprimimos nuevamente el mensaje de modo normal.

«`arduino
// Se verifica si el tag escaneado es el tag maestro
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; } } } ``` ```arduino // 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();
}
«`

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

«`arduino
/*
* Arduino Door Lock Access Control Project
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
* Library: MFRC522, https://github.com/miguelbalboa/rfid
*/

#include
#include
#include
#include

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

// Create instances
MFRC522 mfrc522(SS_PIN, RST_PIN);
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Parameters: (rs, enable, d4, d5, d6, d7)
Servo myServo; // Servo motor

void setup() {
// Initiating
SPI.begin(); // SPI bus
mfrc522.PCD_Init(); // MFRC522
lcd.begin(16, 2); // LCD screen
myServo.attach(8); // Servo motor

myServo.write(10); // Initial lock position of the servo motor
// Prints the initial message
lcd.print(«-No Master Tag!-«);
lcd.setCursor(0, 1);
lcd.print(» SCAN NOW»);
// Waits until a master card is scanned
while (!successRead) {
successRead = getID();
if ( successRead == true) {
myTags[tagsCount] = strdup(tagID.c_str()); // Sets the master tag into position 0 in the array
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(«Master Tag Set!»);
tagsCount++;
}
}
successRead = false;
printNormalModeMessage();
}

void loop() {
int proximitySensor = analogRead(A0);
// If door is closed…
if (proximitySensor > 200) {
if ( ! mfrc522.PICC_IsNewCardPresent()) { //If a new PICC placed to RFID reader continue
return;
}
if ( ! mfrc522.PICC_ReadCardSerial()) { //Since a PICC placed get Serial and continue
return;
}
tagID = «»;
// The MIFARE PICCs that we use have 4 byte UID
for ( uint8_t i = 0; i < 4; i++) { // readCard[i] = mfrc522.uid.uidByte[i]; tagID.concat(String(mfrc522.uid.uidByte[i], HEX)); // Adds the 4 bytes in a single String variable } tagID.toUpperCase(); mfrc522.PICC_HaltA(); // Stop reading correctTag = false; // Checks whether the scanned tag is the master tag 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; // Checks whether the scanned tag is authorized for (int i = 0; i < 100; i++) { if (tagID == myTags[i]) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Access Granted!"); myServo.write(170); // Unlocks the door printNormalModeMessage(); correctTag = true; } } if (correctTag == false) { lcd.clear(); lcd.setCursor(0, 0); lcd.print(" Access Denied!"); printNormalModeMessage(); } } // If door is open... 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); // Locks the door
printNormalModeMessage();
}
}

uint8_t getID() {
// Getting ready for Reading PICCs
if ( ! mfrc522.PICC_IsNewCardPresent

2 comentarios en «Cómo funciona RFID y cómo hacer una cerradura de puerta RFID basada en Arduino»

Deja un comentario