Sei sulla pagina 1di 6

El protocolo Wiegand Una visin general de qu es, para qu sirve y cmo se utiliza.

Prctica descripcin del protocolo que implementaron los lectores de tarjetas de Efecto Wiegand.

Primero y antes de empezar, es importante no confundir el Protocolo Wiegand con el Efecto Wiegand. El efecto Wiegand es un concepto fsico en el que intervienen las distintas formas de reaccionar magnticamente distintas reas de un hilo conductor ante la influencia de un campo magntico. (Para mas detalles consultar Wikipedia : Wiegand effect)

El caso es que en base a este Efecto Wiegand se construyeron cierto tipos de Tarjetas de Identificacin y sus correspondientes Lectores de Tarjetas de Proximidad para usarlos en Control de Accesos y/o Presencia. Dichos Lectores de Tarjetas deban conectarse a los dispositivos de Control de Acceso de algn modo (vase en este mismo foro Fundamentos de la Transmisin Sncrona) y en lugar de usar algn protocolo ya preestablecido se inventaron uno propio: El protocolo Wiegand, que es al que se refiere este artculo.

Como todo protocolo de comunicaciones el Wiegand consta de dos partes fundamentales: Aquella que describe el modo en que fsicamente se transmite la informacin digital y la forma de interpretar numricamente dicha informacin.

Probablemente debido a mis propias limitaciones y/o desconocimiento no sera capaz de deciros si el protocolo Wiegand es un protocolo serie Sncrono o Asncrono ya que es fundamentalmente distinto a los que conozco de estos dos tipos anteriores: El ABA Track 2 como ejemplo de Sncrono o el RS-232 del Asncrono. En cualquier caso os describo como funciona y ustedes mismos decids.

Sistema de transmisin:

La transmisin de datos Wiegand usa tres hilos. La lnea para enviar los unos lgicos o DATA1, la lnea para hacer lo propio con los ceros lgicos o DATA0 y la lnea de masa de referencia de ambos o GND. Los niveles que se usan son Bajo, a nivel de GND, o Alto a +5V o VCC.

En estado de reposo, o sea: sin transmitir, la lnea de GND es exactamente lo que es GND y siempre est en bajo y ya no nos referiremos ms a ella, y las lneas DATA1 y DATA0 estn en alto, a nivel de +5V VCC.

Para transmitir un Bit 1 lo que se hace es mandar un pulso a Bajo, normalmente de 50 uS (microsegundos) de duracin, por la lnea DATA1, mientras DATA0 permanece en Alto.

Para transmitir un Bit 0 lo que se hace por el contrario es mandar un pulso a Bajo, tambin de la misma duracin 50 uS (microsegundos), por la lnea DATA0, mientras ahora es DATA1 la que permanece en Alto.

Normalmente la separacin entre cada pulso y el siguiente es de unos 2 mS (milisegundos).

Como podis ver, y a diferencia de los protocolos mencionados anteriormente, los dos tipos de Bits, ceros y unos, son transmitidos de forma idntica aunque por lneas distintas. En el cronograma siguiente vemos una representacin grfica de este sistema de transmisin:

En este ejemplo vemos cmo se transmitira la secuencia de bits 1010.

Y hasta aqu todo lo referente a la primera parte a la que nos referimos mas arriba como el modo en que fsicamente se transmite la informacin digital.

Interpretacin de los Datos:

Mediante el sistema descrito anteriormente se puede transmitir cualquier nmero de bits que queramos, sin embargo hay un cierto consenso en ciertos nmeros de bits: 26, el ms utilizado, 32, 44 128. Y la interpretacin de los mismos, salvo el de 26 bits, es tan diversa como fabricantes lo utilizan.

Como hemos dicho el Wiegand 26 es el formato de trama mas utilizado con diferencia y su interpretacin es como sigue:

- El primer Bit, B0, es la Paridad Par de los primeros 12 bits transmitidos (B1:12). - Los 8 siguientes, B1:B8 son un Byte, un Entero de 8 bits, al que llaman Facility Code. - Los 16 siguientes: B9:B24 son dos Bytes, un Entero de 16 Bits, al que llaman User Code - El ltimo bit, B25, es la Paridad Impar de los ltimos 12 bits transmitidos (B13:24).

