bclose

RFID: Identificación por RF

RFID: Identificación por RF

 

 

    • Presentar los RFID.
    • Comprender su utilidad.
    • Conectando un sensor RFID sencillo a Arduino.

 

Material requerido.

Identificando elementos

 

Hay cosas que nos parecen tan normales que al final ni siquiera reparamos en ellas, porque nos parece que no hay otra manera de hacer las cosas, o simplemente porque no dedicamos un minuto a pensar en cosas que damos por supuestas.

Por ejemplo, nos parece normal llegar a un supermercado y que la cajera identifique los productos con un código de barras de forma inmediata y lea su precio y características, pero esto es algo que a nuestros abuelos les hubiera parecido magia (Y probablemente a la mayor parte de la gente también aunque pongan cara de seta)

Los códigos de barras (o Barcodes) están muy extendidas por todos los supermercados y otras tiendas para identificar con luz un cierto producto. Son rápidos baratos y espectaculares. Solo necesitan una etiqueta con un código extraño en forma de barras que una pistola láser identifica con rapidez.

Los códigos de barras son muy baratos, justo un papelito con barras de distinta anchura o bien impresos en la envoltura del producto, pero también tienen  unos ciertos inconvenientes. Si se rayan se tornan ilegibles y esto es relativamente frecuente y además no se pueden reescribir (¿A que no lo habías pensado?) Es tecnología pre digital.

Pero el tema de esta sesión no son los códigos de barras (Eso quizás llegue en un futuro)  sino más bien su sucesor, las etiquetas RFID (O RFID tags).

Para empezar ya estás acostumbrado a su uso, aunque quizás no te hayas dado cuenta. Son esas etiquetas que te pitan a destiempo cuando sales de las grandes superficies, o los antirrobos en prendas de las tiendas de ropa, que se identifican mediante un arco.

Hace ya mucho tiempo que los códigos de barras están obsoletos, pero son tan baratos y una tecnología tan bien resuelta y establecida que nadie quiere oír hablar de cambiarla, pero más pronto que tarde los RFID van a sustituir a los códigos de barras.

 
  • RFID son las inciales de identificacion por radio frecuencia en inglés (Radio Frequency IDentification)   

Vale, ¿Y que son los RFID? Bueno son simplemente un chip digital minúsculo de memoria, que puede contener una identificación en forma de código e incluso información de diferentes cuestiones grabados en él. Son como un pendrive pero canijo y por radio, para entendernos

¿Eso es todo? Pues sí, pero además tiene una antena que permite dos cosas poco frecuentes, una identificarlos por Radio Frecuencia (O RF)  sin contacto a distancias de entre nos pocos centímetros y varios metros, mediante un receptor adecuado, y la otra es que la propia señal de RF que usamos para identificarlos es capaz de alimentar el chip de la etiqueta RFID sin necesidad de batería ¿Qué te parece el truco?

Cuando la etiqueta RFID (O Tag según la lengua de Albión) no lleva batería, se llaman pasivas y son las más baratas, aunque también las hay con batería y se las llama activas, pero ignoraremos estas ultimas con la elegancia que nos caracteriza, estas últimas.

Normalmente los tags RFID son una especie de pegatina que lleva diseños más o menos extravagantes de pistas metálicas muy finas que hacen las veces de antena y te has hartado a verlas en ropa y otros productos pero probablemente no sabías lo que era:

Sticker

Estas son las típicas insertas en las etiquetas de la ropa como antirrobo, pero las hay con aspectos muy variados, dependiendo de la forma y diseño e la antena y el destino final de las etiquetas:

RFID_label2
flexible

Pero la idea es siempre la misma, identificar el tag mediante la emisión de ondas electromagnéticas desde un lector, que alimentan un circuito de memoria interno, para que nos envíen por RF una identificación que podamos usar para validar o identificar un producto cualquiera.

Arco y etiqueta RFID
 
  • Ya ha salido antes en algún momento la idea de transponder aunque en otro ámbito. Es un sistema electrónico que envía una identificación bajo pedido externo, y estas etiquetas RFID lo son con todos los derechos.  

