Está en la página 1de 11

8.13.4.

LECTURA DE CDIGOS DE TARJETAS MAGNTICAS MEDIANTE UN LECTOR RFID RFID (Identificacin por radiofrecuencia o Radio Frequency Identificaton, del ingls) es una tecnologa que permite obtener cdigos binarios de etiquetas ubicadas a cierta distancia de un lector que emite ondas de radio frecuencia. Un sistema bsico de RFID se compone de una tarjeta o Tag, un lector y un computador o sistema embebido encargado de reconocer el cdigo de la tarjeta. El lector puede recibir informacin del Tag a su vez que tambin puede grabarle nueva informacin. Uno de los ejemplos ms conocidos de sistemas RFID es el que se encuentra en la entrada a la estacin de buses Metropolitano de Lima. El pago del pasaje y el acceso a los terminales se realiza mediante Tags RFID y lectores conectados al sistema de acceso al terminal, cuando el sistema confirma el saldo disponible en la tarjeta, el usuario tiene derecho al ingreso (mediante una barda que afloja el torque para el acceso) y el descuento del saldo de la tarjeta es automticamente descargado de la tarjeta. En la Figura 8.15 se observa un esquema de un sistema RFID. El Tag RFID se encuentra a una cierta distancia del lector que es de unos cuantos centmetros para el tipo de Tag mostrado en la figura (Tag pasivo).

Figura 8.15. Comunicacin entre un lector RFID y un Tag

Para obtener una respuesta del Tag RFID, el lector emite una onda de radiofrecuencia que irradia a la tarjeta si esta se encuentra dentro del rango de emanacin de energa o rango de lectura del lector (usualmente alrededor de unos 10 centmetros). De esta manera, el Tag utiliza esta energa para retornar su propio cdigo de identificacin al lector. Tanto los lectores como los Tags utilizan antenas de tipo Microstrip que corresponden a un tipo adherido al circuito impreso, con lo cual solo ocupan muy poco espacio y pueden estar implementadas en tarjetas, etiquetas flexibles o hasta en llaveros. Adicionalmente, el Tag cuenta con un circuito integrado muy pequeo, el cual es el encargado de generar la seal de informacin a enviar y controlar una pequea memoria EEPROM donde se almacenarn el cdigo del Tag. En la Figura 8.16 se puede ver una imagen de un Tag RFID.

Figura 8.16. Arquitectura de un Tag RFID Como se puede observar, el tamao del Tag depende en gran medida del diseo de la antena. Estas son creadas en base a cobre, aluminio e inclusive a tintas conductoras. El tamao y diseo de la antena define su rango de lectura. El tipo de tarjeta mostrada en la Figura 8.16 corresponde al tipo pasivo ya que recibe la energa de alimentacin a travs de la seal de radio frecuencia generada por el lector. Existen otros tipos de Tag denominados activos, los cuales

tienen un rango de transmisin mucho mayor con la desventaja de que requieren su propia fuente de alimentacin. La banda de frecuencia para la cual operan los lectores y Tag depende del tipo de aplicacin en la cual se utilizar el sistema RFID. Por ejemplo, la banda LF (Baja frecuencia, del ingls Low Frequency) opera en el rango de los 125KHz. En esta frecuencia, la comunicacin es lenta y el alcance es corto (no supera los 50 centmetros). Adems, no se permite la lectura de dos Tags en simultneo, por lo cual esta banda es usada en sistemas de marcacin de personal o el acceso a sistemas de seguridad. La banda de los 13.56MHz denominada HF (Alta frecuencia, del ingls High Frequency) presenta una mayor velocidad de comunicacin y tiene un rango de lectura de alrededor de un metro y se utiliza en libreras, contenedores y tarjetas inteligentes. La tercera banda en UHF se encuentra en el rango de los 868 a 928 MHz en la cual se logran rangos de lectura de 9 metros y se pueden leer hasta 1200 Tags en simultneo. Finalmente, la banda de 2.4 a 5.8 GHz presenta una baja velocidad de transmisin y un rango de lectura menor a 2 metros. Entre sus aplicaciones se encuentra los sistemas de tele peaje. La empresa Mikroelectronika presenta entre su lnea de productos diversos dispositivos perifricos para la comunicacin con sistemas embebidos. Entre estos productos se encuentra un lector RFID basado en el circuito integrado EM4095, el cual es un transceptor RFID que se conecta y polariza una antena Microstrip a una frecuencia de 125 kHz y tiene un bus de comunicacin de cuatro hilos para recibir seales de control y enviar datos al sistema embebido. En la Figura 8.17 se muestra una imagen del mdulo RFID cuyo costo en los Estados Unidos es de $24. Este lector energiza Tags pasivos y estos tambin son vendidos por la misma empresa a un costo de $1.50. Cada Tag puede almacenar hasta 64 bits de informacin.

Figura 8.17. Lector RFID basado en el transceptor EM4095 de Mikroelektronika El EM4095 se alimenta con un voltaje de hasta 6V. Este circuito integrado se encarga de manejar todo el proceso de comunicacin con el Tag y se comunica con un sistema embebido a travs de cuatro lneas cuyas funciones se muestran en la Tabla 8.11.