Curioso verdad? Aqu podis ver una tpica interpretacin de un cdigo Wiegand 26:

Este ejemplo constituye el Facility Code + User Code 4-24610, la paridad E es 1 para hacer Par la secuencia de 00000100011 que tiene tres unos y la paridad O es tambin 1 para hacer impar la secuencia 0000000100010 que slo tiene dos unos.

Los dems tipos de Wiegand's tienen interpretaciones distintas, as el Wiegand 32 no lleva paridad y tanto el Facility Code como el User Code son dos nmeros enteros de 16 bits. El Wiegand 44 es mas simptico an si cabe, los 8 primeros bits son el Facility Code, los 32 siguientes son el User Code y los 4 ltimos son el OR EXCLUSIVO de los 40 bits anteriores tomados de 4 en 4. Sorprendente pero cierto.

Programa que recoge e interpreta un Wiegand 26 y lo vuelca sobre el canal serie: Cdigo

GeSHi (cpp): 1. // reader_wiegand26 2. //


3. // hardware MAHSA GP-20 Proximity cards

4. //
5. // red

-> vcc

-> +12V

6. // green -> data0 -> rb0 -> con-ml-10 -> 6 7. // white -> data1 -> rb1 -> con-ml-10 -> 4
8. // black -> gnd

-> gnd -> con-ml-10 -> 2

9. 10.
11. #include <18f4550.h>

12.#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOL VP,NOCPD,NODEBUG,NOWRT,NOVREGEN


13. #use delay(clock=20000000) 14. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

15.
16. #include <string.h>

17. 18.#bit PIN_DATA0 = 0xF81.0 19.#bit PIN_DATA1 = 0xF81.1 20.


21. const int CodeBits = 26;

22.
23. int1 first_exp=0; 24. int1 read_complete=0; 25. int nextbit=0; 26. char Code[CodeBits+1]; 27. int FacilityCode;

28. long IdCardCode;

29.
30. char bits[5]={0x01,0x02,0x04,0x08,0x10}; 31. int i;

32. 33. 34.// INTERRUPCION por EXT0 Data0 -----------------------------------------------35.


36. #int_ext 37. ext_handler() {

38.
39. 40. 41. 42.

if(first_exp==1){ Code[nextbit]='0'; if(++nextbit==CodeBits){ read_complete=1; } } first_exp=1;

43. 44.
45.

46.} 47. 48.// INTERRUPCION por EXT1 Data1 -----------------------------------------------49. 50.#int_ext1 51.ext1_handler() { 52.
53. 54. 55. 56.

if(first_exp==1){ Code[nextbit]='1'; if(++nextbit==CodeBits){ read_complete=1; } } first_exp=1;

57. 58.
59.

60.} 61.
62. void limpia_data(void){

63.
64. 65.

for(i=0;i<CodeBits+1;i++) Code[i]=0x00; nextbit=0;

66.} 67.
68. void ajusta_code(void){

69.
70. 71. 72. 73. 74. 75. 76.

// Finaliza Code Code[CodeBits]=0x00; // Facility Code FacilityCode=0x00; for(i=1;i<9;i++){ if(Code[i]=='1'){ FacilityCode=FacilityCode+bits[i-1]; } } // Id Card Code IdCardCode=0x00; for(i=9;i<CodeBits;i++){ if(Code[i]=='1'){ IdCardCode=IdCardCode+bits[i-9]; } }

77. 78.
79. 80. 81. 82. 83.

84. 85. 86.} 87.

88. void main() {

89.
90. 91. 92.

disable_interrupts(global); set_tris_b(0b00000111); printf("Wiegand26 Reader listen\r\n\n");

93.

94. 95. 96. 97.

limpia_data(); ext_int_edge(0,L_TO_H); ext_int_edge(1,L_TO_H); first_exp=0; enable_interrupts(int_ext); enable_interrupts(int_ext1); enable_interrupts(global); do{ if(read_complete==1){ read_complete=0; disable_interrupts(global); ajusta_code();

98.
99. 100. 101.

102.
103. 104. 105. 106. 107. 108. 109. 110.

printf("Facility Code = %u IdCardCode = %lu\r\n\n",FacilityCode,IdCardCode); limpia_data(); enable_interrupts(global); } } while (TRUE);

111.
112.

113.} 114.

Potrebbero piacerti anche