Y por supuesto tienen un montón de ventajas respecto de otros sistemas como los códigos de barras:

 
  • Son pasivos en su mayoría y pueden permanecer inactivos durante años.
  • No se rayan o degradan, ni con el tiempo ni con campos magnéticos, ni con el roce.
  • No necesitan verse para realizar la identificación, porque la mayor parte de los materiales son transparentes a las ondas RF que se usan.
  • Pueden disponer de una memoria interna que contenga toda la identificación del producto o su trazabilidad. Las hay de 1K, 4k y …
  • Se pueden utilizar como llaves maestras para abrir cerraduras electrónicas, tanto como para identificar productos o personas.
  • Se pueden reescribir y leer tantas veces como quieras, e ir añadiendo su historia en la propia tarjeta. Por ejemplo en una tarjeta de pago, puedes conservar las ultimas 100 compras realizadas, por ejemplo.
  • Lo que ha retrasado la implantación masiva de estos RFID ha sido más el precio que su ventaja.  

Imagínate una tarjeta de plástico con un tag interno. Lo puedes usar para llave de una cerradura, o probablemente la tarjeta de Bus o Metro que tienes en el bolsillo sea de estas.

Puedes usar estas tarjetas para que su ID interno corresponda con tu clave de acceso al ordenador y por ello solo quien tenga tu tarjeta puede iniciar sesión en él.

O si cada producto que hay en el supermercado llevara un tag RFID anexo, podrías ir echando a la bolsa y salir tranquilamente por el arco de salida y este te leería sobre la marcha los productos que te llevas y la identificación de tu bolsillo o tarjeta de crédito, con lo que haría inventario inmediato y te cargaría la VISA sin más (Hombre convendría teclear el pin de la visa para evitar robos)

No serían necesarias cajeras, porque la factura se haría leyendo los IDs de los productos que hayas cogido y el cargo automático. Sin necesidad de parar en caja (Parecería que te ibas sin pagar, pero. Ya te habrían fichado).

Y casualidad, Arduino está perfectamente preparado para este tipo de cosas ya ves, y en nuestro kit hay un set de un lector / grabador de RFID, además de una tarjeta de identificación de plástico y un llavero con tag, para que podáis hacer pruebas.

Y a eso vamos en esta sesión.

 

Conectando el Lector RFID

 

En nuestro kit de inicio Arduino, y también en la tienda podréis encontrar un pequeño conjunto de lector grabador de tags RFID, el RC522, así como una tarjeta y un llavero con identificadores que es con lo que vamos a hacer las pruebas.

El lector está basado en el típico chip MFRC522 para lectura y escritura de tags RFID:

vista principal

El chip MFRC522. Da soporte a la lectura y escritura de los tags en diferentes condiciones y con control de errores, de una forma sencilla, aunque no puede identificar más que un tag a la vez, a diferencia de otros lectores más profesionales, y requiere que la distancia de lectura sea de una par de centímetros a lo sumo (Es lo que tienen las cosas baratas)

La tarjeta presenta un interface SPI para comunicar nuestro Arduino con el MFRC522 y no tiene más dificultad. De hecho creo que os sorprenderá ver lo fácil que resulta leer estas etiquetas RFID.

Empecemos por el lector y sus pines:

patillaje externo

Como podéis ver no hay más que los pines de control SPI y la alimentación del módulo. La conexión es trivial:

Modulo RC522Arduino
SDAD10
SCKD13
MOSID11
MISOD12
IRQ—-
GNDGND
RSTD9
3.3V3.3V
sesion 170_bb

 

Programa de control

 

Como siempre vamos a empezar por descargar una librería para controla el lector, llamada rfid-master y la instalamos siguiendo el procedimiento habitual.

Incluimos la librería RFID y la SPI, para controlar la tarjeta lectora: Prog_170_1

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

Ahora definimos los pines que vamos a usar y creamos un objeto de la clase MFRC522 para nuestro lector:

#define SS_PIN 10
#define RST_PIN 9
MFRC522 rfid(SS_PIN, RST_PIN);

Tenemos que hacer ahora una cosa un poco extraña al principio. Estas tarjetas y lectores soportan una clave de encriptación de 6 bytes hexadecimales, (Que por defecto es FF FF FF FF FF FF) pero que podríamos definir a nuestro antojo por seguridad para que no lea nuestra clave cualquiera.

 
  • Ojo que no es algo muy seguro y parece que no hay mucha dificultad en reventarla, pero menos es nada y así subimos el nivel al que venga.  

Pero en cualquier caso tenemos que pasarle una clave a nuestra librería y luego la rellenamos:

MFRC522::MIFARE_Key key;

Y cuando leamos la ID de la etiqueta necesitamos almacenarla en un array por ejemplo:

byte nuidPICC[3];

En el setup() vamos a inicializar la puerta serie, el SPI y el objeto rfid, y después rellenar el valor de la clave (Al valor por defecto):

