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

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. Puede ver el siguiente video o leer el tutorial escrito a continuación para obtener 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 la cadena de suministro, seguimiento de libros en bibliotecas, sistemas de peaje, etc.[/column]

Cómo funciona RFID


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

El lector RFID consta de 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 únicamente 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 la bobina de su antena y esto el voltaje sirve como energía para el microchip.

Ahora que la etiqueta está alimentada, puede extraer el mensaje transmitido del lector y, para devolver el mensaje al lector, utiliza 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, que se puede medir como caída de voltaje. Estos cambios en el voltaje se capturarán como unos y ceros y esa es la forma en que los datos se transfieren desde la etiqueta al lector.

También hay otra forma de transferencia de datos entre el lector y la etiqueta, llamada acoplamiento retrodispersado. En este caso, la etiqueta utiliza parte de la potencia recibida para generar otro campo electromagnético que será captado por la antena del lector.

RFID y Arduino

Ese es el principio básico de funcionamiento y ahora veamos cómo podemos usar RFID con Arduino y construir nuestra propia cerradura de puerta RFID. Usaremos etiquetas que se basan en el protocolo MIFARE y el lector RFID MFRC522, que cuestan solo un par de dólares.

Estas etiquetas tienen 1kb de memoria y tienen 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. Si acercamos una de estas etiquetas frente a una fuente de luz podemos notar la antena y el microchip del que hablábamos anteriormente.

En cuanto al módulo lector RFID, utiliza el protocolo SPI para la comunicación con la placa Arduino y así es como debemos conectarlos. Tenga 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 conectemos el módulo, debemos descargar la biblioteca MFRC522 de GitHub. La biblioteca viene con varios buenos ejemplos de 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 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.

Aquí podemos notar el número de UID de la etiqueta, así como el 1 KB de memoria que en realidad se divide en 16 sectores, cada sector en 4 bloques y cada bloque puede almacenar 2 bytes de datos. Para este tutorial no usaremos nada de la memoria de la etiqueta, solo usaremos el número de UID de la etiqueta.

Proyecto de control de acceso de cerradura de puerta Arduino RFID

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

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

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

  • Módulo RFID MFRC522 …………………….
  • Servomotor ……………………………………..
  • Pantalla LCD …………………………………………
  • Placa Arduino …………………………………….
  • Placa de prueba y cables de salto …………….. 
  • 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 se negará el acceso, pero si escaneamos el maestro entraremos en un modo de programa desde donde podemos agregar y autorizar la etiqueta desconocida. Ahora, si volvemos a escanear la etiqueta, se otorgará el acceso para que podamos abrir la puerta.

La puerta se bloqueará automáticamente después de que cerremos la puerta. Si queremos eliminar una etiqueta del sistema solo tenemos que volver a entrar en modo programa, escanear la etiqueta conocida y será eliminada.

Código fuente

Ahora echemos un vistazo al código.  Entonces, primero debemos incluir las bibliotecas para el módulo RFID, la pantalla y el servomotor, definir algunas variables necesarias para el programa a continuación 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 establecemos el valor inicial del servomotor en una posición de bloqueo. Luego imprimimos el mensaje inicial en la pantalla y con el siguiente ciclo "while" esperamos hasta que se escanee una etiqueta maestra. La función personalizada getID() obtiene el UID de la etiqueta y lo colocamos en la primera ubicación de la matriz myTags[0].

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 verifica si hay una nueva etiqueta colocada cerca del lector y, de ser así, continuaremos con el bucle "for" que obtendrá el UID de la etiqueta. Las etiquetas que estamos usando tienen un número de UID de 4 bytes, por eso necesitamos hacer 4 iteraciones con este bucle, y usando la función concat() agregamos los 4 bytes en una sola variable de cadena. También ponemos todos los caracteres de la cadena en mayúsculas y al final detenemos la lectura.

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

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 comenzamos con la lectura del valor del sensor de proximidad, que nos dice si la puerta está cerrada o no.

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

Entonces, 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 continuará hasta que escaneemos una etiqueta debido a las líneas de "retorno" en las declaraciones "si".

Una vez escaneada la etiqueta comprobamos si esa etiqueta es la maestra que registramos previamente, y si es así entraremos en modo programa. En este modo, si escaneamos una etiqueta ya autorizada, se eliminará del sistema, o si la etiqueta es desconocida, se agregará al sistema como autorizada.

// 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 programa, con el siguiente bucle “for” comprobamos si la etiqueta escaneada es igual a alguna de las etiquetas registradas y o bien desbloqueamos la puerta o mantenemos el acceso denegado. Al final de la instrucción "else", esperamos hasta que se cierre la puerta, luego bloqueamos la puerta e imprimimos 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 prácticamente 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 este tutorial y no dudes en hacer cualquier pregunta en la sección de comentarios a continuación.


Proceso de manufactura

  1. Arduino RFID Lock con RC522 - Protocolo MIFARE 13.56 Mhz
  2. Tutorial de bloqueo RFID de Arduino
  3. Cómo hacer un botón de teclado perforable personalizable
  4. Cerradura de puerta basada en contraseña
  5. Autómatas celulares basados ​​en Arduino y OLED
  6. eDOT - Reloj de precisión y estación meteorológica basados ​​en Arduino
  7. Sistema de asistencia basado en Arduino y hoja de cálculo de Google
  8. Cómo hacer música con un Arduino
  9. Cómo hacer una apertura automática de puerta basada en Arduino
  10. Cerradura de puerta protegida con contraseña basada en Arduino y Android
  11. Cómo hacer una brújula usando Arduino y Processing IDE