Tabla 8.11. Funcin de los pines de comunicacin del EM4095. Pin Funcin Esta seal de salida contiene la frecuencia de reloj de datos de aproximadamente 120 kHz. Este pin adems, opera como RDY/CLK bandera de que el integrado se encuentra en modo de bajo consumo (nivel 0 lgico) Es la seal de datos del EM4095. Contiene el cdigo binario DEMOD_OUT ledo desde el Tag Es un pin de entrada usado para mantener el EM4095 en bajo SHD consumo (con nivel 1 lgico). En este modo no es posible leer la informacin del Tag. Cuando este pin recibe un nivel 1 lgico se reinicia la MOD modulacin de seal en la antena.

Conforme el Tag se aproxima a la antena del lector, las seales RDY/CLK y DEMOD_OUT se mantendrn generando el cdigo binario ledo desde la tarjeta. Es importante que la tarjeta se aproxime de manera muy cercana a la antena del lector para que la calidad de ambas seales mejore. Las seales aparecern siempre que las lneas SHD y MOD se encuentren en nivel 0 lgico. El cdigo de un Tag RFID comienza con nueve transiciones de 1 a 0. Esta etapa permite sincronizar al receptor para detectar el cdigo de la tarjeta RFID y sigue la norma EM4100 en donde se deben leer solamente los bits impares (en realidad la secuencia de sincronismo es 1111 1111 1, los 0s se deben ignorar al igual que el resto de bits que mantienen la misma posicin par en la secuencia). En la Figura 8.18 se muestra una imagen de la seal DEMOD_OUT y la seal de

reloj en la etapa de sincronismo. Los flancos de subida de la seal determinan el momento en el cual la seal de datos cambia de estado.

Figura 8.18. Bloque de sincronismo para ubicar el cdigo del Tag RFID El periodo de la seal de reloj es de aproximadamente 8.4 segundos y el tiempo de bit en la lnea es de aproximadamente 268.8 segundos. Esto significa que la duracin de un bit en la lnea DEMOD_OUT es de 32 periodos de reloj. El cambio de estado de la lnea de datos se sincroniza con uno de los flancos de subida de la seal de reloj, pero, solo uno de cada 32 ser el flanco que determine el cambio de estado. En la Figura 8.19 se muestra una duracin de un bit 1 lgico en la lnea DEMOD_OUT. Se puede observar que el tiempo de bit se encuentra compuesto por 32 periodos de reloj.

Figura 8.19. Duracin en ciclos de reloj de un bit en la lnea DEMOD_OUT La propuesta de solucin a este problema se presenta en la Figura 8.20. La lnea DEMO_OUT se conecta al pin RB0 mientras que la seal de reloj se conecta al pin RB1. Ambos

pines poseen la opcin se ser configurados como entradas de interrupcin externa. La lnea RB2 controla la seal SHD y la lnea RB3 la seal MOD. Estos pines se configuran como salidas digitales y se mantienen en nivel 0 lgico.

Figura 8.20. Circuito esquemtico propuesto para la lectura del cdigo de los Tags RFID La propuesta consiste en detectar el flanco de subida de la seal de datos por la interrupcin externa INT0/RB0. Una vez detectada esta interrupcin, se deber verificar si este bit 1 lgico corresponde al primer elemento de la transicin de nueve 1s y 0s. Para esto, se harn los siguientes pasos: 1. Configurar la interrupcin externa INT0 sensible al flanco de subida. 2. Configurar la interrupcin externa INT1 sensible al flanco de subida. 3. Activar las interrupciones e inicializar el contador de flancos cnt = 0. La variable de sincronismo one_seq se inicializa en 0. 4. En cada interrupcin por flanco de subida del INT1 se deber incrementar en 1 la variable cnt. 5. En cada interrupcin por flanco de subida en INT0 se deber consultar si cnt es mayor o igual a 63 o menor o igual a 65. Esto implica que hay dos flancos de subida consecutivos de la seal de datos en un periodo igual a 64 periodos de reloj aproximadamente (con un error de tolerancia de 1 periodo de reloj). Si la

