5.-ONDAS: RFID

TARJETA DE DATOS CON EL MÓDULO RFID-RC522 RF


1. TEORÍA

LA TECNOLOGÍA "RFID"

RFID (siglas de Radio Frequency IDentification, en español identificación por radiofrecuencia) es un sistema de almacenamiento y recuperación de datos remoto que usa dispositivos denominados etiquetas, tarjetas, transpondedores o tags RFID.

El propósito fundamental de la tecnología RFID es transmitir la identidad de un objeto (similar a un número de serie único) mediante ondas de radio.

 En la actualidad, la tecnología más extendida para la identificación de objetos es la de los códigos de barras. Sin embargo, éstos presentan algunas desventajas, como la escasa cantidad de datos que pueden almacenar y la imposibilidad de ser reprogramados. La idea mejorada constituyó el origen de la tecnología RFID; consistía en usar chips de silicio que pudieran transferir los datos que almacenaban al lector sin contacto físico, de forma equivalente a los lectores de infrarrojos utilizados para leer los códigos de barras.

Las tecnologías RFID se agrupan dentro de las denominadas Auto ID (automatic identification, o identificación automática).


LAS ETIQUETAS RFID:
Las etiquetas RFID (RFID Tag, en inglés) son unos dispositivos pequeños, similares a una pegatina, que pueden ser adheridas o incorporadas a un producto, un animal o una persona. Contienen antenas para permitirles recibir y responder a peticiones por radiofrecuencia desde un emisor-receptor RFID. Las etiquetas pasivas no necesitan alimentación eléctrica interna, mientras que las activas sí lo requieren.
Aquí vemos algunos de los jemplo de etiquetas de RFID: para uso textil, peaje electrónico en carreteras, embalajes, implantes subcutáneos, etc. etc. :










EL SISTEMA RFID
Una de las ventajas del uso de radiofrecuencia (en lugar, por ejemplo, de infrarrojos) es que no se requiere visión directa entre emisor y receptor.

Un sistema RFID consta de los siguientes tres componentes:
  • Etiqueta RFID : compuesta por una antena, un transductor radio y un material encapsulado o chip. El propósito de la antena es permitirle al chip, el cual contiene la información, transmitir la información de identificación de la etiqueta. Existen varios tipos de etiquetas. El chip posee una memoria interna con una capacidad que depende del modelo y varía de una decena a millares de bytes. 
  • Lector de RFID: compuesto por una antena, un transceptor y un decodificador. El lector envía periódicamente señales para ver si hay alguna etiqueta en sus inmediaciones. Cuando capta una señal de una etiqueta (la cual contiene la información de identificación de esta), extrae la información y se la pasa al subsistema de procesamiento de datos.
  • Subsistema de procesamiento de datos o Middleware RFID: proporciona los medios de proceso y almacenamiento de datos.




PROTOCOLO SPI:

El Bus SPI (del inglés Serial Peripheral Interface) es un estándar de comunicaciones, usado principalmente para la transferencia de información entre circuitos integrados en equipos electrónicos. El bus de interfaz de periféricos serie o bus SPI es un estándar para controlar casi cualquier dispositivo electrónico digital que acepte un flujo de bits serie regulado por un reloj (comunicación sincrónica).
Incluye una línea de reloj, dato entrante, dato saliente y un pin de chip select, que conecta o desconecta la operación del dispositivo con el que uno desea comunicarse. De esta forma, este estándar permite multiplexar las líneas de reloj.
Muchos sistemas digitales tienen periféricos que necesitan existir pero no ser rápidos. La ventajas de un bus serie es que minimiza el número de conductores, pines y el tamaño del circuito integrado. Esto reduce el coste de fabricar, montar y probar la electrónica. Un bus de periféricos serie es la opción más flexible cuando se tiene tipos diferentes de periféricos serie. El hardware consiste en señales de reloj, data in, data out y chip select para cada circuito integrado que tiene que ser controlado. Casi cualquier dispositivo digital puede ser controlado con esta combinación de señales. Los dispositivos se diferencian en un número predecible de formas. Unos leen el dato cuando el reloj sube otros cuando el reloj baja. Algunos lo leen en el flanco de subida del reloj y otros en el flanco de bajada. Escribir es casi siempre en la dirección opuesta de la dirección de movimiento del reloj. Algunos dispositivos tienen dos relojes. Uno para capturar o mostrar los datos y el otro para el dispositivo interno.
El SPI es un protocolo síncrono. La sincronización y la transmisión de datos se realiza por medio de 4 señales:
  • SCLK (Clock): Es el pulso que marca la sincronización. Con cada pulso de este reloj, se lee o se envía un bit. También llamado TAKT (en Alemán).
  • MOSI (Master Output Slave Input): Salida de datos del Master y entrada de datos al Slave. También llamada SIMO.
  • MISO (Master Input Slave Output): Salida de datos del Slave y entrada al Master. También conocida por SOMI.
  • SS/Select: Para seleccionar un Slave, o para que el Master le diga al Slave que se active. También llamada SSTE.


