Autor Tema: El Protocolo Wiegand explicado.  (Leído 44470 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
El Protocolo Wiegand explicado.
« en: 14 de Diciembre de 2007, 21:01:10 »
El protocolo Wiegand
Una visión general de qué es, para qué sirve y cómo se utiliza. Práctica descripción 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 físico en el que intervienen las distintas formas de reaccionar magnéticamente distintas áreas de un hilo conductor ante la influencia de un campo magnético. (Para mas detalles consultar Wikipedia : Wiegand effect)

El caso es que en base a este Efecto Wiegand se construyeron cierto tipos de Tarjetas de Identificación y sus correspondientes Lectores de Tarjetas de Proximidad para usarlos en Control de Accesos y/o Presencia. Dichos Lectores de Tarjetas debían conectarse a los dispositivos de Control de Acceso de algún modo (véase en este mismo foro Fundamentos de la Transmisión Síncrona) y en lugar de usar algún protocolo ya preestablecido se inventaron uno propio: El protocolo Wiegand, que es al que se refiere este artículo.
 
Como todo protocolo de comunicaciones el Wiegand consta de dos partes fundamentales: Aquella que describe el modo en que físicamente se transmite la información digital y la forma de interpretar numéricamente dicha información.
 
Probablemente debido a mis propias limitaciones y/o desconocimiento no sería capaz de deciros si el protocolo Wiegand es un protocolo serie Síncrono o Asíncrono ya que es fundamentalmente distinto a los que conozco de estos dos tipos anteriores: El ABA Track 2 como ejemplo de Síncrono o el RS-232 del Asíncrono. En cualquier caso os describo como funciona y ustedes mismos decidís.
 
Sistema de transmisión:
 
La transmisión de datos Wiegand usa tres hilos. La línea para enviar los unos lógicos o DATA1, la línea para hacer lo propio con los ceros lógicos o DATA0 y la línea 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 línea de GND es exactamente lo que es GND y siempre está en bajo y ya no nos referiremos más a ella, y las líneas DATA1 y DATA0 están 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 duración, por la línea DATA1, mientras DATA0 permanece en Alto.
 
Para transmitir un Bit 0 lo que se hace por el contrario es mandar un pulso a Bajo, también de la misma duración 50 uS (microsegundos), por la línea DATA0, mientras ahora es DATA1 la que permanece en Alto.
 
Normalmente la separación entre cada pulso y el siguiente es de unos 2 mS (milisegundos).
 
Como podéis ver, y a diferencia de los protocolos mencionados anteriormente, los dos tipos de Bits, ceros y unos, son transmitidos de forma idéntica aunque por líneas distintas. En el cronograma siguiente vemos una representación gráfica de este sistema de transmisión:



En este ejemplo vemos cómo se transmitiría 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 físicamente se transmite la información digital.
 
Interpretación de los Datos:
 
Mediante el sistema descrito anteriormente se puede transmitir cualquier número de bits que queramos, sin embargo hay un cierto consenso en ciertos números de bits: 26, el más utilizado, 32, 44 ó 128. Y la interpretación 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 interpretación 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í podéis ver una típica interpretación de un código 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 también 1 para hacer impar la secuencia 0000000100010 que sólo tiene dos unos.
 
Los demás 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 números enteros de 16 bits. El Wiegand 44 es mas simpático aún 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:

Código: C++
  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,NOLVP,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.   if(first_exp==1){
  40.     Code[nextbit]='0';
  41.     if(++nextbit==CodeBits){
  42.       read_complete=1;
  43.     }
  44.   }
  45.   first_exp=1;
  46. }
  47.  
  48. // INTERRUPCION por EXT1 Data1 ------------------------------------------------
  49.  
  50. #int_ext1
  51. ext1_handler() {
  52.  
  53.   if(first_exp==1){
  54.     Code[nextbit]='1';
  55.     if(++nextbit==CodeBits){
  56.       read_complete=1;
  57.     }
  58.   }
  59.   first_exp=1;
  60. }
  61.  
  62. void limpia_data(void){
  63.  
  64.   for(i=0;i<CodeBits+1;i++) Code[i]=0x00;
  65.   nextbit=0;
  66. }
  67.  
  68. void ajusta_code(void){
  69.  
  70.   // Finaliza Code
  71.   Code[CodeBits]=0x00;
  72.   // Facility Code
  73.   FacilityCode=0x00;
  74.   for(i=1;i<9;i++){
  75.     if(Code[i]=='1'){
  76.       FacilityCode=FacilityCode+bits[i-1];
  77.     }
  78.   }
  79.   // Id Card Code
  80.   IdCardCode=0x00;
  81.   for(i=9;i<CodeBits;i++){
  82.     if(Code[i]=='1'){
  83.       IdCardCode=IdCardCode+bits[i-9];
  84.     }
  85.   }
  86. }
  87.  
  88. void main() {
  89.  
  90.   disable_interrupts(global);
  91.   set_tris_b(0b00000111);
  92.   printf("Wiegand26 Reader listen\r\n\n");
  93.  
  94.   limpia_data();
  95.   ext_int_edge(0,L_TO_H);
  96.   ext_int_edge(1,L_TO_H);
  97.   first_exp=0;
  98.  
  99.   enable_interrupts(int_ext);
  100.   enable_interrupts(int_ext1);
  101.   enable_interrupts(global);
  102.  
  103.   do{
  104.     if(read_complete==1){
  105.       read_complete=0;
  106.       disable_interrupts(global);
  107.       ajusta_code();
  108.       printf("Facility Code = %u IdCardCode = %lu\r\n\n",FacilityCode,IdCardCode);
  109.       limpia_data();
  110.       enable_interrupts(global);
  111.     }
  112.   } while (TRUE);
  113. }
  114.  

