Está en la página 1de 14

Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Tutorial módulo Lector RFID RC522

Posted by 13 Comments

ago 23, 2015

feb 19, 2015

Los lectores RFID(Radio Frequency IDentification) en la actualidad


están teniendo bastante acogida en los sistemas de identificación, su
uso abarca desde sistemas de seguridad, acceso de personal,
jun 04,
identificación y logística de productos, como llaves de puertas
2015
eléctricas, entre otras aplicaciones.
Su principio de funcionamiento consiste en pasar un TAG, cerca de un
lector RFID, el TAG tiene la capacidad de enviar información al lector.
Dicha información puede ser desde un simple código o todo un
paquete de información guardo en la memoria del Tag.

Los TAGs viene en diferentes modelos, los más comunes son en


tarjetas y en llaveros, pero también vienen como etiquetas adhesivas
e incluso ya viene incrustados en algunos productos. Los Tags tienen
internamente una antena y un microchip, encargado de realizar todo
ago 06,
el proceso de comunicación, la energía lo obtiene de la señal de
2016
radiofrecuencia, que si bien la energía en la señal es pequeña, es
suficiente para hacer trabajar el microchip, esto es la razón por la que
es necesario acercarlos a una pequeña distancia generalmente menor
a 10 cm. Pero existen Tags activos, que incorporan baterías, estos
jun 15, 2016 tiene alcance de varios metros de distancia.

1 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Es el que usaremos en este tutorial, este módulo funciona como


Lector y Grabador de Tags RFID.

may 25, 2016

La versión más
pequeña de Arduino...

S/. 20,00 S/. 25,00

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.

EL módulo se comunica por SPI, por lo que se puede implementar


con cualquier microcontrolador con interfaz SPI, como un Arduino.

Bien, empecemos a armar nuestro proyecto:

Módulo RC522 Arduino Uno, Nano Arduino Mega

SDA (SS) 10 53

SCK 13 52

MOSI 11 51

MISO 12 50
Pantalla Oficial LCD

2 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Touch de 7 pulgadas
Módulo RC522 Arduino Uno, Nano Arduino Mega
S/. 470,00
IRQ No conectado No conectado

GND GND GND

RST 9 9

3.3V 3.3V 3.3V


Soporte para montaje
en superficies
paralelas a las guías
de 8mm diámetro

S/. 10,00

S/. 30,00

Como se observa en la conexión, el módulo trabaja con un voltaje de


3.3V, por lo que la parte lógica también debería trabajar con el mismo
nivel de voltaje, para prueba y testeo se puedo conectar directamente
a los pines del Arduino (nivel TTL 5V), pero se recomienda usar
.
Rodamiento polimérico
para guía de 8mm de
diámetro

S/. 15,00

Para poder trabajar el Modulo en Arduino es necesario descargar su


librería correspondiente, la que usaremos será una de las más
comunes, la desarrollada por Miguel Balboa.

Una vez descargada, importamos la librería a nuestro IDE de Arduino,


Cristal oscilador de con esto estamos listos para programar.
16 MHz de
frecuencia. Utilizado
en Arduino Uno,... A continuación se muestra un sketch para leer el código de

3 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

S/. 2,00 identificación de nuestros Tags

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 9 //Pin 9 para el reset del RC522


#define SS_PIN 10 //Pin 10 para el SS (SDA) del RC52
2
MFRC522 mfrc522(SS_PIN, RST_PIN); //Creamos el objeto p
ara el RC522
Ideal para unir los
extremos de nuestra
void setup() {
correa GT2.
Serial.begin(9600); //Iniciamos la comunicación
S/. 10,00 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())
{
El módulo Relay te
permite controlar el //Seleccionamos una tarjeta
encendido/apagado if ( mfrc522.PICC_ReadCardSerial())
de equipos de... {
// Enviamos serialemente su UID
S/. 6,00 Serial.print("Card UID:");
for (byte i = 0; i < mfrc522.uid.size
; i++) {
Serial.print(mfrc522.uid.uidB
yte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidB
yte[i], HEX);
}
Serial.println();
Sensor capacitivo te // Terminamos la lectura de la tarjet
permite detectar a actual
objetos metálicos y mfrc522.PICC_HaltA();
no metálicos... }
}
S/. 40,00 }

Como se observa es fácil de entender, pero expliquemos las


funciones referentes al módulo RC522

Instanciar el RC522

#define RST_PIN 9 //Pin 9 para el reset del RC522


#define SS_PIN 10 //Pin 10 para el SS (SDA) del R

4 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

C522
MFRC522 mfrc522(SS_PIN, RST_PIN);

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.

Iniciar el RC522

SPI.begin(); //Iniciamos el Bus SPI


mfrc522.PCD_Init(); // Iniciamos el MFRC522

Esta función 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()

Ver si hay una tarjeta presente

mfrc522.PICC_IsNewCardPresent()

Esta función nos devuelve verdadero o falso dependiendo si hay


una tarjeta presente cerca al módulo RC522.

Seleccionar una tarjeta para la lectura

mfrc522.PICC_ReadCardSerial()