2.- LECTURA Y ESCRITURA DE UNA TARJETA RFID.
 Utilizando arduino y el módulo RC522 realizaremos el montaje con un programa que nos permita escribir y leer una tarjeta RFID. Para ello, un grupo  de alumnos montará el arduino  para escribir algo en la tarjeta y otro grupo de alumnos hará lo propio para poder leer el contenido de esa misma tarjeta.

 ((El tutorial de esta actividad se ha obtenido del enlace:


Haremos uso del Arduino UNO y el Módulo Lector RFID-RC522 RF para dar uso de algunas funciones de la librería RFID. Las operaciones que haremos en este tutorial, serán:

  1. Escritura  de un bloque de memoria en una tarjeta (rfid.read)
  2. Lectura de un bloque de memoria en una tarjeta (rfid.write)
  3. Lectura de número de serie de tarjeta (rfid.numSerie)

CONEXIONES
A continuación se muestra una tabla con los pines del Módulo Lector RFID-RC522 RF, así como la conexión que tendrá con el Arduino UNO.





EL MÓDULO LECTOR RFID-RC522 RF

El Módulo Lector RFID-RC522 RF utiliza 3.3V como voltaje de alimentación y se controla a través del protocolo SPI, así como el protocolo UART, por lo que es compatible con casi cualquier micro controlador, Arduino o tarjeta de desarrollo.
El RC522 utiliza un sistema avanzado de modulación y demodulación para todo tipo de dispositivos pasivos de 13.56Mhz.   Como se hará una lectura y escritura de la tarjeta, es necesario conocer las características de los bloques de memoria una tarjeta: La tarjeta que viene con el módulo RFID cuenta con 64 bloques de memoria (0-63) donde se hace lectura y/o escritura. Cada bloque de memoria tiene la capacidad de almacenar hasta 16 Bytes/bloque.
El número de serie consiste tiene 5 valores hexadecimales, se podría utilizar esto para hacer una operación dependiendo del  número de serie.  

Características del Módulo Lector RFID-RC522 RF

  • Modelo: MF522-ED
  • Corriente de operación: 13-26mA a 3.3V
  • Corriente de stand by: 10-13mA a 3.3V
  • Corriente de sleep-mode: <80uA
  • Corriente máxima: 30mA
  • Frecuencia de operación: 13.56Mhz
  • Distancia de lectura: 0 a 60mm
  • Protocolo de comunicación: SPI
  • Velocidad de datos máxima: 10Mbit/s
  • Dimensiones: 40 x 60 mm
  • Temperatura de operación: -20 a 80ºC
  • Humedad de operación: 5%-95%
  • Máxima velocidad de SPI: 10Mbit/s
  • Incluye pines, llavero y tarjeta

LIBRERÍA:
Antes de cargar el código es necesario cargar en el arduino IDE la librería del módulo MFRC522 (añadir librería desde zip). La librería se obtiene en formato zip en la dirección:
https://github.com/miguelbalboa/rfid


2.1.- CODIGO PARA LA ESCRITURA
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9  //configurable
#define SS_PIN 10  //configuragle
MFRC522 mfrc522(SS_PIN, RST_PIN); // crea la instancia MFRC522
void setup() {
Serial.begin(9600);   // inicia comunicación serie con el pc
SPI.begin();          // inicia el bus SPI
mfrc522.PCD_Init();   // Inicia tarjeta MFRC522
Serial.println(F("Ingrese Tarjeta para Escribir Dato Personal"));
}
void loop() {
// Prepare key-Inicialmente chip a FFFFFFFFFFFFh de fabrica
MFRC522::MIFARE_Key key;
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF; //hasta el bloque6
if ( ! mfrc522.PICC_IsNewCardPresent()) {  //detecta nueva tarjeta
return;
}

if ( ! mfrc522.PICC_ReadCardSerial()) return;   //selecciona la tarjeta
Serial.print(F("Num. de Serie unico:"));       //Dump 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.print(F(" PICC type: "));           // Dump PICC type
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));
byte buffer[34];
byte block;
MFRC522::StatusCode status;
byte len;
Serial.setTimeout(20000L) ; // espera antes de comunicacion serie
Serial.println(F("Escriba Dato, al final incluya #")); //informa
len=Serial.readBytesUntil('#', (char *) buffer, 20) ; //lectura serie hasta#
for (byte i = len; i < 20; i++) buffer[i] = ' '; // almohadilla con espacios
block = 6; //Especifica en que bloque escribira ___------___-----___
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}

status = mfrc522.MIFARE_Write(block, buffer, 16); //escribe el bloque
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() Escritura Realizada Corectamente: "));
block = 5;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
// Write block
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() Escritura Realizada Corectamente: "));
Serial.println(" ");
mfrc522.PICC_HaltA(); // Halt PICC
mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD
}



DESCRIPCIÓN DEL PROGRAMA DE ESCRITURA:
Se agregan las librerías:

#include <SPI.h>
#include <MFRC522.h>
Esta línea específica que se tendrán 20s para poder escribir el dado a grabar en la tarjeta/llavero:

Serial.setTimeout(20000L) ;

Al ingresar el dato a escribir se tendrá que ingresar “#” al final para confirmar el dato
Por ejemplo, en el monitor serial se ingresa esto que equivale a 16 caracteres ( que coincide con la capacidad por bloque 16bytes/bloque): HOLA ME LLAMO RICAR
Especificicamo en qué bloque se escribirá el dato:

block = 6; //Se especifica en que bloque se escribira
Al abrir el monitor serial lo primero que aparecerá será el mensaje de “Ingrese Tarjeta para Escribir Dato Personal”.
Una vez colocada la tarjeta aparecerá su núm de serie único y su PICC type, ademas del mensaje “Escriba Dato, al final incluya #”
Entonces tendrá 20s para agregar el dato a escribir
Si se escribió correctamente aparecerá el mensaje
MIFARE_Write() Escritura Realizada Corectamente:
MIFARE_Write() Escritura Realizada Corectamente:
MONITOR CERIAL ESCRITURA 522
Una vez realizado esto el dato quedara escrito en la tarjeta/llavero.

  


2.2.- CÓDIGO PARA LA LECURA:
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // Configurable
#define SS_PIN 10 // Configurable
MFRC522 mfrc522(SS_PIN, RST_PIN); // Crea MFRC522 instancia.
MFRC522::MIFARE_Key key;
void setup() {
Serial.begin(9600);   // Initializa serial communications con PC
while (!Serial);     // parar si el puerto  está abierto
SPI.begin();        // Inicia SPI bus
mfrc522.PCD_Init(); // Inicia MFRC522 card
// utiliza FFFFFFFFFFFFh que son los datos en chip de fábrica
for (byte i = 0; i < 6; i++) {  //solo el bloque6
key.keyByte[i] = 0xFF;
}
Serial.println(F("Ingrese Tarjeta"));
}
void loop() {

if ( ! mfrc522.PICC_IsNewCardPresent())  //mira si hay nueva tarjeta
return;

if ( ! mfrc522.PICC_ReadCardSerial())  //selecciona la nueva tarjeta
return;
byte sector = 1;
byte blockAddr = 6; //Lee solo del bloque6 sus 16bytes
byte dataBlock[] = {
0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4,
0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8,
0x08, 0x09, 0xff, 0x0b, // 9, 10, 255, 12,
0x0c, 0x0d, 0x0e, 0x0f // 13, 14, 15, 16
};
byte trailerBlock = 7;
MFRC522::StatusCode status;
byte buffer[18];
byte size = sizeof(buffer);
Serial.println(F("Datos actuales en el sector:"));
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println();

Serial.print(F("Cargando dato del bloque ")); Serial.print(blockAddr);
Serial.println(F(" ..."));
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Read() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print(F("Dato en el bloque ")); Serial.print(blockAddr); Serial.println(F(":"));
dump_byte_array(buffer, 16); Serial.println();
Serial.println();
}
/**
* Rutina que envia el valor hex al puerto serie.
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
// Serial.print(buffer[i] < 0x10 ? " 0" : " ");
// Serial.print(buffer[i], HEX);
Serial.write(buffer[i]);
}
}



DESCRIPCION DEL PROGRAMA DE LECURA:
Agrega dos librerías:

#include <SPI.h>
#include <MFRC522.h>
Se especifica el sector y bloque que se leerá
Nota:Este debe coincidir con el bloque en que se escribió en el primer programa, o simplemente con el bloque que se desee leer
byte sector         = 1;
byte blockAddr      = 6;  

Es importante recalcar que los datos escritos en la tarjeta/llavero siempre serán en hexadecimal, por lo cual para su lectura es importante hacer la conversión de HEX a ASCII

Serial.write(buffer[i]);
Al ejecutar el programa aparecerá el mensaje “Ingrese Tarjeta”
Una vez colocada la tarjeta aparecerá los “Datos actuales en el sector”, esto te permitirá ver que bloques están disponibles para escribir en ellos, además de ver si hay algo ya escrito en otro bloque
Nota: se puede sobrescribir en el bloque en el cual ya escribiste, así que si quiere cambiar lo escrito por algún error o por algún otro motivo puedes hacer.
En el primer bloque no se puede escribir, en nuestro caso el bloque6
Después aparece: Cargando el dato del bloque “se imprime el número del bloque que se leerá”
Dato en el bloque “se imprime el número del bloque que se leerá”
“Se imprime dato escrito en la tarjeta/llavero”
Lectura de rc522








ACTIVIDADES:
1.- Un grupo de alumos graba datos en la tarjeta mientras que el otro grupo prepara su arduino para poder leer los datos de esa tarjeta.
2.- Ventajas y desventajas de la tecnología RFID.
3.- Aplicaciones de la RFID.