Pages

Affichage des articles dont le libellé est RS232. Afficher tous les articles
Affichage des articles dont le libellé est RS232. Afficher tous les articles

dimanche 3 novembre 2019

Utilisation du lecteur RFID RDM6300

Cet article va présenter le lecteur RFID RDM6300. Les billets le concernant sont pléthoriques, je sais, mais bon, j'en refais un, à ma façon...

Schéma de câblage du test :
Le lecteur est alimenté entre 0 et 5V et le TX du module est sur la broche D2 de la UNO.

Fonctionnement de ce lecteur de badge :

Ce lecteur lit les badges 125 kHz et exclusivement ce type de badges.


Ces badges comportent 14 blocs de données sous forme d'un octet par bloc. Je ne rentre pas dans le détail des blocs dans cet article....

Pour faire simple, l'octet de départ est 0x02 qui donne STX en ASCII et l'octet de fin vaut 0x03 soit ETX.
Les 12 autres octets sont des caractères hexadécimaux entre 0 et F codés en ASCII.
Exemple d'une trame :


Vu la simplicité de la trame, il suffit simplement de lire les données sur le port série et hop, on a le badge !
En fait, pas si simple.....
Si vous faites cela, vous risquez d'obtenir des résultats bizarres, des rebonds, comme pour un bouton poussoir.
Exemple :

Ces trames sont obtenues en laissant un bref instant le badge au dessus de l'antenne. A peine une demie-seconde. Oui, le lecteur croit que le badge est toujours présent... Donc pas simple si on veut obtenir une belle chaîne en sortie et surtout faire de l'identification...c'est le but !

Passons au programme principal : Je ne pense pas que sois obligé de tout réexpliquer, les commentaires doivent être suffisants....



//nécessaire pour ouvrir un port série logiciel
#include <SoftwareSerial.h> 

SoftwareSerial RFID(2,3);//déclaration du port série logiciel

/*tag bleu :  180026AA52C6
tag rouge : 01001BCEC81C
tag jaune : 0000A38D5678*/

char caractere=0;//variable contenant un caractère
//variable contenant la chaine de lecture du badge présenté
String chaine_badge = "";
//variable drapeau correspondantes aux états des badges
boolean tag=false,etat_bleu=false,etat_rouge=false,etat_jaune=false;
//variables d'identification des badges
String bleu="180026AA52C6",rouge="01001BCEC81C",jaune="0000A38D5678";

void setup() 
{
RFID.begin(9600);//démarrage du port logiciel
Serial.begin(9600);//démarrage du port série
pinMode(13,OUTPUT);//broche 13 en sortie
}

void loop() 
{
    digitalWrite(130);
    chaine_badge = "";//on vide la chaine de réception
    Serial.println("attente badge");
    //si des données sont présentes sur le port logiciel...alors...
    if (RFID.available())
    {
      for (int count = 0; count < 14; count++)
      {//on boucle 14 fois car il y a 14 caractères
        //la variable caractère prend l'octet présent sur le port série
        caractere=RFID.read();
        //concaténation de la chaine et du caractère
        chaine_badge = String(chaine_badge) + caractere;
      }
    /*on ferme le port logiciel pour éviter 
    les rebonds et les fausses informations*/
    RFID.end();
    delay(50);
    tag=true;//un badge a été présenté et lu
    }

    if(tag==true)//si un badge a été présenté et lu...alors...
    {
    Serial.println("tag reçu !!!!!");
    digitalWrite(131);//on allume la LED
    //on affiche la chaine sur le port série
    Serial.println(chaine_badge);
    /*on appelle un sous programme
    qui va vérifier le badge et son état*/
    test();
    delay(5000);
    digitalWrite(130);//on éteint la LED
    }
    tag=false;//on remet l'état du badge à faux
    RFID.listen();//on écoute à npuveau le port série
    delay(100);//petite attente de sécurité
}

Ici, l'astuce pour éviter les fausses informations est l'utilisation de  la commande "RFID.end()". Celle-ci ferme le port série, ainsi, il n'y a plus de données parasites à traiter 👍
Bien entendu, il existe d'autre solutions mais je trouve celle-ci très efficace et facile à mettre en œuvre.

Maintenant, la partie test et identification :

void test()
{
    //extraction de la partie intéressante de la chaîne
    //on retire le stx et le etx
    String chaine_test=chaine_badge.substring(113);
    if(chaine_test==bleu)
    {
        Serial.println("bleu !!!!!!");
        //on regarde l'état antérieur du badge mais inversé
        if(!etat_bleu)Serial.println("bleu sorti");
        else Serial.println("bleu rentré");
        etat_bleu=!etat_bleu;//on change l'état du badge
        return;
    }
    else if(chaine_test==rouge)
    {
        Serial.println("rouge !!!!!!");
        if(!etat_rouge)Serial.println("rouge sorti");
        else Serial.println("rouge rentré");
        etat_rouge=!etat_rouge;
        return;
    }
    else if(chaine_test==jaune)
    {
        Serial.println("jaune !!!!!!");
        if(!etat_jaune)Serial.println("jaune sorti");
        else Serial.println("jaune rentré");
        etat_jaune=!etat_jaune;
        return;
    }
    else Serial.println("rien ................");
}