Se llama a esta función cuando queremos comunicarnos con una


tarjeta, nos devuelve un valor verdadero si logra seleccionar una
tarjeta para la lectura, de lo contrario nos retorna un valor falso.

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

mfrc522.uid.size

Nos retorna el tamaño en Bytes del código de identificación de la


tarjeta seleccionada.

Leer el código de identificación

mfrc522.uid.uidByte

Para acceder al código de identificación es recomendable indexar


la variable por ejemplo mfrc522.uid.uidByte[0] para el byte en la
posición inicial.

5 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Finalizar la lectura.

mfrc522.PICC_HaltA();

Con esta función le indicamos que hemos terminado la lectura de


la tarjeta presente y IsNewCardPresent() devolverá falso para
esta tarjeta mientras no se retire. Si después de retirar la tarjeta, si
se ingresa nuevamente la misma tarjeta se le considera como una
nueva tarjeta.

En el sketch, el código de identificación lo enviamos por el puerto


serial, para visualizar el código es necesario abrir el Monitor Serial del
IDE de Arduino.

Bien, visto el ejemplo anterior, ahora apliquémoslo para un control de


acceso, que puedes aplicarse en una puerta eléctrica, caja fuerte,
sistema de encendido, desactivar alarmas, etc.

Para este ejemplo estamos usando 4 Tags de los cuales solo dos
deben tener acceso al sistema. Para implementar esto partimos del
sketch anterior y solo le agregamos unas líneas más al final del
programa para comparar los códigos y determinar si tienen o no

6 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

acceso.

A continuación se muestra el Sketch.

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 9 //Pin 9 para el reset del RC522


#define SS_PIN 10 //Pin 10 para el SS (SDA) del RC52
2
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 Usuario1[4]= {0x4D, 0x5C, 0x6A, 0x45} ; //código d
el usuario 1
byte Usuario2[4]= {0xC1, 0x2F, 0xD6, 0x0E} ; //código d
el usuario 2
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(F("Card UID:"));
for (byte i = 0; i < mfrc522.uid.size
; i++) {
Serial.print(mfrc522.uid.uidB
yte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidB
yte[i], HEX);
ActualUID[i]=mfrc522.uid.uidB
yte[i];
}
Serial.print(" ");

//comparamos los UID para determinar


si es uno de nuestros usuarios
if(compareArray(ActualUID,Usuario1))

