Parmi les demandes que nous avons reçues ces dernières semaines, l'une a particulièrement retenu notre attention: comment interfacer par USB un lecteur de cartes RFID au standard Wiegand à l'aide de modules Yoctopuce. C'est intéressant car les lecteurs Wiegand sont très répandus pour les systèmes de contrôle d'accès, et on en trouve facilement de très bon marché sur le net. Le bonne nouvelle, c'est que nous avons désormais une solution, à l'aide d'un simple Yocto-Serial.
L'interface Wiegand
Le but d'une interface Wiegand est de transmettre à distance, par exemple depuis une porte de contrôle d'accès, l'identité d'une personne qui présente son badge RFID. A chaque présentation d'un badge, un message est transmis et l'ordinateur de contrôle peut décider d'ouvrir ou non la porte en fonction de l'identifiant reçu.
Un lecteur RFID avec interface Wiegand acheté pour 16$
Une interface Wiegand ne nécessite que trois fils: la terre et deux lignes de données, appelées D0 et D1. Les données y sont transmises suffisamment lentement pour pouvoir utiliser des longs câbles sans se poser trop de questions. Un message Wiegand n'est rien d'autre que le numéro de la carte d'accès, formé en général de 24 bits (16 millions de possibilités) + deux bits de parité pour détecter des éventuelles erreurs de transmission.
Naturellement, il faut aussi fournir de l'énergie au lecteur RFID pour qu'il puisse fonctionner. Le plus fréquent est qu'il dispose d'une alimentation propre, là où il est installé. Cette alimentation doit nécessairement être isolée, pour pouvoir mettre la terre en commun avec l'ordinateur qui lira les données:
Lecteur RFID Wiegand avec une alimentation propre
L'autre possibilité, lorsque le lecteur ne consomme que peu de courant, est de l'alimenter directement par l'interface USB du PC:
Lecteur RFID Wiegand alimenté depuis l'interface USB
Branchements et configuration
Pour des raisons techniques, et bien que cela puisse sembler un peu illogique, les lignes de données Wiegand D0 et D1 doivent être connectées sur les entrées de Yocto-Serial intitulées TD et RTS:
Branchement d'un lecteur Wiegand au Yocto-Serial
Pour la configuration du Yocto-Serial, assurez-vous d'utiliser un firmware récent, qui inclut le support Wiegand. Si vous avez choisi d'alimenter le lecteur Wiegand via l'USB, vous devrez activer la sortie 5V dans la configuration du module:
Configuration du Yocto-Serial pour activer la sortie 5V
Pour la configuration de la communication, vous avez deux possibilités de configuration, selon le décodage des messages souhaité. Pour recevoir les messages Wiegand en ASCII, tels quels, sous forme d'une chaîne de '0' et de '1' , utilisez la configuration suivante:
Configuration du Yocto-Serial pour recevoir les messages Wiegand en ASCII
Si vous présentez un badge et que vous appelez la méthode serial.get_lastMessage(), vous obtiendrez par exemple:
01101011001111011101110101
Cette forme très simple vous permettra de déterminer le nombre de bits utilisés par votre lecteur Wiegand, au cas où il n'utiliserait pas le format 26 bits le plus standard.
Si vous préférez une version plus efficace, vous pouvez demander au module de décoder les bits reçus en octets, qui pourront alors être interprétés plus facilement par un job sur le Yocto-Serial ou par votre code. Mais pour que le décodage en octet soit correct, il faut donner une information de plus: le nombre de bits de parités qui précèdent le message, et doivent donc être décodés dans un octet à part. Dans le cas des messages Wiegand à 26 bits, il y a un bit de parité à gauche, mais dans certaines variantes, il peut y en avoir plus. Vous trouverez le cas échéant cette information dans le manuel de votre lecteur Wiegand. Voici donc la configuration à appliquer pour un décodage des messages Wiegand 26 bits:
Configuration du Yocto-Serial pour recevoir les messages Wiegand décodés
Si vous présentez un badge et que vous appelez la méthode serial.get_lastMessage(), vous obtiendrez alors:
00D67BBA80
Le premier octet 00 contient uniquement le premier bit de parité. L'octet suivant D6 est le code de site (facility code), les deux octets suivants 7BBA représentent l'identifiant de l'utilisateur (cardholder ID), et le dernier octet 80 contient le bit de parité final. Si vous avez acheté des tags RFID en vrac avec un lecteur à 20$, vous attendez-vous à ce que vos tags aient des codes de site et des identifiants plus ou moins aléatoires, mais avec un peu de chance tous différents.