Interfacer un lecteur de cartes magnétiques SPI par USB

Interfacer un lecteur de cartes magnétiques SPI par USB

On nous a récemment demandé si il existait un module Yoctopuce qui permettait d'interfacer par USB un lecteur de cartes à piste magnétique OMRON de la gamme V3A. Bien que de nos jours ces pistes magnétique ne représente plus une méthode véritablement sûre pour identifier une personne, elles sont toujours présentes sur les cartes bancaires par exemple et nous nous y sommes donc intéressés.



Sur la piste magnétique elle-même, les données sont stockées à l'aide d'un codage Manchester différentiel: en gros, c'est un code qui contient des 0 et des 1 (les données) superposés avec des transitions à intervalle fixe (l'horloge) de sorte à pouvoir l'interpréter correctement même lorsque la vitesse de défilement de la carte dans le lecteur varie.

Le lecteur de cartes à piste magnétique OMRON se contente de lire le signal, et de séparer les données et le signal d'horloge sur deux sorties digitales distinctes. Cela donne un signal de ce type:

Signal émis par le lecteur de cartes magnétiques OMRON
Signal émis par le lecteur de cartes magnétiques OMRON


Ce genre de signaux correspond à ce que l'on appelle une liaison SPI (Serial Peripheral Interface), et pour le lire il faut donc utiliser un Yocto-SPI.

En plus de pouvoir décoder le signal SPI, le Yocto-SPI a l'avantage de fournir une source d'alimentation 5V ou 3.3V tirée du bus USB, qui nous permet d'alimenter le lecteur OMRON. Et cerise sur le gâteau, nous pourrons même utiliser les lignes de sortie non utilisées du Yocto-SPI pour piloter les LEDs du lecteur pour donner un feedback visuel.

Branchements


Voici le raccordement que nous proposons entre le Yocto-SPI et le lecteur OMRON:


 
Comment raccorder par USB un lecteur de cartes magnétiques OMRON (série V3A) à l'aide d'un Yocto-SPI



Comme le Yocto-SPI peut travailler de multiples manières, il faut le configurer correctement à l'aide du VirtualHub pour que la connection fonctionne:

  • activer la source d'alimentation 5V pour le lecteur de cartes
  • configurer le niveau électrique des signaux à 5V
  • choisir l'ordre d'arrivées des bits en lsb (bit de poids faible en premier)
  • activer l'utilisation d'une horloge externe (slave mode) plutôt que de génére une horloge à fréquence spécifiée.

Notez que ce dernier réglage n'est disponible que depuis le firmware 32351, qui vient de sortir (quelle coincidence...)

Configuration du Yocto-SPI avec horloge externe (SPI Slave)
Configuration du Yocto-SPI avec horloge externe (SPI Slave)


Si tous les branchements sont corrects, vous devriez maintenant voir des valeurs s'afficher dans la fenêtre de contrôle du VirtualHub lorsque vous passez une carte dans le lecteur.

Décodage


Il reste encore une tâche importante pour pouvoir exploiter les données retournées par le lecteur de carte: il faut les décoder. En effet, les valeurs brutes ne sont pas directement utilisables:

  • la polarité des bits est inversée
  • le flux de bits commence par un nombre non-déterminé de 0, donc les données utiles ne commencent pas forcément au début d'un octet
  • pour détecter les erreurs de lecture, entre chaque symbole (stocké sur 4 bits) se trouve un bit de parité qui doit être vérifié puis retiré du message pour que celui-ci soit compréhensible
  • à la fin du message, un code de vérification transversal sert à valider le message dans son entier
  • après le code de vérifications, un nombre non-déterminé de 0 suit les données utiles sans en faire partie

Nous vous épargnerons le détail des manipulations de bits à effectuer pour le décodage, mais vous pourrez retrouver le code source de notre petit programme d'exemple complet, écrit en C#, sur GitHub. La fonction qui effectue le décodage se trouve dans le fichier Form1.cs et s'intitule DecodeTrack2, puisque ce format spécifique à la Piste 2 définie par l'Association des Banques Américaines (ABA). Ce programme permet d'afficher le numéro d'une carte de crédit, sa date d'expiration et les informations annexes présente sur la bande magnétique par simple lecture de la piste 2:

Démonstration du décodage de la Piste 2 des cartes bancaires
Démonstration du décodage de la Piste 2 des cartes bancaires


Commenter 4 commentaires Retour au blog



1 - ixcys_fred Lundi 06 mai 2019 14H53

Hello,

Can you show us how to light up the Omron V3A red LED ?

2 - mvuilleu (Yocto-Team)Lundi 06 mai 2019 15H06

@ixcsys_fred: you can drive one of the two LEDs (the one you prefer) very easily through the SS line, with method spiport.set_SS().

If you need to drive both LEDs, it is a little bit more tricky: connect the LED to SDO line as done in the illustration above. You need then to send either 00 or FF to the reader: the SDO line will stay at the level of the last bit sent. However since the SPI port is normally in external clock mode (slave), you cannot send data until the user swipes a card. So to switch that second LED, you should change the spiport configuration master mode, send one byte, and revert to slave mode immediately afterward to be ready for the next swipe.

3 - ixcys_fred Jeudi 16 mai 2019 9H24

@mvuilleu thanks for your answer.

Can you tell me more about drive both LEDs or give a sample to how to use it ?

I don't understand what "OO" and "FF" are for ? It's to change SPI mode or to use the green light ?

How to change SPI mode in C# ?

Even with VirtualHub WebUI, I can't turn off the green LED in SPI card config.

Thanks you.

4 - martinm (Yocto-Team)Vendredi 17 mai 2019 9H14

@ixcys_fred : just contact Yoctopuce support directly.

Yoctopuce, get your stuff connected.