Tutorial módulo RFID RC522 con Arduino en IOTeca

Tutorial módulo RFID RC522 con Arduino

Los lectores RFID(Radio Frequency IDentification) en la actualidad están teniendo granuso en los sistemas de identificación, seguridad, acceso de personal, y traza de productos en logística, cerraduras eléctricas.

Su principio de funcionamiento consiste en pasar un TAG, cerca de un lector RFID. El TAG tiene la capacidad de transmitir información al lector.

Los TAGs viene en diferentes modelos, los más comunes son en tarjetas, llaveros, etiquetas adhesivas e incluso como parte en algunos productos. Los TAGs incluyen una antena y un microchip encargado de realizar todo el proceso de comunicación. La energía la obtiene de la señal de radiofrecuencia, que si bien es pequeña, es suficiente para alimentar eal microchip, esta es la razón por la que es necesario acercarlos a una pequeña distancia del lector.

Módulo RFID RC522

Para este tutorial ulizaremos este módulo funciona como Lector y Grabador de TAGs RFID y viene con una tarjeta y un llavero. Es económico en comparación con otros módulo, ero debemos acercar los TAGs a menos de 1 cm.

Este módulo utiliza un sistema de modulación y demodulación de 13.56MHz, frecuencia que en la actualidad utiliza la tecnología RFID.

Se comunica por SPI, por lo que se puede implementar con cualquier microcontrolador con interfaz SPI, como un Arduino.

Conexión del entre el módulo RFID RC522 y Arduino UNO

RC522Arduino Uno
SDA10
SCK13
MOSI11
MISO12
IRQNo conectado
GNDGND
RST9
3.3V3.3V

Lectura del código de identificación

Para poder trabajar el Modulo en Arduino es necesario incroporar la librería correspondiente mediante el gestor de Librerías.

