Lecteur de puce d'animaux domestiques

Lecteur RFID 134,2 KHz pour transpondeurs d'animaux

Reader rfid134khz vue

          Un chat fait, de votre canapé, son domicile, à votre place, vous le maître de maison ! Comment savoir si ce n'est pas l'espion aux pattes de velours envoyé par le KGB ou si c'est le chat des voisins qui trouve la pitance plus à son goût chez vous qu'à la maison ? Ce lecteur RFID  nous dit si l'animal est pucé, de quel pays il vient, et nous donne le code du transpondeur pour retrouver son enregistrement dans le fichier national I-Cad . 

          L'utilisation reste très simple. Après la mise en marche et les écrans d'accueil et de présentation, le rétro-éclairage s'éteint. Il suffit juste d'approcher  la face inférieure du boîtier vers les épaules ou le cou de l'animal, en effectuant un balayage à quelques centimètres .  Si l'écran se rallume, le compagnon poilu est identifié suite à la pose d'un transpondeur. Et si tout s'est bien passé, la partie haute de l'écran donne le pays dans lequel la puce a été posée (250 pour la France ) avec "Msg ok " si le message est complet . La ligne inférieure affiche une série de 11 ou 12 chiffres, qui sont respectivement  1 ou 2 pour le code de l'espèce animal, 2 autres pour celui du fabricant, et 8 pour le numéro unique d'identification . Au cas où il y a relecture et redondance, un message de débordement : "Msg trop long " ou en cas de message incomplet : "Msg non OK", seront signalés !  Dans ce cas, il faut couper l'appareil 5" et recommencer la lecture .Reader rfid134khz ok

 

Quel est le principe de ce transpondeur :

           Un tag, badge ou puce RFID (Radio Frequency Identification) est totalement inerte, sans source de tension, jusqu'à ce qu'on lui approche une bobine (antenne), soumise à un courant alternatif haute fréquence qui va provoquer une induction, par couplage magnétique, et qui deviendra source d'alimentation pour le tag ... Etant alimenté, redressé, un condensateur stocke et filtre le courant, qui va alimenter une mémoire PROM où la clé numérique est burinée à la fabrication, sous 13 bytes en hexadécimal contenant les octets de début et fin de trame, et les données énoncées ci-dessus, avec le byte de checksum (vérification du message) puis les envoyer en transmission série sous 9600 bauds par une modulation HF (ici à 134,2 KHz ), qui vont être reçues par le lecteur EM4305-LF, toujours par effet inductif, puis décodées par le logiciel, et la partie utile sera affichée sur l'écran LCD !Em4305 lf

          Les données techniques du circuit EM4305-LF : Tension 5 VDC, 50 mA, Fréquence de travail 134,2 KHz, Type:ISO 11784/85, Format:FDX-B, Distance de travail < 4 cm. 

Par exemple :

  • les données du tag  reçues sont 03 84 12 DB FA E7 D5
  • l'identification hexadécimale du pays: 03 84 (décimale = 900)
  • l'identification hexadécimale Nationale: 12 DB FA E7 D5 (81 000 064 981 )
  • alors que le message entier reçu est  AA 0F 08 00 03 84 12 DB FA E7 D5 81 BB
  • le code de départ : AA
  • Le code de fin : BB
  • Le byte de contrôle (checksum ): 81 par calcul de OU EXCLUSIF : 0F(XOR)08(XOR)00(XOR)03(XOR) 84(XOR)12(XOR)DB(XOR) FA(XOR)E7(XOR)D5=81

Voilà qui est bien dégrossi, passons au schéma !

LE SCHEMA:

