RFID

RfID (módulos ID 2 o ID 12 o ID 20) El ID-2, el ID-12 y el ID-20 son módulos de lectura y escritura de etiquetas RFID (Radio Frequency Identification o identificación por radiofrecuencia),  que nos proporciona una mayor facilidad al momento de realizar proyectos donde se requiera un control de entradas o para identificar alguna objeto, animal o persona de forma automática. Este modulo es muy seguro y se encarga de leer la información recabada en las etiquetas y enviar vía serial al usuario, lo cual nos permite conectarla a una placa pingüino fácilmente.

Estos módulos trabajan con un voltaje de 5v aunque tienen una tolerancia que les permite trabaja desde 4,6v hasta 5,4v y requieren 13mA(ID-2),30mA(ID-12) y 65mA (ID-20), trabaja a un rango de 125Khz

Etiquetas RFID
Son pequeños sistemas de almacenamientos el cual posee la capacidad de emitir dicha información mediante una emisión de radio a corta distancia, estas etiquetas tiene muchas formas, las cuales van desde simples pegatinas(calcomanías) hasta pequeños encapsulados que pueden ser implantados de bajo de la piel. Estas etiquetas normalmente pueden ser de tipo activo o pasivos, las etiquetas pasivas no posee alguna alimentación eléctrica interna en ellas, sino que obtienen una pequeña carga inducida por el modulo lector y el cual le permite emitir la información contenida en ella, pero a una distancia muy corta, las etiquetas activas  por su parte si poseen una pequeña bateria lo cual le permite activar su sistema y funcionar por aproximadamente 10 años y posen un rango de lectura mucho mas amplias. Las información de las etiquetas puede variar según su modelo, por lo general posen un código único, de fabrica, estas no pueden ser escritas nuevamente, pero existen etiquetas que pueden ser grabadas mediante un modulo de RFID, otra cosa que suele cambiar en las etiquetas el a frecuencia en que trabajan, los módulos ID-2, ID-12 y el ID-20 trabajan a una frecuencia de 125khz, pero otros módulos pueden trabajar a una diferente y es algo que debe recordar al momento de comprar los módulos.

Estructura de la salida de datos
El modulo ID-2, el ID-12 y el ID-20 poseen la misma estructura de salida, esta se da después de leer alguna etiqueta RFID, internamente el modulo calcula un checksum y emite como salida un paquete de datos con la siguiente estructura:

Lo primero que hay que saber para trabajar con estos módulos es binario, hexadecimal y ASCIII ¿por qué? simple porque tenemos que tener encuentra que un código ASCII no es lo mismo que uno en hexadecimal y esto se ve mejor si los trabajamos en binario, por ejemplo el número 0 en ASCII se representa como el 48 que en binario (del código ASCII) se representa como 0011 0000, mientras que en hexadecimal se representa como 0, también se puede representar en binario (del código hexadecimal) como 0000, ¿ven la diferencia? Si tratamos de comparar estos 2 valores nunca nos darán lo mismo, porque 48 no es igual a 0 (‘0’ != 0), además cada dígito en ASCII equivale a 8 bit, mientras que en hexadecimal solo se necesitan 4 bit, lo que quiere decir que en solo 1 byte(8 bit) puedes representar 2 dígitos, usando hexadecimal, mientras que en ASCII necesitas 2 byte (16 bit) para representarlo.

Para poder convertir el ASCII en Hexadecimal se debe restar el excedente, es decir que al ‘0’ (48) de ASCII se le resta 48 para que de 0 (bin 0000), así mismo el 49 en ASCII es el ‘1’ (bin 0011 0001) y si a 49 se le resta 48 quedaría 1 (bin 0001), el problema está en que en hexadecimal el 10,11,12,13,14 y 15 son representados como A,B,C,D,E y F respectivamente y en ASCII el ‘A’ se representa como 65 (bin 0100 0001) y si a 65 se le resta 48, no da 10 sino da 17, esto nos indica que se debe tener encuentra el valor recibido para tratarlo de forma diferente, si el valor recibido es menor de 65 entonces se le resta 48 pero si es igual o mayor se le resta 55, de esta forma 65-55=10 o lo que es lo mismo ‘A’(bin 0100 0001)-55=0xA(bin 1010).(Recuerden que representamos los caracteres ASCII con comillas, mientras que los hexadecimal no las poseen).

ya tenemos la conversión lista, pero falta un paso más, los códigos que deberías tener son 5 y de 1 byte cada uno, es decir por ejemplo FF (bin 1111 1111) que es 1 byte (8 bit), en cambio tenemos que cuando convertimos nuestro ASCII en Hexadecimal, el resultado lo hemos guardado en una variable de 8 bit ya que en pingüino no hay variables de 4 bit (al menos no lo he visto), es decir que si convirtiéramos los valores en ASCII 'F''F' (0xFF en Hexadecimal) de la manera antes mencionada quedarían 2 variables que se puede representar de esta manera en binario 0000 1111, para solucionar esto se debe simplemente multiplicar el primer valor por 16 lo cual hará que se desplace 4 bit a la izquierda y luego se le suma el otro valor, de esta forma(el 0x se usa para identificar el valor como un valor en hexadecimal):

0xF(binario 0000 1111)x16(00010000)=0xF0 (bin 1111 000) recuerde que esta multiplicación se hace en binario, no en hexadecimal. 0xF0 (bin 1111 000)+ 0xF(binario 0000 1111)= FF (bin 1111 1111)

Para convertir recomiendo 2 forma, la más sencilla es con una condicional SI:

If(valor<’A’) {	Resultado= valor-‘0’; } Else {	Resultado= valor-‘A’; }

Luego de pasar 2 valores por este condicional se termina con la siguiente formula:

Resultado=((valor1*16)+valor2);

De esta forma tenemos nuestra conversión de ASCII a Hexadecimal.

La otra manera es con una fórmula matemática. Explico antes, esta forma de trabajarlo lo descubrí yo, no sé si sea la mejor forma, pero es una solución que me convierte en una sola línea de código de ASCII a Hexadecimal.

Lo primero a explicar es que en pingüino si usamos esto “(int)” antes de una división el resultado de dicha división será en entero, así que (int)5/2 = 2 y no 2.5, de esta forma el programa omite el valor decimal. Sabiendo esto tenemos esta fórmula:

Resultado= ((valor-'0')+((((int)((((int)( valor-'0')/10)*2)/(((int)( valor-'0')/10)+1)))*(-7))));

Esto lo que hace es restar 48 al valor, así que todo desde ‘0’ hasta ‘9’ (las comillas simples representan el valor en ASCII) siempre me dará correcto, para los valores de ‘A’ hasta ‘F’ deben tener 7 números menos que las otras, así que para hacer esto se usa esta parte de la fórmula:

((((int)((((int)( valor-'0')/10)*2)/(((int)( valor-'0')/10)+1)))*(-7)))

Esta fórmula lo que hace es que mediante la división del (valor-‘0’) por 2 y el (valor-‘0’) entre 10 (por que buscamos si es igual o mayor a 10) +1, nos da el resultado de si es menor a 65, si es mayor o igual nos da 1 y si es mejor nos da 0, asi que si multiplicamos este resultado por -7, tendremos que solo cuando el resultado de esta fórmula sea 1 es que se restara, porque todo numero multiplicado por cero es cero(antes que se me olvide se multiplica por 2 al valor del dividendo y se le suma al valor del divisor, porque no se puede dividir entre 0, si hablamos de que el valor es ‘0’ - ‘0’ el resultado daría 0 y el programa deja de funcionar), ejemplo:

-- ‘A’=65 ‘0’=48 65 - 48=17 ((int) 17/10)x2=((int)1.7)x2 =(1)x2=2 ((int) 17/10)+1=((int)1.7)+1 =(1)+1=2 (int) 2/2=(int) 1=> 1 1 x (-7)=-7 -- ‘F’=70 ‘0’=48 70-48=22 ((int) 22/10)x2=((int)2.2)x2 =(2)x2=4 ((int) 22/10)+1=((int) 2.2)+1 =(2)+1=3 (int) 4/3=(int) 1.3 => 1 1 x (-7)=-7 -- Este es el caso de ser un valor que este entre ‘A’ y ‘F’, el otro caso sería de ser, entre ‘0’ y ‘9’, en este caso sería así: --

‘0’=48 48-48=0 ((int)0/10)x2=0 ((int)0/10)+1=1 (acá se ve por qué el +1, así no dará el error de dividir entre cero) 0/1=0 0 x (-7)=-0 -- ‘9’=57 57-48=9 ((int)9/10)x2=((int)0.9)x2 =(0)x2=0 ((int)9/10)+1=((int)0.9)+1 =(0)+1=1 0/1=0 0 x (-7)=-0 -- De esa forma se resuelve la diferencia que de 7 números, si es menor de 65 no se le resta nada y si es mayor o igual se le resta 7.

Después de usar esa línea de código con los valores solo hay que hacer le mismo proceso de multiplicar por 16 el primer valor y sumar con el segundo valor, aunque también pueden hacerlo en solo una línea de esta forma (aunque no se comprende muy bien):

Resultado=((((valor1-'0')+((((int)((((int)( valo1r-'0')/10)*2)/(((int)( valor1-'0')/10)+1)))*(-7))))*16 ) + ((valor2-'0')+((((int)((((int)( valor2-'0')/10)*2)/(((int)( valor2-'0')/10)+1)))*(-7)))));

Checksum
Checksum una suma de verificación, usada para verificar la integridad de una secuencia de datos transmitidos de un medio a otro, en nuestro caso estamos hablando de los datos que son emitidos desde el módulo RFID hacia nuestro pingüino, dichos datos están conformados por 5 pares de dígitos hexadecimal, por ejemplo 0x0C, 0x 00, 0x 93, 0x 55 y 0x 44 (0x0C00935544), recuerden que estos datos deben estar expresados en hexadecimal y no en ASCIII, por eso es importante la conversión que se hacer en la unidad de “Estructura de la salida de datos”, estos datos se suman en xor para obtener el checksum, el cual es comparado con el checksum que es enviado desde nuestro módulo RFID, si es el mismo los datos no han sufrido alteraciones, en caso contrario, se puede descartar dichos datos o tratar mediantes algoritmos reparar los datos.

Sumatoria: Para la sumatoria se debe recordar que esto se realiza en binario, de tal manera que los datos 0x0C, 0x 00, 0x 93, 0x 55 y 0x 44, deben ser visto de la siguiente manera 00001100, 00000000, 10010011, 01010101 y 01000100, estos serán sumado en xor, lo que quiere decir que se usara la tabla de la compuerta lógica  xor:

Por ejemplo: -- 0x0C=00001100 0x00=00000000 Sum=00001100 (sum es nuestras sumatoria) -- sum =00001100 0x93=10010011 sum=10011111 (nuevo sum) -- sum= 10011111 0x55=01010101 sum=11001010(nuevo sum) -- sum= 11001010 0x44=01000100 sum=10001110 (Checksum) --

Una forma de realizar esta suma en pingüino es mediante este el ^ ejemplo 11001010 ^ 01000100 =10001110

Circuito
Circuito básico para la prueba del modulo:

Prueba
Prueba 1 del modulo ID-12 (RFID) https://www.youtube.com/watch?v=qcDRj2Xx6ic