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 RC522Para 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
RC522 | Arduino Uno |
SDA | 10 |
SCK | 13 |
MOSI | 11 |
MISO | 12 |
IRQ | No conectado |
GND | GND |
RST | 9 |
3.3V | 3.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
#includeExpliquemos las funciones referentes al módulo RC522#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(); } } }
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.