Reader rfid134khz sch

          Après avoir reçu la trame de 13 bytes comme décrit plus haut, il faut la traiter, la débarrasser des octets que l'on ne sert pas et afficher ceux que l'on attend . C'est donc à un ATMega328 P et un afficheur LCD 2lignes 16 caractères que j'ai confié ces tâches. L'alimentation est fournie par une pile à pression de 9 volts, via le connecteur X1-1 X1-2, coupée par un interrupteur de mise en, et hors service (Non représenté sur le schéma). L'ensemble des circuits fonctionnant sous 5 volts, un régulateur 7805 -TO220 (IC2) va se charger d'abaisser et de réguler cette tension, avec ses condensateurs de stabilisation de 0,22µF et 0,1µF (C4-C3). L'horloge du microcontrôleur est cadencée par un quartz de 16 MHz (Q1), tiré par deux petites capas de 22pF (C1-C2). La pin "reset" est tenue à l'état haut par une résistance de 100K, car non utilisée. Un seul reset à la mise sous tension (POR Power On Reset ) est suffisant . Une seule pin est utilisée en entrée sur le micro, DATA (PD6) où arrivent les informations TxD du EM4305-LF, toutes les autres sont en sortie pour piloter l'afficheur sous 4 bits (D4-D7). La validation des données du display est confiée à la pin Enable (E), et la sélection instructions / caractères à la pin RS. Le contraste est réglé par l'application d'une tension potentiométrique sur le VO, via l'ajustable de 10K ( R3). Le rétro éclairage de l'écran, utilisé pour s'allumer sur les écrans d'accueil et de présentation, va également s'allumer si une puce RFID est détectée. La commande se fait par la sortie LED (PC0) qui est appliquée en saturation sur la base d'un transistor BC547 (T1), dont le courant est limité par une résistance de 10K (R5). A travers ce montage et la résistance de limitation de charge de 100R (R4), on donne du GND (0V) aux cathodes des leds de rétroéclairage. Voilà, tout simple le schéma , le reste étant un tripatouillage de bits et d'octets fait par le logiciel . 

Le circuit imprimé qui relie les composants:

          Le circuit est dessiné avec la version gratuite de Eagle Cadsoft, pour être gravé selon le procédé habituel à portée de l'amateur ou traité par une société professionnelle. Pour faire un circuit simple face, j'ai dû organiser les déclarations d'entrées / sorties de l'ATMega328. Il ne reste qu'un seul strap pour équipotentialiser le plan de masse sans être obligé d'en augmenter les dimensions . Sur la photo, côté composant, des barrettes sécables permettent d'enficher l'afficheur LCD et le circuit récepteur EM4305-LF. Le microcontrôleur est monté sur des cosses tulipes, car la programmation impose que certaines pattes soient libres de tout potentiel et de toutes charges résistives. Et comme ça ne fonctionne jamais du premier coup, l'expérience impose la méfiance ... Tous les composants sont de type 'traversant', donc il faut un peu de rigueur au perçage des diamètres 1mm. Le trou du radiateur du régulateur intégré et l'afficheur sont percés à 3,2mm pour la fixation mécanique .

Reader rfid134khz pcb

 

La mise en boîte :

          Encore une fois, c'est l'imprimante 3D qui s'y attèle.  Quatre pièces à réaliser avec DesignSpark Mechanical et converties en fichiers STL. Le fond qui supporte tous les éléments, avec une partie avant aux dimensions de l'antenne, et l'arrière moins large pour être tenue à la main, avec le circuit et la pile 9 volts, calés dedans. Un portillon est aménagé pour le remplacement de celle-ci, sans à avoir à ouvrir les deux demies coques. La bobine est placée au fond et maintenue avec une feuille isolante rigide, collée avec double face épais. L'interrupteur marche/arrêt est vissé dans un trou prévu pour ça, avant de fermer la boîte avec la partie supérieure ... L'afficheur se retrouve ainsi affleurant la surface du capot. Un enjoliveur cache misère réduit l'ouverture aux contours de l'écran. Les parties s'emboitent l'une dans l'autre et quelque points de colle douce ou deux petites vis parker, les gardent fermées, après bien sûr que l'on ait vérifié que tout fonctionne correctement .

Reader rfid134khz box