7 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Serial.println("Acceso concedido...
");
else if(compareArray(ActualUID,Usuari
o2))
Serial.println("Acceso concedido...
");
else
Serial.println("Acceso denegado..."
);

// Terminamos la lectura de la tarjet


a tarjeta 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.

8 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

En lugar de enviarlo serialmente la confirmación se puede programar


para activar una salida digital, que puede estar conectado a una
chapa eléctrica, una alarma, etc. dependerá de la aplicación en
particular que están trabajando.

Es bueno aclarar que si bien cumple el objetivo, no es una forma


100% segura, cualquiera que sepa del tema podría clonar las tarjetas.
Para una mayor seguridad es necesario trabajar con los bloques de la
memoria interna del TAG, pudiéndose configurar una clave para la
lectura, además se podría trabajar con un código mayor a los 4 bytes
del UID, incluso se podrían trabajar con varios datos. (La lectura y
escritura de bloques de memoria se verá en un próximo tutorial)

Tags:

0 ? 0 0 0 Compartir 1

JOHANNY PEREZ
jul 19, 2016
buenos días, cómo haría para aumentar la distancia de
lectura de la tarjeta al lector unos 10 a 15 metros....????
Gracias...! ! ! ! ! ! !

Naylamp
jul 20, 2016
Johanny, con el módulo RFID RC522 solo

9 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

puedes trabajar con distancias cortas. Si


necesitas mayor distancia tendrías que
trabajar con módulos de mayor potencia y con
Tags activos.

Franco
ago 22, 2016
Qué módulos de mayor potencia
me recomendarías para trabajar
con distancias más largas con
arduino?

Marcelo
ago 16, 2016
Hola, gracias por tu tutorial. Tengo un problema, no soy
muy capo en el tema... como puedo dejar el ID leído
desde el tag en una variable y no en un array, ej: Id leído
D3A1C6D2, valor_tag=211161198214 .Agradecido y
disculpa si mi consulta es muy torpe.

Naylamp
ago 22, 2016
Hola Marcelo, claro que se puede, pero en
realidad es más fácil de trabajarlo como array,
si quieres guárdalo en un solo número tiene
que en ser en un long, que ocupa 4 bytes,
prueba con: unsigned long valor_tag=
((long)array[3]<<12)|((long)array[2]
<<8)|((long)array[1]<<4)|((long)array[2]); Y
usa: Serial.println(valor_tag,HEX); para
visualizarlo por el monitor serial.

Deco
ago 31, 2016
Hola, muy buen tutorial, quisiera consultarle de como se
podria hace para mantener un led encendido durante el
tiempo en que el tag este cercano al lector RFID (en caso
de no estar el tag, simplemente no enciende el led).

Naylamp

10 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

sep 2, 2016
Hola para que puedas seguir detectando el
TAG no debes usar mfrc522.PICC_HaltA();
esta función detiene la comunicación con el
TAG. Si no usas mfrc522.PICC_HaltA() el
programa va a entrar al
if(mfrc522.PICC_IsNewCardPresent())
mientras el TAG esté presente.

12
sep 3, 2016
buenas muy buen tuto. Que tendria que escribir para
encender y apagar un led cada vez que pase la tarjeta?

Naylamp
sep 14, 2016
Hola, va a depender de lo que exactamente
quieres hacer, si solo quieres hacer parpadear
el led cuando se detecta el TAG, solo envía el
pulso dentro del segundo if. En cambio si lo
que quieres es que el Led se mantenga
prendido mientras esté el TAG presente se
complica un poco, en este caso hay que
comentar mfrc522.PICC_HaltA(), de esta
forma siempre va a estar entrando a la
condición hasta que se retire el TAG, lo que
podría complicar tu programa en caso estés
realizando una aplicación de registro o conteo.

i2
sep 16, 2016
Buenas tardes por mas que lo intento no puedo resolverlo.
escribí unas lineas intentandolo con estados pero no soy
capaz, se que es mas facil que todo esto pero me lio .
sabes si voy por buen camino?? espero no molestarte al
poner mi sketch.un saludo[code] #include #include #define
RST_PIN 9 //Pin 9 para el reset del RC522 #define
SS_PIN 10 //Pin 10 para el SS (SDA) del RC522MFRC522
mfrc522(SS_PIN, RST_PIN); ///Creamos el objeto para el
RC522int led_azul = 7; int led_verde = 6; int led_rojo =
5;int LED = 11 ;bool estado = true ; bool estado_anterior =
true ;void setup() { Serial.begin(9600); //Iniciamos La
comunicacion serial SPI.begin(); //Iniciamos el Bus SPI
mfrc522.PCD_Init(); // Iniciamos el MFRC522

11 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Serial.println("Control de acceso:");pinMode(led_azul,
OUTPUT); pinMode(led_verde, OUTPUT);
pinMode(led_rojo, OUTPUT);pinMode("Acceso
concedido", INPUT_PULLUP); pinMode(LED,
OUTPUT);}byte ActualUID[4]; //almacenará el código del
Tag leído byte Usuario1[4] = {0x96, 0x54, 0xeb, 0x75} ;
//código del usuario 1 byte Usuario2[4] = {0xC1, 0x2F,
0xD6, 0x0E} ; //código del usuario 2void loop()
{digitalWrite(led_azul, LOW); digitalWrite(led_verde,
LOW); digitalWrite(led_rojo, LOW); // Revisamos si hay
nuevas tarjetas presentes if (
mfrc522.PICC_IsNewCardPresent()) { //Seleccionamos
una tarjeta 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(" verificando .... ");
Serial.println(); digitalWrite(led_azul, HIGH); delay(1000);
digitalWrite(led_azul,LOW); delay(100); }Serial.print(" ");
//comparamos los UID para determinar si es uno de
nuestros usuarios if (compareArray(ActualUID, Usuario1))
{ Serial.println("Acceso concedido");
digitalWrite(led_verde, HIGH); delay(1000);
digitalWrite(led_verde, LOW); delay(1000); { estado =
Serial.println("Acceso concedido"); if (estado !=
estado_anterior) //hay cambio : Han pulsado o soltado { if
(estado == LOW) //Al pasar tag digitalWrite(LED,
!digitalRead(LED)); estado_anterior = estado ; // Para
recordar el ultimo valor } } mfrc522.PICC_HaltA(); } else if
(compareArray(ActualUID, Usuario2))
Serial.println("Acceso concedido"); else {
Serial.println("Acceso denegado"); digitalWrite(led_rojo,
HIGH); delay(1000); digitalWrite(led_rojo, LOW);
delay(1000); // Terminamos la lectura de la tarjeta 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); } [/code]

Naylamp
sep 21, 2016
Hola, Tienes errores de sintaxis, a
continuación te mencionamos los errores que
podemos encontrar: 1. pinMode("Acceso
concedido", INPUT_PULLUP); 2. estado =
Serial.println("Acceso concedido"); 3. Existen
dos llaves que están demás. 4. Pones muchas

12 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

pausas y/o de mucha duración, esto podría


reflejarse en que necesitas tener el TAG
mucho tiempo cerca al lector, si esto no es un
problema puedes seguir trabajando así. Debes
ir implementando tu algoritmo por partes, para
ver hasta qué punto está funcionando
correctamente e ir solucionado los problemas
conforme los vas encontrando. Saludos.

Rene Misael
sep 24, 2016
Excelente. Mil Gracias por tu explicación.

* Name:

* E-mail:
(Not
Published)
Website:
(Site url
withhttp://)
* Comment:

Submit

Introduzca su dirección de correo electrónico

Naylamp Mechatronics,

13 de 14 03/10/2016 18:43
Tutorial módulo Lector RFID RC522 http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Trujillo Perú

Llámanos ahora:

997646858

Email:

14 de 14 03/10/2016 18:43