note : désolé pour les sauts de lignes, c'est le copier-coller de VScode qui veut cela....😕 mais sinon, c'est joli....😁

Je vous laisse tester et me contacter au cas où...

La prochaine fois, on complétera par une sauvegarde en EEPROM et un affichage sur écran OLED !


jeudi 11 avril 2019

Mise en œuvre du Programme GPS (Article précédent)

Dans l'article : https://sti2d-sin-isn.blogspot.com/2019/04/lire-une-trame-gps-avec-python-et.html , je propose un programme Python permettant de lire et décoder une trame GPS.

Un de mes collègues m'a fait cette suggestion : "On ne pourrait pas avoir un récepteur GPS et envoyer les trames sans fil à plusieurs PC pour que les élèves travaillent ensemble ?".... heu oui ! (Merci Alain M.)

C'est fait !

Ci-dessous, un boitier regroupant une alimentation, un module GPS et un HC-11: 
A ne réaliser qu'une fois....





Le récepteur pour un PC :

Juste un UART-USB et un HC-11
A reproduire autant de fois que désiré...



samedi 24 février 2018

Utilisation du traceur série de l'IDE d'Arduino

Quand on veut visualiser une variable, on pense tout de suite au moniteur série de l'IDE. C'est très pratique. Mais il existe également un autre outil, le traceur série. L'usage est rigoureusement identique au moniteur série :

Programme basique pour lire une valeur analogique et l'envoyer sur le port série :


(j'ai simplement connecté un potentiomètre de 10k sur A0)

Le moniteur série :


Le traceur série :

L'échelle verticale s'adapte automatiquement à la valeur mesurée (entre 0 et 1023)

Exemple pour deux entrées analogiques :


 Les valeurs analogiques sont envoyées vers le port série avec un Serial.print et séparées par une virgule. Le dernier envoi est un Serial.println


Certes, c'est rudimentaire, mais ça dépanne bien !

lundi 4 décembre 2017

Exploiter une chaîne de caractères en Arduino-Partie 1

Utilisation d'un tableau de caractères

De très nombreux périphériques communiquent avec les microcontrôleurs via le port RS232-UART. C'est très facile de lire une seule valeur comme "A" pour "allume" ou "S" pour "stop".
Mais qu'en est-il des envois de données complexes ? C'est-à-dire, des chaînes de caractères.....


Il existe plusieurs méthodes, plus ou moins simples et plus ou moins efficaces ou pratiques.

La plus simple est de récupérer les données entrantes dans le port série dans un tableau déclaré comme cela :

 ici, le tableau est constitué de caractères inconnus et sa taille est indéfinie. Pas évident à gérer, le compilateur ne connaît pas la taille mémoire à allouer et donc on risque d’avoir des surprises lors de la compilation (et à l'usage) si le programme total est très lourd.....

On peut aussi déclarer ainsi :

Maintenant, on a limité l'occupation mémoire à 12 emplacements (+1 avec le caractère "null").
Cette méthode fonctionne très bien quand on connaît précisément la taille et l'emplacement des valeurs que l'on veut récupérer. Il faut que tout soit figé à l'avance.
Par exemple, on reçoit cette chaîne :
"AAAASSSAAAAS"
ou bien :
   "SSSAAASSSSSS"


Dans ces deux cas, il est facile de trouver l'emplacement d'un caractère et de le traiter :


Il suffit dans ce cas de donner l'emplacement du caractère et on teste, on traite, on transforme...... Ici, c'est le quatrième emplacement.

Exploiter une chaîne de caractères en Arduino-Partie 2

Utilisation de la bibliothèque String

On va ici utiliser les fonctions de String, c'est sans doute un peu plus compliqué, et encore.... mais nettement plus souple et efficace :


En détail :

reception est une chaîne fictive, ici, je ne présente pas la partie réception. Je considère que la chaîne est bien reçue.

***


***


***

Sur le port série :
La chaîne réception est bien divisée en sous-chaînes....

L'avantage de cette technique est simple à comprendre : on peut manipuler des chaînes ayant des champs de taille variable comme des noms de famille, des valeurs analogiques sur 10 bits (de 0 à 1023)..... cela ne pose aucun problème, à chaque fois que la chaîne de réception sera analysée, les nouveaux index de virgules seront mis à jour.

En changeant la chaîne dans le programme : 
String reception = "Start,123,bonjour,AZERTY";





dimanche 1 octobre 2017

Réaliser un convertisseur ASCII-Caractère avec AI2

Il est parfois utile de connaitre la valeur du code ASCII d'un caractère, et inversement, savoir à quel caractère correspond un nombre. Quand on créé une appli mettant en jeu une liaison série par exemple (GPS, Bluetooth....).