Le programme qui fait marcher la machine :

          Le programme (adapté du canevas de gooikerjh) est, comme d'habitude, développé avec l'IDE Arduino, puis converti en fichier .hex, pour être buriné dans la flash de l'ATMega328 avec un programmateur du genre Dataman  ou équivalent . Les nombreux commentaires en bout de chaque ligne, permettent de voir ce qui se passe. Le but étant de lire les données transmises en 13 octets  sous 9600 baud par le lecteur de transpondeur :

  if (ssrfid.available() > 0) {     // si les données sont présentes
    bool call_extract_tag = false;

    int ssvalue = ssrfid.read(); // lire des données

    if (ssvalue == -1) {         // aucune donnée n'a été lue
      return;
    }

Si des données sont reçues, on allume le rétro-éclairage, on empli le buffer :

    if (ssvalue == 170 && buffer_index == 0) {           // EM4305-LF a trouvé un transpondeur  => étiquette à lire
      digitalWrite(LedPin, HIGH);   // Allume le rétroéclage de l'écran
    } else if (ssvalue == 187 && buffer_index == BUFFER_SIZE - 1) {    // le message est complètement transmis
      call_extract_tag = true;      // extraire le mot à la fin 
    }

et on contrôle la longueur de chaine, en affichant les messages adéquats :

    if (buffer_index >= BUFFER_SIZE) {  // Controle débordement de tampon (si bégaiement !)
      lcd.clear();
      digitalWrite(LedPin, HIGH); // Allume le rétroéclage de l'écran
      lcd.print("Msg trop Long");
      buffer_index = 0;
      return;
    }

et d'aller piocher dans cette chaine, les parties que l'on veut traiter en commençant par le pays: Récupération des octets, inversion, conversion hexadécimale en décimale et ajout d'un "0" devant  si besoin:

  for (int i = 0; i < DATA_COUNTRY_SIZE; i++) {
    msg_data_country[i] = buffer[i + 4];
  }

  // mettre le pays à l'envers dans le tampon de message du pays
  for (int i = 0; i < DATA_COUNTRY_SIZE ; i++) {
    String str = String(buffer[i + 4], HEX);
    if (str.length() == 1 && buffer[i + 6] - 48 < 10) {  // ajouter 0 en tête si < 10
      str = "0" + str;
    }

même chose pour les données du Tag  :

  // Mettre le message à l'envers dans le tampon 
  for (int i = 0; i < DATA_TAG_SIZE ; i++) {
    String str = String(buffer[i + 6], HEX);
    if (str.length() == 1 && buffer[i + 6] - 48 < 10) {  // ajouter 0 en tête si < 10
      str = "0" + str;
    }
    str.toUpperCase();
    for (int k = 0; k < str.length(); k++) {
      byte x = str.charAt(k);
      tagmessage[2 * DATA_TAG_SIZE - 1 - i * 2 - k] = x;
    }
  }

  tag = hexInDec(tagmessage, 0, 2 * DATA_TAG_SIZE);

et contrôle de la trame avec le checksum, en faisant des "OU Exclusif" et en comparant le résultat à l'avant dernier octet ...

  for (int i = 0; i < DATA_SIZE; i++) {
    msg_data[i] = buffer[i + 1];
    checksum ^= msg_data[i];              // a = a XOR b
  }

Les fichiers de réalisations :

Reader rfid134khz 1Reader rfid134khz 1 (961.71 Ko)

 

Pour s'en servir...

          Après avoir basculé l'inter, un écran de présentation et un de copyright s'affichent respectivement 4 secondes chacun et le rétroéclairage de l'afficheur s'éteint . On peut maintenant passer la face inférieure du boîtier vers le cou ou l'épaule de l'animal, comme pour un brossage à 1 cm, et relativement lentement . Dès que l'antenne va recevoir le mot émis pas la puce énergisée, le rétro éclairage va se réactiver et afficher sur la ligne supérieure le pays où a été posé la puce. Si le message de 13 octets est complet et intègre, l'écran le confirme et le code animal converti en décimal apparaît sur la ligne inférieure ...

Bonne chasse aux puces ...

Reader rfid134khz tot

 

 

 

 

 

Ajouter un commentaire