Nous ne vendons pas de lecteur RFID pour l'instant, car nous n'avons pas trouvé à ce jour de module RFID à intégrer compatible avec nos exigences de qualité et notre gamme de prix. Mais de temps à autres, nous essayons les produits que nous trouvons sur le marché pour voir ce qu'ils valent, et si ils peuvent être utilisés à l'aide de modules Yoctopuce. C'est ce que nous avons fait cette semaine avec le lecteur RFID ID01 UHF, vendu par DFRobot.
Les produits DFRobot, ciblant en général un prix de vente au plancher, ne visent pas le même public que nous, qui recherchons en priorité la qualité. Mais ce lecteur avait retenu notre attention du fait qu'il utilisait une interface RS485, semblait offrir un boîtier robuste et était vendu à un prix qui pouvait permettre d'espérer une qualité correcte.
Le lecteur RFID UHF ID01
Raccordement
Ce lecteur a besoin d'une alimentation 7V / 2A. Ce n'est pas très courant, mais cela se trouve. Pour la communication, nous avons opté pour la version RS485, en pariant sur le fait que si DFRobot avait fait une version RS485, il y avait des chances pour que ce soit pour un client sérieux. La documentation du ID01 utilise la terminologie A/B pour les fils de communication, malheureusement ambiguë. Sachez donc que le fil jaune correspond à TX-/RX-, tandis que le fil vert correspond à TX+/RX+. Voici donc comment raccorder le lecteur à un Yocto-RS485-V2
Raccordement du lecteur RFID UHF ID01 au Yocto-RS485-V2
Communication avec le lecteur
La communication se fait par un protocole binaire propriétaire. En fouillant la documentation PDF et avec quelques essais, nous avons pu déterminer comment faire marcher les fonctions de bases du lecteur à l'aide d'un Yocto-RS485-V2, et écrire une petite librairie Python permettant de l'utiliser facilement depuis un PC. Vous trouverez cette librairie sur GitHub. Nous n'avons pas fait un package PyPI pour cette mini librairie, copiez simplement le fichier ID01.py dans votre projet. Par contre celui-ci utilise la librairie yoctopuce pour communiquer avec le Yocto-RS485-V2, et vous devrez donc l'installer avec PyPI dans votre projet. Voici comment l'utiliser:
Initialisation
A l'instanciation de la librairie, vous indiquez si votre interface RS485 est branchée par USB ou accessible à travers le réseau à une adresse IP donnée (via un YoctoHub-Ethernet par exemple, ou sur une machine distante avec le logiciel VirtualHub).
rfidReader = ID01("usb")
Connexion
La connexion avec l'interface se fait au moment où vous appelez la méthode connect(). La librairie recherche une interface RS485 portant le nom logique ID01_RFID.
if status != "OK":
sys.exit(status)
Si l'interface RS485 n'est pas trouvée, la fonction connect() retourne un message d'erreur explicite.
Vérification de la version du lecteur
Comme on soupçonne que toutes les versions du lecteur DFRobot ne fonctionnent pas de la même manière, on a implémenté la fonction permettant de savoir la version du logiciel tournant sur le lecteur. La version sur laquelle nous avons testé notre code s'annonce comme version "06.50".
Lecture d'un tag RFID
L'identifiant des tags RFID fournis avec le lecteur correspond à 12 octets (6 mots de 16 bits). On peut les obtenir à l'aide de la méthode requestTagIdentification(), qui retourne une liste de 6 valeurs entre 0 et 65535 compris si un tag est détecté, ou une liste vide autrement.
if len(tag) != 0:
print("Tag detected: ", tag)
Changement de l'identifiant d'un tag RFID
L'identifiant des tags est dans une zone de données modifiables du tag, appelée "EPC", à l'adresse 2. Nous avons aussi implémenté la méthode permettant d'écrire des données sur le tag RFID, notamment pour modifier cet identifiant.
ID_ADDR = 2
NEW_IDENT = [1,2,3,4,5,6]
status = rfidReader.writeWordsToTag(EPC_BANK, ID_ADDR, NEW_IDENT)
if status != "OK":
print("Error: "+status)
Lecture/écriture de données dans la zone "User"
Une autre zone de données en lecture/écriture est aussi disponible, de taille variable selon les tags. Vous pouvez écrire et relire cette zone avec les méthodes suivantes (8 mots à la fois au maximum):
data = rfidReader.readWordsFromTag(USER_BANK, 0, 8)
for i in range(8):
data[i] += 1
status = rfidReader.writeWordsToTag(USER_BANK, 0, data)
if status != "OK":
print("Error: "+status)
Outils de diagnostique
Pour tester la détection de vos tags RFID, le lecteur est doté d'une fonction permettant de lire continuellement les tags à proximité, et de signaler par un bip la détection d'un tag. Vous pouvez utiliser les méthodes suivantes pour contrôler ce comportement:
status = rfidReader.setReaderBuzzer(1) # 1=ON, 0=OFF
status = rfidReader.stopContinuousReading()
Doléances
Les fonctions ci-dessus ne sont destinées à fonctionner que lorsqu'un seul tag est à proximité du lecteur à la fois. La documentation de DFRobot mentionne certaines fonctions utilisables en mode "multi-tag", mais elle est trop laconique pour que nous puissions en faire quelque chose dans le temps imparti pour ce projet. Pour être franc, la documentation de ce lecteur RFID, rédigée dans idiome anglais-chinois, est largement insuffisante. Les explications des champs sont du type "Command Code is a command code domain", "Command Data is the parameter domain of command frame", et la documentation ne spécifie même pas les bases comme l'algorithme utilisé pour le checksum des paquets. L'exemple de code, pour Arduino, ne montre que l'envoi de quelques commandes prédéfinies, sans démontrer la lecture de tags RFID. On se consolera en se disant que grâce à cela vous aurez peut-être envie d'utiliser notre librairie et nos modules plutôt que de vous casser la tête sur cette documentation :-)
Conclusion
Le Yocto-RS485-V2 nous a permis de mettre en oeuvre rapidement ce lecteur RFID assez bon marché malgré sa piètre documentation. Au final, la solution permet d'écrire des données personnalisées sur des tags RFID UHF à quelques dizaines de centimètres, ce qui n'est pas mal pour un produit de ce prix. Mais la qualité de la documentation limite sérieusement le potentiel de ce lecteur. C'est dommage.
Par curiosité, nous avons en fin de ce travail ouvert la boîte DFRobot pour voir si nous arrivions à trouver quel était le module RFID utilisé par DFRobot, afin de rechercher par nous-même un peu plus de documentation. Le module en question ne porte pas la moindre inscription, mais une recherche rapide sur Alibaba nous a permis de deviner qu'il s'agit du module Jietong JT-2850. Avec ce mot-clé, on retrouve sur GitHub une documentation très similaire à celle fournie par DFRobot, mais avec plusieurs pages en plus, qui incluent la méthode de calcul du checksum et la table des paramètres configurables dans l'EEPROM, dont celui qui permet d'activer le mode "multi-tag". Donc non seulement DFRobot s'est contenté de copier-coller la documentation du fabricant sans chercher à la rendre plus lisible, mais des parties importantes ont été omises...