condicin es falsa, no se ha detectado una transicin de 1 a 0, por lo cual la variable one_seq se inicializa en 0. En caso la condicin sea verdadera, se incrementa en 1 la variable one_seq y luego se consulta si esta variable ya tom el valor de 9. Finalmente, el contador cnt se inicializa en 0 para que se reinicie el conteo de los pulsos de reloj para el siguiente tiempo de bit de la seal DEMOD_OUT. 6. Una vez detectado el pulso de sincronismo se desactiva la interrupcin en INT0 y se inicializa cnt en 0. Posteriormente, se espera a que cnt sea 16 (la mitad de un tiempo de bit) y se comienza a leer el valor de la lnea RB0 cada vez que cnt sea 32. Durante 25 o ms ciclos (dependiendo de la cantidad de bits que se quiera extraer de la tarjeta) Cada tarjeta posee un cdigo binario nico. El estndar EM4100 establece los campos a los que pertenece cada bit, los bits de paridad y el final de la trama. El programa 8.43 muestra un ejemplo para extraer los primeros 25 bits de la trama en un vector. Se recomienda al lector disear una funcin que implemente el estndar EM4100 y evale el contenido en datos de los bits obtenidos del Tag para determinar si hubo o no error de lectura. Un detalle muy importante sobre el lector RFID de Mikroelektronika es que los Tags deben aproximarse lo mximo posible a la antena del lector a fin de que la calidad de la seal sea buena y por tanto la deteccin de los bits sea correcta. Programa 8.43. Algoritmo para extraer los primeros 25 bits de cdigo de un Tag RFID
#include <p18F4550.h> #include <delays.h>

#pragma config FOSC = XTPLL_XT #pragma config PLLDIV = 1

//XT_PLL_XT Opcin de reloj del CPU //Divisor del PLL (4MHz/1)*24=96MHz

#pragma config CPUDIV = OSC1_PLL2 //Divisor del Postscaler 96MHz/2 = 48MHz #pragma config PWRT = ON

#pragma config WDT = OFF #pragma config LVP = OFF #pragma config BOR = OFF #pragma config DEBUG = ON #pragma config VREGEN = OFF #pragma config PBADEN = OFF #pragma config MCLRE = ON

#define OUT

PORTBbits.RB0

#define RDY_CLK PORTBbits.RB1 #define SHD #define MOD LATBbits.LATB2 LATBbits.LATB3

#define OUT_Direction #define RDY_CLK_Direction #define SHD_Direction #define MOD_Direction

TRISBbits.TRISB0 TRISBbits.TRISB1 TRISBbits.TRISB2 TRISBbits.TRISB3

#define CLAVE_1 1 #define CLAVE_2 2 #define CLAVE_3 3 #define BUSCA_SYNC 0

#define ESPERA_MEDIO_BIT 1 #define OBTIENE_BITS #define MOSTRAR_BITS #define REINICIO #define INICIO 3 4 5 2

void RUT_INT(void); #pragma code int_Timer1 = 0x08 void Alta_prior(void) { _asm goto RUT_INT _endasm

} #pragma code #pragma udata VECTOR = 0x100

char data[256]; #pragma udata #pragma udata VARIABLES = 0x200 unsigned char sync_flag,one_seq,i; unsigned char cnt,clave; char k1,k2,k3 = 0; unsigned char estado = INICIO; char clave_1[]= "1100100000100100000000010"; char clave_2[]= "1100100000100100100010100"; char clave_3[]= "1100001000100001100010000"; #pragma udata

void main() { OUT_Direction = 1; RDY_CLK_Direction = 1; SHD_Direction = 0; MOD_Direction = 0; SHD = 1; MOD = 0; TRISD = 0x00; TRISC = 0b10111111; INTCON2bits.RBPU = 0; INTCON2bits.INTEDG0 = 1; //Flanco de subida en RB0 INTCON2bits.INTEDG1 = 1; //Flanco de subida en RB1 INTCONbits.INT0IF = 0; INTCON3bits.INT1IF = 0; INTCONbits.PEIE INTCONbits.GIE SHD = 0; while(1) { switch(estado) { case INICIO: Delay10KTCYx(240); Delay10KTCYx(240); Delay10KTCYx(240); INTCONbits.INT0IE = 1; //Tiempo de espera para leer el cdigo del //siguiente Tag una vez que se ha detectado //correctamente un cdigo anterior = 1; = 1;

INTCON3bits.INT1IE = 1; estado = BUSCA_SYNC; case BUSCA_SYNC: if(one_seq == 9) { one_seq = 0; INTCONbits.INT0IE = 0; estado = ESPERA_MEDIO_BIT; } break; case ESPERA_MEDIO_BIT: while(cnt!=16); cnt = 0; i=1; data[0]=OUT; estado = OBTIENE_BITS; break; case OBTIENE_BITS: while(cnt!=32); cnt = 0; data[i]= OUT; i++; if(i==128) estado = MOSTRAR_BITS; break; case MOSTRAR_BITS: k1=0; k2=0; k3=0; for(i=0;i<25;i++) { if(data[i]==clave_1[i]-'0') k1++; if(data[i]==clave_2[i]-'0') k2++; if(data[i]==clave_3[i]-'0') k3++; } if(k1==25) clave = CLAVE_1; if(k2==25) clave = CLAVE_2; if(k3==25) clave = CLAVE_3; estado = INICIO; break;

} } }

#pragma interrupt RUT_INT void RUT_INT(void) { if(INTCON3bits.INT1IF==1) { cnt++; INTCON3bits.INT1IF=0; } if(INTCONbits.INT0IF==1) { //Seal de data //Entrada del clock

if(cnt>=63 && cnt <=65) { one_seq++; } else { one_seq = 0; } cnt = 0; INTCONbits.INT0IF = 0;

} }