You are on page 1of 14

Tutorial mdulo Lector RFID RC522

1 de 14

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Tutorial mdulo Lector RFID RC522

Posted by

13 Comments

ago 23, 2015

feb 19, 2015

jun 04,
2015

Los lectores RFID(Radio Frequency IDentification) en la actualidad


estn teniendo bastante acogida en los sistemas de identificacin, su
uso abarca desde sistemas de seguridad, acceso de personal,
identificacin y logstica de productos, como llaves de puertas
elctricas, entre otras aplicaciones.
Su principio de funcionamiento consiste en pasar un TAG, cerca de un
lector RFID, el TAG tiene la capacidad de enviar informacin al lector.
Dicha informacin puede ser desde un simple cdigo o todo un
paquete de informacin guardo en la memoria del Tag.

ago 06,
2016

jun 15, 2016

Los TAGs viene en diferentes modelos, los ms comunes son en


tarjetas y en llaveros, pero tambin 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
el proceso de comunicacin, la energa lo obtiene de la seal de
radiofrecuencia, que si bien la energa en la seal es pequea, es
suficiente para hacer trabajar el microchip, esto es la razn por la que
es necesario acercarlos a una pequea distancia generalmente menor
a 10 cm. Pero existen Tags activos, que incorporan bateras, estos
tiene alcance de varios metros de distancia.

03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

2 de 14

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Es el que usaremos en este tutorial, este mdulo funciona como


Lector y Grabador de Tags RFID.

may 25, 2016

La versin ms
pequea de Arduino...
S/. 20,00 S/. 25,00

Este mdulo utiliza un sistema de modulacin y demodulacin de


13.56MHz, frecuencia que en la actualidad utiliza la tecnologa RFID.
EL mdulo 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:

Mdulo RC522

Arduino Uno, Nano

Arduino Mega

SDA (SS)

10

SCK

13

52

MOSI

11

51

MISO

12

50

53

Pantalla Oficial LCD


03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

3 de 14

Touch de 7 pulgadas

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Mdulo RC522

Arduino Uno, Nano

Arduino Mega

IRQ

No conectado

No conectado

GND

GND

GND

RST

3.3V

3.3V

3.3V

S/. 470,00

Soporte para montaje


en superficies
paralelas a las guas
de 8mm dimetro
S/. 10,00

S/. 30,00

Como se observa en la conexin, el mdulo trabaja con un voltaje de


3.3V, por lo que la parte lgica tambin debera 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 polimrico
para gua de 8mm de
dimetro
S/. 15,00

Para poder trabajar el Modulo en Arduino es necesario descargar su


librera correspondiente, la que usaremos ser una de las ms
comunes, la desarrollada por Miguel Balboa.

Cristal oscilador de
16 MHz de
frecuencia. Utilizado
en Arduino Uno,...

Una vez descargada, importamos la librera a nuestro IDE de Arduino,


con esto estamos listos para programar.

A continuacin se muestra un sketch para leer el cdigo de


03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

4 de 14

S/. 2,00

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

identificacin de nuestros Tags


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

Ideal para unir los


extremos de nuestra
correa GT2.
S/. 10,00

El mdulo Relay te
permite controlar el
encendido/apagado
de equipos de...
S/. 6,00

Sensor capacitivo te
permite detectar
objetos metlicos y
no metlicos...
S/. 40,00

#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
void setup() {
Serial.begin(9600); //Iniciamos la comunicacin
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.uidB
yte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidB
yte[i], HEX);
}
Serial.println();
// Terminamos la lectura de la tarjet
a actual
mfrc522.PICC_HaltA();
}
}
}

Como se observa es fcil de entender, pero expliquemos las


funciones referentes al mdulo RC522
Instanciar el RC522
#define RST_PIN 9
#define SS_PIN 10

//Pin 9 para el reset del RC522


//Pin 10 para el SS (SDA) del R
03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

5 de 14

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

C522
MFRC522 mfrc522(SS_PIN, RST_PIN);

Es necesario utilizar la librera MFRC522.h, solo es necesario


especificar los pines Reset y SDA(SS) del mdulo, los dems
pines trabajan con los pines SPI del Arduino.

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

Esta funcin 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 funcin nos devuelve verdadero o falso dependiendo si hay


una tarjeta presente cerca al mdulo RC522.

Seleccionar una tarjeta para la lectura


mfrc522.PICC_ReadCardSerial()