Ea, y eso es todo por hoy. Mañana más.  :mrgreen:
« Última modificación: 15 de Diciembre de 2007, 06:06:12 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 17506
    • MicroPIC
Re: El Protocolo Wiegand explicado.
« Respuesta #1 en: 15 de Diciembre de 2007, 05:33:32 »
Ciertamente sería difícil de catalogarlo en síncrono o asíncrono, tiene características de ambos.
Es curioso.
Un saludo desde Sevilla, España.
Visita MicroPIC                                                                                        ɔ!doɹɔ!ɯ ɐʇ!s!ʌ

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5416
    • Picmania by Redraven
Re: El Protocolo Wiegand explicado.
« Respuesta #2 en: 15 de Diciembre de 2007, 06:10:22 »
Imagino que no puede ser ninguno de los dos ya que no es Síncrono porque no tiene una línea de Clock o Strobe y no es Asíncrono porque no tiene unos tiempos estipulados para representar los bits, que creo que son las características básicas para definir la Sincronitud o Asincronitud de una transmisión.  :shock:

Es curioso notar que esos 50 uS por pulso y 2 mS de separación entre ellos es solo una convención, no una exigencia ya que pulsos mas o menos largos y separaciones distintas generan un Wiegand tan Wiegand como cualquiera de los otros. En una transmisión Asíncrona a 9600 cada bit es de 104 uS o no es una transmisión asíncrona a 9600.

Lo único que comparte con el sistema Síncrono es que la velocidad de transmisión es exactamente la máxima a la que puedas detectar un pulso, su flanco de caída, y que te dé tiempo a registrarlo.  :mrgreen:

« Última modificación: 15 de Diciembre de 2007, 06:13:50 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Hexapic

  • PIC10
  • *
  • Mensajes: 18
Re: El Protocolo Wiegand explicado.
« Respuesta #3 en: 30 de Julio de 2009, 04:39:00 »
Creo que ese codigo no funciona...
Si cambias de bits a bytes (8 bits) o a un doble byte (16 bits) y tu variable de conversion es char bits[5]={0x01,0x02,0x04,0x08,0x10}; para multiplicar cada bit que detectas en la posición que afecta del byte, no convertira mas que hasta 5 bits.

Tal vez cambiando la linea

76.       FacilityCode=FacilityCode+bits[i-1];        --------------->   FacilityCode=FacilityCode+(2^[i-1]);
.
.
.
83.       IdCardCode=IdCardCode+bits[i-9];       --------------->   IdCardCode=IdCardCode+(2^[i-9]);

Es decir elevar a 2 ----> 2^variable contador podria funcionar

Desconectado psicowifi

  • PIC12
  • **
  • Mensajes: 56
Re: El Protocolo Wiegand explicado.
« Respuesta #4 en: 28 de Mayo de 2010, 23:02:47 »
ciertamente el codigo original no funciona...
tube la oportunidad de hacer un test con ese codigo y un lector de tarjeta y pues qque creen no lee bien los codigos los repite todos los codigos de diferentes tarjetas las pone igual no identifica nada...

el codigo que propones la modificacion de elevar a dos da error de compilacion  no se por que ya que no entiendo ccs seria bueno si alguien aclara la duda por que el error de compilacion
saludos
« Última modificación: 28 de Mayo de 2010, 23:35:15 por psicowifi »

Desconectado Menta

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 605
Re: El Protocolo Wiegand explicado.
« Respuesta #5 en: 29 de Mayo de 2010, 04:37:30 »
Me parece evidente que es un código Asíncrono, ya que no hay clock que fije los tiempos. Y todo sistema que no es síncrono es asíncrono.
Comparando con un rs232, en ambos sistemas no está estipulada la duración de los pulsos ni la longitud de la trama...
En rs-232 debemos definir el baud rate y el número de bits por palabra de transmisión y la trama queda inequívocamente armada, bueno, aquí es distinto, ya que se usan 2 líneas, lo que dan 4 combinaciones posibles para transmitir datos bit a bit, sobrando 2 estados que son líneas a alto que sería ningún dato, es decir la transferencia detenida (aquí sería super asíncrono, pues puedo mandar media trama, esperar un tiempo y volver a transmitir el resto de la trama) y por último un cuarto estado que sería todo a masa, que podría usarse para detectar fallas.
     

Desconectado psicowifi

  • PIC12
  • **
  • Mensajes: 56
Re: El Protocolo Wiegand explicado.
« Respuesta #6 en: 29 de Mayo de 2010, 22:15:17 »
bueno ya efectue los test con el programa original y no funciono da problemas de lectura siempre da el mismo codigo con cualquier tarjeta que le pase tanto en el codigo de identificacion de zona como en el codigo de la identificacion de la tarjeta o sea no identifica los diferentes codigos nooooose por que e intentado ver el codigo de ccs y no lo logro nio entender jaja y si se le efectua la modificacion que proponen pues simplemente da error en la compilacion...
si alguien sabe cual es la solucion y la pude postear o consigue el error en el codigo fuente
saludossss..