Desde el IDE de Arduino iremos a Herramientas -> Administrar bibliotecas. Buscaremos: MRFC522 by GithubCommunity Versión 1.4.5
Arduino RFID Library for MRFC522(SPI) Read(Write a RFID Card o Tag using the ISO/IEC 1443A/MIFARE interface.

También se puede descargar e importar la librería desde github.com/miguelbalboa/rfid.

A continuación se muestra un sketch para leer el código de identificación de nuestros TAGs

#include 
#include 

#define RST_PIN	9    //Pin 9 para el reset del RC522
#define SS_PIN	10   //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); //Creamos el objeto para el RC522

void setup() {
	Serial.begin(9600); //Iniciamos la comunicación  serial
	SPI.begin();        //Iniciamos el Bus SPI
	mfrc522.PCD_Init(); // Iniciamos  el MFRC522
	Serial.println("Lectura del UID");
}

void loop() {
	// Revisamos si hay nuevas tarjetas  presentes
	if ( mfrc522.PICC_IsNewCardPresent()) 
        {  
  		//Seleccionamos una tarjeta
            if ( mfrc522.PICC_ReadCardSerial()) 
            {
                  // Enviamos serialemente su UID
                  Serial.print("Card UID:");
                  for (byte i = 0; i < mfrc522.uid.size; i++) {
                          Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
                          Serial.print(mfrc522.uid.uidByte[i], HEX);   
                  } 
                  Serial.println();
                  // Terminamos la lectura de la tarjeta  actual
                  mfrc522.PICC_HaltA();         
            }      
	}	
}
Expliquemos las funciones referentes al módulo RC522

Instanciar el RC522

Es necesario utilizar la librería MFRC522.h, solo es necesario especificar los pines Reset y SDA(SS) del módulo, los demás pines trabajan con los pines SPI del Arduino.

#define RST_PIN	9    //Pin 9 para el reset del RC522
#define SS_PIN	10   //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); 

Iniciar el RC522

Este método inicia y configura al RC522 para su posterior lectura, solo es necesario llamarlo una vez por lo que generalmente se lo llama en void setup()

SPI.begin();        //Iniciamos el Bus SPI
mfrc522.PCD_Init(); // Iniciamos  el MFRC522

Verificar si hay un TAG presente

Este método nos devuelve verdadero o falso dependiendo si hay un TAG cerca del lector RC522.

mfrc522.PICC_IsNewCardPresent()

Seleccionar una TAG para lectura

Se utiliza este método cuando queremos comunicarnos con una TG, nos devuelve un valor verdadero si logra seleccionar uno para la lectura, de lo contrario nos retorna un valor falso.

mfrc522.PICC_ReadCardSerial()

Obtener el tamaño del código de identificación

Retorna el tamaño en Bytes del código de identificación del TAG.

mfrc522.uid.size

Leer el código de identificación

mfrc522.uid.uidByte

Finalizar la lectura

Con este método le indicamos que hemos terminado la lectura del TAG y IsNewCardPresent() devolverá falso para esta tarjeta mientras no se retire. Si después de retirarel TAG,se ingresa nuevamente el mismo se le considera como una nueva lectura.

mfrc522.PICC_HaltA();
Control de acceso usando RFID

Podemos realizar ahora uncontrol de acceso, que puedes aplicarse cerradura eléctrica.

Aprovechando que el módulo viene con un llavero y una tarjeta, crearemos un usuatio para cada uno. El llavero obtendrá acceso, mientras que que la tarjeta será rechazada.

Utilizaremos el sketch anterior y sólo le agregamos una función al prigrama para comparar los códigos y determinar si tienen o no acceso.

#include 
#include 
#define RST_PIN  9    //Pin 9 para el reset del RC522
#define SS_PIN  10   //Pin 10 para el SS (SDA) del RC522
MFRC522 mfrc522(SS_PIN, RST_PIN); //Creamos el objeto para el RC522

void setup() {
  Serial.begin(9600); //Iniciamos La comunicacion serial
  SPI.begin();        //Iniciamos el Bus SPI
  mfrc522.PCD_Init(); // Iniciamos el MFRC522
  Serial.println("Control de acceso:");
}

byte ActualUID[4]; //Almacenará el código del TAG leído
byte UsuarioL[4]= {0x4A, 0xE8, 0xAF, 0x24} ; //código del usuario llavero 
byte UsuarioT[4]= {0x4A, 0xFF, 0x96, 0x1A} ; //código del usuario tarjeta
void loop() {
  // Revisamos si hay nuevos TAGS  presentes
  if ( mfrc522.PICC_IsNewCardPresent()) 
        {  
      //Seleccionamos un TAG
            if ( mfrc522.PICC_ReadCardSerial()) 
            {
                  // Enviamos serialemente su UID
                  Serial.print(F("Card UID:"));
                  for (byte i = 0; i < mfrc522.uid.size; i++) {
                          Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
                          Serial.print(mfrc522.uid.uidByte[i], HEX);   
                          ActualUID[i]=mfrc522.uid.uidByte[i];          
                  } 
                  Serial.print("     ");                 
                  //comparamos los UID para determinar si es uno de nuestros usuarios  
                  if(compareArray(ActualUID,UsuarioL))
                    Serial.println("Acceso concedido por llavero.");
                  else
                    Serial.println("Acceso denegado por tajeta.");
                  
                  // Terminamos la lectura del TAG actual
                  mfrc522.PICC_HaltA();         
            }    
  } 
}

//Función para comparar dos vectores
boolean compareArray(byte array1[],byte array2[])
{
  if(array1[0] != array2[0])return(false);
  if(array1[1] != array2[1])return(false);
  if(array1[2] != array2[2])return(false);
  if(array1[3] != array2[3])return(false);
  return(true);
}

Y el resultado lo podemos observar al pasar los TAGs y visualizarlo en el monitor serial.

Con el primer sketch se puede leer los UID delos TAGs para aginarlos al usuario.
Por ejemplo si el UID es 4A E8 AF 26 , definiremos al usuario como

byte UsuarioL[4]= {0x4A, 0xE8, 0xAF, 0x26} ;

Importante: No este código no es 100% seguro, cualquier persona con capacitación podría clonar los TAGs.

Creado: 27/12/2019  

Publicidad

| Volver a Arduino |

Comentarios

Para poder comentar debés registrarte e ingresar al sitio.