Serial.begin(9600);
SPI.begin();                        // Init SPI bus
rfid.PCD_Init();                // Init MFRC522

for (byte i = 0; i < 6; i++)
   { key.keyByte[i] = 0xFF;
   }

Para el programa principal vamos a usar un par de funciones de apoyo que viene con la librería pero cuyo único interés es ahórranos trabajo. Podéis revisarlas en el programa aporque no tienen nada raro, ni tampoco mayor interés.

Empezamos buscando un tag en el lector y si no lo encuentra, vuelta a empezar, pero si la encuentra la lee:

if ( ! rfid.PICC_IsNewCardPresent())
       return;

if ( ! rfid.PICC_ReadCardSerial())
       return;

En el programa encontrareis ahora algunas líneas un poco extrañas, que he sacado del ejemplo original, pero que son bastante sencillas conceptualmente. Primero comprobar que la tarjeta leída es de un tipo que reconocemos, y si no volvemos a empezar:

if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
    piccType != MFRC522::PICC_TYPE_MIFARE_4K) 
   {
       Serial.println(F("Your tag is not of type MIFARE Classic."));
       return;
   }

Comprobamos el tipo de tarjeta detectada (Básicamente la cantidad de memoria disponible) e imprimimos su tipo:

if (rfid.uid.uidByte[0] != nuidPICC[0] ||
    rfid.uid.uidByte[1] != nuidPICC[1] ||
    rfid.uid.uidByte[2] != nuidPICC[2] ||
    rfid.uid.uidByte[3] != nuidPICC[3] )
     {
        Serial.println(F("A new card has been detected."));
        Serial.println(F("The NUID tag is:"));
        Serial.print(F("In hex: "));
        printHex(rfid.uid.uidByte, rfid.uid.size);
        Serial.println();
        Serial.print(F("In dec: "));
        printDec(rfid.uid.uidByte, rfid.uid.size);
        Serial.println();

        rfid.PICC_HaltA();
        rfid.PCD_StopCrypto1();
    }

Fíjate que una vez escritos los valores en la consola paramos la lectura y la encriptación en la tarjeta para ahorra energía. Recuerda que la antena emite RF intensa para alimentar el tag interno de la tarjeta y consume un tanto que conviene cortar si no está en uso

Cuando arranca, nuestro programa imprime esto:

Mensaje rfid

Y cuando pasas una tarjeta o llavero por encima del lector:

Mensaje rfid

Te presenta el ID del tag en hexadecimal y decimal. Si le pasamos ahora el llavero, por ejemplo, veras como su ID es diferente:

Mensaje rfid
 
  • Creo que hasta ahora no habíamos comentado, que estos llaveros y tarjetas sencillos que usamos para estas pruebas, viene con un numero de ID pregrabado de 11 dígitos, diferente para cada uno de ellos y os dejo la tarea de calcular la posibilidad de que dos fabricantes usen el mismo número entre 1011..   

Sería muy interesante poner un Buzzer, que emitiera un pitido cada vez que lee correctamente una tarjeta y de eso modo sabríamos que hay una identificación positiva, pero os lo dejo como deberes para el que quiera nota, porque ya me he extendido más de lo que quería.

 

