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.

Visión general

RFID significa identificación por radiofrecuencia 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 en bibliotecas, sistemas de peajes, etc.

Cómo funciona RFID

Un sistema RFID consta de dos componentes principales, un transpondedor o etiqueta que se ubica en 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 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 esta El voltaje sirve como energía para el microchip.

Ahora que la etiqueta está encendida, puede extraer el mensaje transmitido del 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 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 existe otra forma de transferencia de datos entre el lector y la etiqueta, denominada 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

Así que 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. Utilizaremos etiquetas basadas en el protocolo MIFARE y el lector RFID MFRC522, que cuestan solo un par de dólares.

Estas etiquetas tienen 1 kb de memoria y tienen un microchip que puede realizar operaciones aritméticas. Su frecuencia de funcionamiento es de 13,56 MHz y la distancia de funcionamiento 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 hablamos 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 conectamos el módulo, necesitamos descargar la biblioteca MFRC522  de GitHub. La biblioteca viene con varios buenos ejemplos de los que podemos aprender a usar el módulo.

Primero podemos cargar el ejemplo de “DumpInfo” y probar si nuestro sistema funciona correctamente. Ahora, si ejecutamos el Monitor en 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 en serie.

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 la memoria de la etiqueta, solo usaremos el número UID de la etiqueta.

Proyecto de control de acceso de cerradura de puerta Arduino RFID

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 en los enlaces a continuación:

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

El proyecto tiene el siguiente flujo de trabajo: primero tenemos que configurar una etiqueta maestra y luego el sistema entra en modo normal. Si escaneamos una etiqueta desconocida se nos denegará el acceso, pero si escaneamos el maestro ingresaremos a un modo de programa desde donde podemos agregar y autorizar la etiqueta desconocida. Entonces, si volvemos a escanear la etiqueta, se nos otorgará 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 al modo de programa, escanear la etiqueta conocida y se eliminará.

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 = "" ;
booleano successRead = false ;
boolean correctTag = falso ;
int proximidadSensor;
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; // Servo motor

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 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 la etiqueta UID y la colocamos en la primera ubicación de la matriz myTags [0].

configuración vacía () {  
  // Iniciando
  SPI. comenzar () ;       // bus SPI
  mfrc522. PCD_Init () ; // MFRC522
  lcd. comenzar ( 16, 2 ) ;  // Pantalla LCD
  myServo. adjuntar ( 8 ) ; // Servo motor
  myServo. escribir ( 10 ) ; // Posición de bloqueo inicial del servomotor
  // Imprime el mensaje inicial
  lcd. print ( "-¡Sin etiqueta maestra! -" ) ;
  lcd. setCursor ( 0, 1 ) ;
  lcd. imprimir ( "ESCANEAR AHORA" ) ;
  // Espera hasta que se escanea una tarjeta maestra
  while ( ! successRead ) {  
    SuccessRead = getID () ;
    if ( successRead == true ) {  
      myTags [ tagsCount ] = strdup ( tagID. c_str ()) ; // Establece la etiqueta maestra en la posición 0 en la matriz
      lcd. claro () ;
      lcd. setCursor ( 0, 0 ) ;
      lcd. print ( "Conjunto de etiquetas maestras" ) ;
      tagsCount ++;
    }
  }
  SuccessRead = falso ;
  printNormalModeMessage () ;
}

Echemos un vistazo a la función personalizada getID (). Primero verifica si hay una nueva etiqueta colocada cerca del lector y si es así continuaremos con el ciclo «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 ciclo, y usando la función concat () agregamos los 4 bytes en una sola variable String. También ponemos todos los caracteres de la cadena en mayúsculas y al final paramos la lectura.

