Hoy les voy a presentar el módulo RFID-RC522 en una de sus facetas, es este caso, leer el número de serie de una tarjeta o llavero MIFARE 1K, para posteriormente compararlo con unos números de serie previamente guardados dentro del programa y actuar en consecuencia según coincidan o no. MIFARE es una tecnología de tarjetas inteligentes sin contacto (TISC), de las más ampliamente instaladas en el mundo, es equivalente a las 3 primeras partes de la norma ISO 14443 Tipo A de 13.56 MHz con protocolo de alto nivel.
La tarjeta MIFARE 1K (la más común de todas) tiene 16 sectores independientes que pueden configurarse para almacenamiento de información general. El primer bloque (número 0), se usa comúnmente como directorio de la tarjeta y contiene el número de serie (UID), mientras que el bloque 3 contienen las llaves de seguridad Key A y Key B por lo que tampoco son hábiles para almacenar datos, con lo que quedan otros 13 bloques para almacenar datos. Estos dispositivos son muy utilizados como monederos en los transportes públicos. Para diferenciar las tarjetas y los llaveros, las he marcado con su número de serie como se puede observar en la siguiente imagen.
El módulo RFID RC522 (identificación por radiofrecuencia) se alimenta a 3.3V, le vamos a comunicar con nuestro Arduino a través del protocolo de comunicación SPI (10 Mbit/s), tiene un consumo aproximado de 26 mA cuando está trabajando a pleno rendimiento y la distancia máxima de lectura es de 6 cm, además este módulo utiliza un sistema avanzado de modulación y demodulación para todo tipo de dispositivos pasivos de 13.56 MHz, maneja el ISO14443A y soporta el algoritmo de encriptación Quick CRYPTO1 y MIFARE.
Módulo RFID RC522 |
En este POST simplemente vamos a ir leyendo los números de serie de varios llaveros y tarjetas MIFARE, con la premisa de que si pasamos cualquiera de las dos tarjetas por el lector, se encenderá el LED de color verde durante 3 segundos (mensaje: usuario válido!!!) y si pasamos cualquier llavero se encenderá el LED de color rojo (mensaje: usuario no válido!!!).
Por último decir que los Smartphone disponen de una tecnología de comunicación inalámbrica similar a la RFID denominada NFC (comunicación de campo cercano), por lo que si acercamos la parte trasera de nuestro Smartphone al lector RFID RC522, previamente activado el NFC, conseguiremos leer el número de serie NFC de nuestro Smartphone y a su vez activar una alarma sonora durante y encender el LED de color rojo al mismo tiempo durante 3 segundos (mensaje: usuario no válido!!!). A través del monitor serie podremos comprobar el número de serie de los diferentes dispositivos y si el usuario es válido o no, cuando pasemos por el lector una tarjeta, un llavero o en su defecto un Smartphone con NFC.
Monitor serie del IDE de Arduino |
Lista de Materiales:
· Arduino UNO Rev.3.
· Cable USB tipo A-B.
· Módulo RFID RC522.
· 2 tarjetas y 3 llaveros MIFARE 1K.
· Smartphone con NFC (Opcional).
· Protoboard.
· Cables de conexión.
Código del programa:
Video:
Donde se pueden bajar las librrias. Gracias
ResponderEliminarhttp://miarduinounotieneunblog.blogspot.com.es/2015/12/anadiendo-las-librerias.html?m=1
Eliminarhola amigo cres que se puedan conectar dos Módulo RFID RC522 al mismo arduino... saludos
ResponderEliminarSi se puede, declarando un pin CS (Chip select) diferente para cada dispositivo y teniendo en cuenta que las líneas MISO, MOSI y SCK son comunes, solamente puedes tener un dispositivo activo para la comunicación, activándolo o no a través del pin CS que tengas asignado (creo recordar que se activa a nivel bajo --> LOW). Saludos
EliminarSaludos Mariano, No dejaste el código en TXT para probarlo.
ResponderEliminarLo tienes para descargar en formato *.ino. Saludos
Eliminarhola amigo tenia en mente crear un proyecto donde pueda conectar varios modulos rfid a un tarjeta mega de arduino crees que sea posible
ResponderEliminarbuenas tardes, gracias por tu aporte, tengo varias dudas acerca del RFID.
ResponderEliminarmi idea es hacer un proyecto que vincule el ID de una tarjeta, con una base de datos y haci poder consultar varios datos de una persona solo con ese ID.
ahora, para mi seria mejor que ese ID pudiera ser modificable, por ejemplo en lugar de ello poner un RFC.
mi pregunta es, si esto es posible? o a fuerzas usar el ID default.
he visto que las graban pero no encuentro su funcion o para que sirve
buenas, solo me detecta el primero como valido, si los intercambio, sigue el primero valido, el segundo no valido, sabes porque puede ser.
ResponderEliminargracias
ok, ya lo he visto, pero si quiero que los dos sean validos, tarjeta y llavero como lo hago??
ResponderEliminarTienes que leer los ID de los dos dispositivos y almacenarlos dentro de la variable int numero_serie_valido[2][5] = {{20,182,242,95,15},{176,144,83,157,238}}; (cambia los números por los de tus ID)
ResponderEliminarHola, buen proyecto, pero que se tiene que modificar para que mas tarjetas sen validas, porque de las dos que pongo solo una me es valida. gracias.
ResponderEliminarHola Mariano, muy interesante tu blog, se ve que trabajas mucho sobre el y eso esta bueno!!
ResponderEliminarTe quería hacer una consulta con respecto al NFC de los teléfonos. Cuento un Galaxy S6 y cada vez que lo paso a través del lector RFID el código que lee es distinto. Eso es normal? o tengo que tomar una parte del mismo nada mas?
Un saludo
Sencillo, funcional y muy bien explicado, si señor ole.
ResponderEliminarPara complicarlo un poco, como podríamos incluir un lcd 16x2 i2C y un teclado por si fallase el tag.
Muchas gracias.
Si buscas por mi BLOG tienes un POST donde explico la conexion del LCD que mencionas y otro con un teclado numerico de 16 teclas. Saludos
EliminarHola Mariano, perdona que te moleste. Cambio los números de tus ID por los que tengo yo pero solo me da como valido el primero, el resto no.
ResponderEliminarHe probado a cambiarlos por otros y he metido hasta 6 ID como validos cambiando por supuesto el número de IDs admitidos pero me sigue dando como valido únicamente el primer ID que pongo. Me trae de cabeza. ¿Podrías echarme una mano a ver que ocurre?
Un saludo y muchas gracias.
La matriz int numero_serie_valido[2][5] = {{20,182,242,95,15},{176,144,83,157,238}}; es la que almacena los ID válidos. Es la que tienes que modificar, ademas hay una parte del código que la tienes que modificar si utilizas mas de dos...
ResponderEliminarif(i >= 2) // Números de serie válidos, en este caso 2
{
j=6;
}
}
Y creo recordar que con eso ya te valdría.
estimado probe lo indicado poro no toma mas de 2 tarjetas
EliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarOK maestro, lo voy a trastear y ya te diré.
ResponderEliminarMuchisimas gracias.
Hola Mariano, perdona que te moleste de nuevo.
ResponderEliminarQuería consultarte como puedo hacer que me reconozca el NFC del móvil para poder utilizar los TAG o el NFC indistintamente, he probado varias cosas en el código pero no doy con ello, el codigo del NFC siempre me lo da como no valido, el resto funciona genial.
Un saludo y muchas gracias.
Tienes que realizar una lectura del código NFC de tu dispositivo varias veces y ver que parte es la que no varía, ya que genera una parte aleatoria cada vez que li utilizas para mayor seguridad en pagos...una vez que lo tengas es modificar la parte del código con la parte fija de tu NFC.
ResponderEliminar/ Solo se ejecuta si acercamos el NFC del Smartphone y está activado
if(numero_serie[0] == 8) // Primer dígito del número de serie del NFC de tu Smartphone.
En mi caso al realizar varias lecturas del codigo NFC de mi smartphone solo se mantenía fijo el dígito cero que era el 8 como te muestro en el código...los demas dígitos variaban de manera aleatoria.
He leído varias veces como me dices el código del NFC del móvil pero siempre arroja el mismo número de serie (1-2-3-4-4), el cual pongo en la linea de números de serie validos pero siempre me lo da como usuario no valido, he probado todo lo que se me ha ocurrido, incluso suprimir todas las lineas referentes a lo del NFC y el zumbador pero no hay manera de que considere la ID del NFC como usuario valido.
ResponderEliminar¿Podrías echarme una mano?
Un saludo y muchísimas gracias.
El NFC se evalúa al final del código y no junto con los TAGS porque difiere de el en algunos aspectos. Si el número de serie de tu NFC es (1-2-3-4-4)lo tendrías que evaluar de la siguiente manera.
ResponderEliminar// Solo se ejecuta si acercamos el NFC del Smartphone y está activado
if(numero_serie[0] == 1 && numero_serie[1] == 2 && numero_serie[2] == 3 && numero_serie[3] == 4 && numero_serie[4] == 4) { AQUÍ EL CÓDIGO QUE QUIERAS QUE TE REALICE CUANDO EL NFC ES CORRECTO O ACTIVAR UNA VARIABLE QUE HAGA QUE SE CUMPLA OTRA CONDICIÓN DEL CÓDIGO}
Como una vez leído el NFC se almacena en la matriz llamada numero_serie[5] te recomiendo que después de que realices las operaciones oportunas la vacíes para nuevas entradas...
for(int i=0; i>5; i++)
{
numero_serie[i]=0;
}
Muy a tener en cuenta que el TAG y el NFC como te he comentado se evalúan a parte y de diferente manera. Un saludo
// Función que se ejecuta cuando el usuario no es válido O UTILZAS NFC
Eliminarvoid usuario_no_valido()
{
// Solo se ejecuta si acercamos el NFC del Smartphone y está activado
if(numero_serie[0] == 1 && numero_serie[1] == 2 && numero_serie[2] == 3 && numero_serie[3] == 4 && numero_serie[4] == 4)
{
Serial.println("Usuario válido!!!");
// ENCIENDES O ACTIVAS LO QUE QUIERAS AQUÍ……………
digitalWrite(zumbador,HIGH);// Zumbador encendido
}
else
{
Serial.println("Usuario no valido!!!");
digitalWrite(LED_Rojo,HIGH);// LED Rojo encendido
digitalWrite(LED_Verde,LOW);// LED Verde apagado
delay(3000);
digitalWrite(LED_Rojo,LOW); // LED Rojo apagado
digitalWrite(zumbador,LOW); // Zumbador apagado
}
// VACÍAS EL NÚMERO DE SERIE
for(int i=0; i>5; i++)
{
numero_serie[i]=0;
}
}
hola queria saber cuantos usuarios pudes programar en un arduino mega
ResponderEliminarNo lo se, seria calcularlo, primero ver lo que ocupa cada posición dentro del array y en base a ello calcular cuantas posiciones podrías acumular dentro del array. Pero te aseguro que son muchas
ResponderEliminarBuena tarde, tengo un proyecto de inventario, quisiera saber como puedo guardar el ID del tag cuando la tarjeta RC522 la lea.
ResponderEliminargracias
buenas tardes, excelente proyecto me sirvio mucho, solo una pregunta, como se podria registrar una hora en cuanto pasa la tarjeta???
ResponderEliminarTarjeta SD o EEPROM. Además de necesitar un RTC.
EliminarHola Mariano, Me podrías pasar la librería? Gracias
ResponderEliminar
Eliminarhttp://miarduinounotieneunblog.blogspot.com.es/2015/12/anadiendo-las-librerias.html?m=1. Saludos
Y. Te molesto otra vez, como hiciste para darle una clave a las tarjetas? "{{20,182,242,95,15},{176,144,83,157,238}};"
EliminarUtilizo la clave (ID) que traen las tarjetas almacenado por defecto. Saludos
Eliminarah, muchísimas gracias. Saludos
EliminarBuenas tardes, que se debe hacer para incorporar un lcd 1602? Gracias
ResponderEliminarHay POST en mi blog que dicen como hacerlo.
ResponderEliminarque estaré haciendo mal, llevo comparado dos tarjetas rfid 522 y no funciona
ResponderEliminarTienes que leer primero el tag de tus tarjetas e incluirlo dentro del código que subes al arduino, para habilitar las acciones, si no simplemente todas serán no validas.
ResponderEliminardonde esta el diagrama del circuito
ResponderEliminarHola Mariano, soy un principiante en arduino y quede pegado con el tema de las rfid, estoy super confundido con el tema de la codificacion de mis tarjetas, se que son varios bloques de 16 bytes cada uno, pero no se si se escriben en hexagecimal o decimal, cuales son los vacios o si se pueden sobre escribir, estoy super confundido con eso....si me das una ayudita ....se agradeceria. saludos.
ResponderEliminarola que tal quiero poner varias tarjetas pero no reconoce
ResponderEliminarTienes que validar las tarjetas dentro del código y también cambiar el condicional para que compruebe una a una todas las tarjetas validas que quieras introducir. Saludos
Eliminarque parte del codigo ya que realice el cambio en el
Eliminar"int numero_serie_valido[4][5] = {{214,10,38,248,2},{230,115,11,248,102},{214,10,38,248,2},{134,90,231,247,204}};" pero en que parte mas ??
mariano , eres la mera verga!!! gracias me funciono al 100!!!
ResponderEliminarComo se podría quitar una tarjeta sin directamente ingresar a la programación??
ResponderEliminarhola quetal amigo mepodrias asesorar como agregar un i2c con display
ResponderEliminargracias, es un buen tutorial