Resumen de la sesión

 

 

    • Hemos presentado el concepto de los RFID y un poco como funcionan.
    • Vimos el chip MFRC522 y el modulo Modulo RC522.
    • Vimos que ARduino no tiene problema con leer RFID.
    • Presentamos un programa de ejemplo de como leer la identificacion de un tag RFID. 
  • (81) Comments

      • Jorge

      No logra leer dos tarjetas y dos llaveros.. Ya probe con un arduino UNO y un MEGA y no me ha sido posible leer.. Podria ser que los lectores esten dañados?

      • Hombre, uno me puede encajar , pero lo dos es mas dificil. Yo insistiria revisando el circuito y actualizaria los librerias del RFID. descarga de github la ultima version por si acaso

        • Ya lo he realizado con varias librerías..
          Ya probé con varios códigos y nada de nada.. de hecho hay una pagina circuito.io se baja un código de prueba y no jala.

    • Hola! he realizado este ejemplo muy interesante y funciona perfectamente cuando esta conectado al usb de la computadora pero si lo desconecto y lo alimento con 5V dc, ya no me lee la tarjeta, alguna idea? Saludos.

      • Hola Cris, debería funcionar igualmente. Le tienes puesto algún buzer o algún led para comprobar si la lee o no?

    • Hola admin, una pregunta como puedo solucionar el siguiente error:

      Arduino:1.8.3 (Windows 10), Tarjeta:”Arduino/Genuino Uno”

      C:\Users\JUANFI~1\AppData\Local\Temp\arduino_modified_sketch_591355\sketch_aug07a.ino: In function ‘void loop()’:

      sketch_aug07a:31: error: ‘piccType’ was not declared in this scope

      if (piccType ! = MFRC522::PICC_TYPE_MIFARE_MINI &&

      ^

      sketch_aug07a:31: error: expected ‘)’ before ‘!’ token

      if (piccType ! = MFRC522::PICC_TYPE_MIFARE_MINI &&

      ^

      sketch_aug07a:46: error: ‘printHex’ was not declared in this scope

      printHex(rfid.uid.uidByte, rfid.uid.size);

      ^

      sketch_aug07a:49: error: ‘printDec’ was not declared in this scope

      printDec(rfid.uid.uidByte, rfid.uid.size);

      Gracias

      • Hola Esteban, recuerda que tienes que descargar e instalar la librería rfid-master.

        • Buenas, estoy en las mismas que el compañero, he instalado la librería rfid-master desde el archivo de la página.

          • Hola Juan, he probado a descargarlo y a mi me compila bien. Yo actualizaría el IDE de Arduino a la última versión y borarría la librería y volvería a instalarla. Un saludo.

      • Elvis Herrera

      buenas tardes

      las tarjetas RFID tienen un código externo, pero cuando las paso por un reloj checador, veo el externo, como puedo hacer para relacionar esos códigos?? tengo muchos en mi empresa, pero queremos extraer información directamente del checador y nos da un .dat, pero con el código interno de la tarjeta, el externo no

      por ejemplo:
      mi tarjeta el código externo es: 00788 11151004319-2
      y el que me da mi reloj checador es:
      000000@~0000180314061310401
      los ultimos 4 digitos cambian cada vez que marco entrada o salida, entonces el código interno de mi tarjeta sería:
      000018031406131
      pero si quiero sacar los códigos internos de cada tarjeta de mi empresa como le podría hacer?
      porque si le pido el gafete a cada empleado, solo tengo el código externo, no el interno

      • Buenas tardes Elvis,

        Veamos, las trajetas RFID o tags tiene un numero de identificacion de 11 digitos si no recuerdo mal(Hablo de memoria) y luego una memoria interna de diferente longitud dependiendo del modelo.

        Puedes usar un chekador para grabar datos en ella por ejemplo la ultima hora de entrada o de salida y luego puedes leer lo que desees de la tarjeta. Pero siempre hay un ID unico en la tarjeta que te sirve para identificar al usuario

      • Adrian V.

      Saludos,n
      Tengo una pregunta; Cuantas etiquetas puedo almacenar utilizando arduino?
      Sería posible realizar un proyecto de que una cerradura pueda ser abierta por 200 usuarios o más, utilizan solamente un arduino Nano y u MFRC522?

      Y si quiero agregar identificaciones a cada tarjeta o llavero, por ejemplo
      Nombre y Apellidos
      Cedula
      edad
      etc, etc
      y que los muestre por una pantalla, como debería realizarlo.

      Gracias de antemano, muy buen aporte

      • Hola Adrián, llevamos tiempo tratando de dedicar un rato al rfid pero parece que nos está constando. En principio si creo que podrías hacer lo que propones, y las que puedas guardar en la memoria del Arduino dependen de cuál uses. Ahora mismo no sé decirte cuántas podrás guardar en el Nano pero podrías ver cuanto te ocupa una y la memoria que tiene el nano para calcularlo.

      • con esa cantidad de tarjetas, tal vez debas pensar mejor en implementar una base de datos mySql

    • Excelente explicación, Una pregunta, que chip me convendría utilizar para leer una tag entre unos 10 y 25 cm aprox., o que podría usar en su defecto?

      Saludos!

      • Hola Froylan, estos tags y lectores RFID que usamos para las practicas son de los baratos y muy corto alcance. Para lo que planteas necesitas los lectores y tags del tipo UHF que no tendras problema en encontrar buscando un poco en google sobre tags rfid UHF

      • William Sanchez

      seria posible conectar varias tarjetas rc522 para varias puertas y controlarlas con una sola placa de arduino ???? gracias

      • Hola William, utilizan el protocolo SPI así que deberías poder conrolar varias con un solo Arduino. UN saludo.

    • como se modifican los codigos de la tarjeta o de la llave?

      • Tenemos pendiente un tuto en el que veamos como escribir información en la tarjeta o la llave. A ver si sacamos tiempo y podemos hacerlo. Un saludo.

      • Dcnavi

      hola cual es la frecuencia que lee los tags pasivos

      • Te hablod e memoria pero creo que los que usamos a aqui, sencillos , son de 13.5 Mhz

    • Buen día,

      anteriormente ya implemente la conexión con un MFRC522, funciona excelente , sin embargo ahora debo tener un mayor alcance por lo que se decidió comprar una antena UHF .

      ¿Saben si se puede implementar el mismo proceso con un lector de largo alcance (UHF) + arduino?

      Gracias.

      • Hola Juan, No conoczco ningu interface rfid UHF para arduino sencillo, pero hay varios por ahi que puedes encontrar en cuanto busques en Google RFID UHF arduino

      • Felix

      hola como puedo conectar dos o más modulos rfid al arduino

      • Hola Félix, así rápido y sin haberlo probado: Todo en paralelo menos SS que será un pin diferente para cada RFID.

    • Buen día a todos los miembros de este grupo.
      Me gustaría saber algunas cosas con respecto a las tarjetas RFID, espero puedan ayudarme.
      ¿Cada tarjeta tiene un numero identificador o uno tiene que ponérselo?
      Si es que debe ser programada la tarjeta, ¿como hago para programarla?
      Muchas gracias de antemano y saludos a todos

      • Hola ejimenez

        Normalmente las tarjetas RFID traen un ID iprogramado internamente de 11 digitos que los fabricantes van grabando no s emuy bien con que criterio pra disponer de una identificacion univoca de cada tag

        No obstante, puedes grabar otro ID a tu gusto y llevamos un tiempo queriendo escribir un tuto al respecto pero nos falta tiempo. De todos modos deberia ser sencillo encontrar en internet algun tuto que te muestre como grabarlas

    • Buen día.
      Me gustaría resolver un par de dudas que me quedaron.
      1.- ¿Cómo se programa una RFID card?
      2.- ¿La información que existe ligada a ese RFID card la toman del mismo RFID card?

      Muchas gracias por su atención y su ayuda.

      • Tenemos pendiente un tuto presentando la forma de escribir en una de estas RFID cards que por razones de tiempo siempre se va alargando
        SI. la Card dispone de un ID interno y de una serie de posiciones d ememoria que s eleen directamente de ella si lo deseamos

      • Jimena

      puedes subir el código del ejemplo completo???

      • Hola Jimena, tienes el código al principio del apartado del programa de control Prog_170_1. Un saludo.

      • Jorge vega

      Buenas noches estimado programador,

      Quería comentarte que no salgo de lo siguiente:

      This code scan the MIFARE Classsic NUID.
      Using the following key: FF FF FF FF FF FFThis code scan the MIFARE Classsic NUID.
      Using the following key: FF FF FF FF FF FFThis code scan the MIFARE Classsic NUID.
      Using the following key: FF FF FF FF FF FFThis code scan the MIFARE Classsic NUID.
      Using the following key: FF FF FF FF FF FF

      (Todas esas veces es por resetear la placa a ver si lo cogía, pero jamás consigo que lea nada, ni tarjeta, llavero… He seguido todo al pie de la letra)

      Debo hacer algo más o hay algo que no esté escrito… no entiendo por qué no lee, gracias!

      • Buenos dias Jorge, No hay ningun secreto en esto y lo mas probable es n error de conexion o quizas del tipo de tarjeta RFID

        Recuerda que hay varios tipos de RFID y estos lectores solo leen los del tipo mifare y no otroas versiones mas sofisticadas. si a pesar de todo no quiere leer y esta sseguro de que usas el tipo correcto de tag es el moemnto de pensar que algo puede estar dañado ¿Vale?

      • Hola,

        Me ha estado pasando lo mismo hasta que he revisado las conexiones entre mi arduino y el modulo RFID.
        Erroneamente he girado el SDA y SCK y una vez puestos correctamente, he podido leer las tarjetas!!!

        Saludos,

      • Yyoquese

      No. El MFRC-522 sólo lee PICCs a 13.56MHz. Ni siquiera lee los PICCs a 125 kHz de los antiguos controles de acceso y mucho menos los UHF. Si lee PICCs como los MIFARE aunque algunos PICCs no están implementados en las librerías actuales (Como es el caso de los MIFARE Ultralight o MIFARE DeESfire, que utilizan cifrado)

    Give a Reply

    WordPress Anti-Spam by WP-SpamShield

    ¡Ofertón!

    Robot Rover 4×4

    Ahora por sólo

    50€ + IVA

    ¡Lo quiero!