uint8_t getID () {  
  // Preparándose para leer PICC
  if ( ! mfrc522. PICC_IsNewCardPresent ()) { // Si un nuevo PICC colocado en el lector RFID continúe  
    return 0;
  }
  if ( ! mfrc522. PICC_ReadCardSerial ()) { // Desde que se colocó un PICC, obtenga Serial y continúe    
    return 0;
  }
  tagID = "" ;
  for ( uint8_t i = 0; i < 4; i ++ ) { // Los PICC MIFARE que usamos tienen UID de 4 bytes    
    readCard [ i ] = mfrc522. uid . uidByte [ i ] ;
    tagID. concat ( Cadena ( mfrc522. uid . uidByte [ i ] , HEX )) ; // Agrega los 4 bytes en una sola variable de cadena
  }
  tagID. toUpperCase () ;
  mfrc522. PICC_HaltA () ; // Para de leer
  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.

void printNormalModeMessage () {  
  retraso ( 1500 ) ;
  lcd. claro () ;
  lcd. print ( "-Control de acceso-" ) ;
  lcd. setCursor ( 0, 1 ) ;
  lcd. imprimir ( "¡Escanee su etiqueta!" ) ;
}

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

int sensor de proximidad = analogRead ( A0 ) ;

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 «return» en las declaraciones «if».

Una vez que tenemos la etiqueta escaneada comprobamos si esa etiqueta es la maestra que registramos previamente, y si eso es cierto ingresaremos al modo de 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.

// Comprueba si la etiqueta escaneada es la etiqueta maestra
    if ( tagID == myTags [ 0 ]) {  
      lcd. claro () ;
      lcd. print ( "Modo de programa:" ) ;
      lcd. setCursor ( 0, 1 ) ;
      lcd. print ( "Agregar / quitar etiqueta" ) ;
      while ( ! successRead ) {  
        SuccessRead = getID () ;
        if ( successRead == true ) {  
          para ( int i = 0; i < 100; i ++ ) {  
            if ( tagID == myTags [ i ]) {  
              myTags [ i ] = "" ;
              lcd. claro () ;
              lcd. setCursor ( 0, 0 ) ;
              lcd. print ( "¡Etiqueta eliminada!" ) ;
              printNormalModeMessage () ;
              volver ;
            }
          }
          myTags [ tagsCount ] = strdup ( tagID. c_str ()) ;
          lcd. claro () ;
          lcd. setCursor ( 0, 0 ) ;
          lcd. print ( "¡Etiqueta agregada!" ) ;
          printNormalModeMessage () ;
          tagsCount ++;
          volver ;
        }
      }
    }

Fuera del modo de programa, con el siguiente bucle «for» comprobamos si la etiqueta escaneada es igual a alguna de las etiquetas registradas y desbloqueamos la puerta o mantenemos el acceso denegado. Al final de la instrucción «else» esperamos hasta que la puerta se cierre, luego bloqueamos la puerta e imprimimos el mensaje de modo normal nuevamente.

// Comprueba si la etiqueta escaneada está autorizada
    para ( int i = 0; i < 100; i ++ ) {  
      if ( tagID == myTags [ i ]) {  
        lcd. claro () ;
        lcd. setCursor ( 0, 0 ) ;
        lcd. print ( "¡Acceso concedido!" ) ;
        myServo. escribir ( 170 ) ; // Abre la puerta
        printNormalModeMessage () ;
        correctTag = verdadero ;
      }
    }
    if ( correctTag == false ) {  
      lcd. claro () ;
      lcd. setCursor ( 0, 0 ) ;
      lcd. print ( "Acceso denegado" ) ;
      printNormalModeMessage () ;
    }
  }
  // Si la puerta está abierta ...
  else { 
    lcd. claro () ;
    lcd. setCursor ( 0, 0 ) ;
    lcd. print ( "¡Puerta abierta!" ) ;
    while ( ! doorOpened ) {  
sensor de       proximidad = analogRead ( A0 ) ;
      si ( sensor de proximidad > 200 ) {  
        doorOpened = verdadero ;
      }
    }
    doorOpened = falso ;
    retraso ( 500 ) ;
    myServo. escribir ( 10 ) ; // Cierra la puerta
    printNormalModeMessage () ;
  }

Home