Se llama a esta funcin 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 tamao del cdigo de identificacin
mfrc522.uid.size

Nos retorna el tamao en Bytes del cdigo de identificacin de la


tarjeta seleccionada.
Leer el cdigo de identificacin
mfrc522.uid.uidByte

Para acceder al cdigo de identificacin es recomendable indexar


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

03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

6 de 14

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Finalizar la lectura.
mfrc522.PICC_HaltA();

Con esta funcin le indicamos que hemos terminado la lectura de


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

En el sketch, el cdigo de identificacin lo enviamos por el puerto


serial, para visualizar el cdigo es necesario abrir el Monitor Serial del
IDE de Arduino.

Bien, visto el ejemplo anterior, ahora apliqumoslo para un control de


acceso, que puedes aplicarse en una puerta elctrica, 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 lneas ms al final del
programa para comparar los cdigos y determinar si tienen o no
03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

7 de 14

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

acceso.
A continuacin se muestra el Sketch.

#include <SPI.h>
#include <MFRC522.h>
#define
#define
2
MFRC522
para el

RST_PIN 9
SS_PIN 10

//Pin 9 para el reset del RC522


//Pin 10 para el SS (SDA) del RC52

mfrc522(SS_PIN, RST_PIN); ///Creamos el objeto


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 cdigo del Tag ledo
byte Usuario1[4]= {0x4D, 0x5C, 0x6A, 0x45} ; //cdigo d
el usuario 1
byte Usuario2[4]= {0xC1, 0x2F, 0xD6, 0x0E} ; //cdigo 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))

03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

8 de 14

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();
}

}
}
//Funcin 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.

03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

9 de 14

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

En lugar de enviarlo serialmente la confirmacin se puede programar


para activar una salida digital, que puede estar conectado a una
chapa elctrica, una alarma, etc. depender de la aplicacin en
particular que estn trabajando.
Es bueno aclarar que si bien cumple el objetivo, no es una forma
100% segura, cualquiera que sepa del tema podra clonar las tarjetas.
Para una mayor seguridad es necesario trabajar con los bloques de la
memoria interna del TAG, pudindose configurar una clave para la
lectura, adems se podra trabajar con un cdigo mayor a los 4 bytes
del UID, incluso se podran trabajar con varios datos. (La lectura y
escritura de bloques de memoria se ver en un prximo tutorial)

Tags:
0

Compartir

JOHANNY PEREZ
jul 19, 2016
buenos das, cmo hara para aumentar la distancia de
lectura de la tarjeta al lector unos 10 a 15 metros....????
Gracias...! ! ! ! ! ! !

Naylamp
jul 20, 2016
Johanny, con el mdulo RFID RC522 solo

03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

10 de 14

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

puedes trabajar con distancias cortas. Si


necesitas mayor distancia tendras que
trabajar con mdulos de mayor potencia y con
Tags activos.

Franco
ago 22, 2016
Qu mdulos de mayor potencia
me recomendaras para trabajar
con distancias ms 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 ledo
desde el tag en una variable y no en un array, ej: Id ledo
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 ms fcil de trabajarlo como array,
si quieres gurdalo en un solo nmero 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
03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

11 de 14

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 funcin detiene la comunicacin 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 enva 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
condicin hasta que se retire el TAG, lo que
podra complicar tu programa en caso ests
realizando una aplicacin 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
03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

12 de 14

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 cdigo del
Tag ledo byte Usuario1[4] = {0x96, 0x54, 0xeb, 0x75} ;
//cdigo del usuario 1 byte Usuario2[4] = {0xC1, 0x2F,
0xD6, 0x0E} ; //cdigo 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(); } }}}//Funcin 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
continuacin te mencionamos los errores que
podemos encontrar: 1. pinMode("Acceso
concedido", INPUT_PULLUP); 2. estado =
Serial.println("Acceso concedido"); 3. Existen
dos llaves que estn dems. 4. Pones muchas

03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

13 de 14

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

pausas y/o de mucha duracin, esto podra


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

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

Submit

Introduzca su direccin de correo electrnico

Naylamp Mechatronics,

03/10/2016 18:43

Tutorial mdulo Lector RFID RC522

14 de 14

http://www.naylampmechatronics.com/blog/22_Tutorial-Lector-RFID...

Trujillo Per
Llmanos ahora:
997646858
Email:

03/10/2016 18:43

You might also like