Parlons Arduino > Vos projets

Annonces de gare avec RFID

(1/7) > >>

Barbadidoua:
J'initie un projet  un de gestion des annonces de gare par RFID, indépendant de tout logiciel de pilotage, tant que faire se peut.

Je pars de l'article Annonces en gare avec la RFID.
J'adapte au matériel à ma disposition : lecteur RFID SPI, afficheur lcd I2C, DFPlayer, NanoV3
Cela m’embête de modifier chaque sketch quand la liste des trains évolue:  J’envisageais donc d’écrire dans le RFID, à l’aide d’un sketch particulier, ou d'une option du sketch:
- Le N° du train = .identifiant.
- Le nom du train = .nom
- Le type de train = .type  (Voyageur avec arrêt, Voyageur sans arrêt, Marchandise …)
Je travaille actuellement sur ce point précis.

Pour les trains entrant en gare:
A terme, le sketch surveillerait un certain nombre ( 10 ) d’adresses décodeurs Dcc afin de déterminer la provenance et la destination des trains et reconstituer l’annonce :
"Le train NrTrain en provenance de Provenance va entrer en gare Destination éloignez vous de la bordure du quai."

Les trains marchandise donneraient une autre annonce
"Attention, Destination au passage du train. Eloignez vous de la bordure du quai."

Certains wagons pourraient déclencher d’autres messages.

Le trigger est donc la détection du RFID qui déclenche la création du message correspondant.

Les adresses DCC à surveiller seraient gérées sous forme de CV
Les 3 premières adresses DCC permettrait de calculer la provenance (Un CV par 2^3=8 possibilité donnant le N° du MP3 correspondant)
Les 7 dernières adresses DCC permettrait de calculer la destination (Un CV par 2^4=16 possibilité donnant le N° du MP3 correspondant)
A moins que ce ne soit l'inverse ...

Pour les trains au départ:

Je cherche encore l'idée lumineuse: Quel trigger utiliser pour que cela fonctionne sans logiciel de pilotage ?
L'annonce est faite alors que le train est en position depuis un certain temps, qu'il est encore possible de modifier sa destination,

Je reste à l'écoute de vos suggestions.
Par ailleurs, je suis à la recherche de RFID autocollant de 19 mm x 12 mm : auriez vous un fournisseur à m’indiquer ?

Xavier

Dominique:
Bonjour,

On trouve ces étiquettes RFID en cherchant sur eBay « NTAG213 »

comme ceux-ci :
https://rover.ebay.com/rover/0/0/0?mpre=https%3A%2F%2Fwww.ebay.fr%2Fulk%2Fitm%2F272628279713

Didier44:
Bonjour,

Tu as aussi ce fournisseur très complet en Italie que j'ai utilisé
https://www.shopnfc.com/fr/

Barbadidoua:
Une premiere partie ...

Préambule
Il existe de multiple sortes de RFID en fonction des besoins. En ce qui nous concerne, le cout, la facilité d'approvisionnement, la distance maximum de lecture me conduisent à utiliser des Tags MIFARE Classic 1K de NXP.
Les exemples fournis avec la bibliothèque ne permettent pas directement de lire et écrire dans la boucle du sketch. Ceci devrait vous aider a y parvenir!
Organisation de la mémoire d'un RFID
Les RFID utilisés disposent d'une mémoire organisée par blocs de 16 octets. J'utilise pour ma part les RFID les plus courant, qui possèdent 16 blocs (de 0 à 15).
Les blocs multiples de 4 (0, 4, 8 ...), sont réservés. Les autres blocs peuvent être utilisés pour y stocker vos données.
Attention : Pour lire ou écrire un RFID, il faut évidement qu'il soit présent à proximité du lecteur !
Lire un RFID
Les RFID utilisés disposent d'une mémoire organisée par blocs de 16 octets. On va donc lire l'ensemble du bloc pour n'afficher que les octets requis.
L'affichage se fera en Hexadécimal ou sous forme de caractère suivant les besoins.
Les étapes sont alors :
EtapeCommandeAutentificationstatus = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));Lecturestatus = mfrc522.MIFARE_Read(block, buffer, &size);Chaque étape met a jour le status qui sera utilisé pour gérer les messages d'erreur

--- Code: ---if (status != MFRC522::STATUS_OK) {…}
--- Fin du code ---
L'instruction
--- Code: ---.GetStatusCodeName(status)
--- Fin du code ---
donne le message d'erreur
Voici le sous-programme utilisé:


--- Code: ---// ========================================================
// Lecture Block
// ========================================================
void Read_Block(byte block,int n1, int n2, int mode) {
  //  Serial.println();
  for (byte i = 0; i < MFRC522::MF_KEY_SIZE; ++i) {
    key.keyByte[i] = 0xFF;
  }
//  if (mfrc522.PICC_ReadCardSerial()) {
    status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
    if (status == MFRC522::STATUS_OK) {
      status = mfrc522.MIFARE_Read(block, buffer, &size);
      if (status == MFRC522::STATUS_OK) {
        if (mode<2) {
          Serial.print(F("Data in block ")); Serial.print(block); Serial.print (F(": "));
        }
        TmpStr="";
        for (int p=n1; p<n2; p++) {
          if (mode==0) {
            Serial.print(buffer[p] < 0x10 ? " 0" : " ");
            Serial.print(buffer[p], HEX);
          }
          else if(mode%2==1) {
            if (buffer[p]>20) TmpStr+=(char)buffer[p];
            else TmpStr+="-";
          }
        }
        if(mode%2==1) Serial.print(TmpStr);
        Serial.println();
      }
    }
//  }
}
--- Fin du code ---

Dans tous les cas, une fois l'écriture effectuée, il faut clore le cryptage du RFID a l'aide de l'instruction .PCD_StopCrypto1()
Voici donc l'appel correspondant:

--- Code: ---      Read_Block(Param[0].toInt(),Param[1].toInt(),Param[2].toInt(),0);
      mfrc522.PCD_StopCrypto1();      // Stop encryption on PCD
--- Fin du code ---
Ecrire dans un RFID
Pourquoi écrire dans un RFID?
Chaque RFID possède un numéro à priori unique: son identifiant. Lire cet identifiant est trés simple.   On peut ensuite utiliser un tableau contenant toutes les informations associées a cet identifiant. Il faudra cependant que ce tableau soit présent, identique, dans chacun des sketches, des arduinos qui pourront lire les RFID. Chaque fois qu'un nouvel RFID sera utilisé, il faudra mettre a jour tous ces tableaux!
En écrivant dans le RFID les informations communes, associées a ce RFID, elles deviennent disponible partout, sans besoin de copier de tableau.
Les RFID utilisés disposent d'une mémoire organisée par blocs de 16 octets. Tous ne sont pas utilisables, certains sont réservés!
Écriture d'un bloc :
La librairie permet d’écrire la totalité des 16 octets d'un bloc. Nous allons donc pouvoir y écrire une chaîne de 16 caractères maximum. Si la chaîne est moins longue, on la complétera par des espaces.
Les étapes sont alors :
EtapeCommandeAutentificationstatus = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));Ecriturestatus = mfrc522.MIFARE_Write(block, nbuffer, 16);Chaque étape met a jour le status qui sera utilisé pour gérer les messages d'erreur

--- Code: ---if (status != MFRC522::STATUS_OK) {…}
--- Fin du code ---
L'instruction
--- Code: ---.GetStatusCodeName(status)
--- Fin du code ---
donne le message d'erreur
Écriture d'un octet :
La librairie ne donne pas accès a un octet seul. Il faudra donc écrire le bloc complet en ne modifiant que l'octet désiré.
Voici le sous-programme utilisé:

--- Code: ---// ========================================================
// Configuration RFID
// ========================================================
void ConfigureRFID(byte block, String s, byte v) {
  // Vidage du buffer
  byte nbuffer[16];
  for (int p=0;p<16;p++) {
    nbuffer[p]=' ';
  }
  if (String(s.charAt(0))=="#") {          // Configuration du nom
    for (int p=1;p<s.length();p++) {
      nbuffer[p-1]=s[p];
      Serial.print(nbuffer[p-1]);Serial.print(" ");
    }
    Serial.println("!");
  } else {          // Configuration du Nr et du type
    Read_Block(block,0,16,0);     // Recupere les valeurs initiales
    for (int p=0;p<16;p++) {
      nbuffer[p]=buffer[p];
      Serial.print(nbuffer[p]);Serial.print("-");
    }
    Serial.println("!");
    nbuffer[s.toInt()]=v;       // Change le CV concerné
  }
  Serial.println(F("Authenticating using key A..."));
  for (int p=0;p<16;p++) {
    Serial.print(nbuffer[p]);Serial.print(" ");
  }
  Serial.println("!");
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    for (int p=0;p<16;p++) {
      Serial.print(nbuffer[p]);Serial.print(" ");
    }
    Serial.println("!");
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    for (int p=0;p<16;p++) {
      Serial.print(nbuffer[p]);Serial.print(" ");
    }
    Serial.println("!");
    return;
  }
  else Serial.println(F("PCD_Authenticate() success: "));
  Serial.println();
  for (int p=0;p<16;p++) {
    Serial.print(nbuffer[p] < 0x10 ? " 0" : " ");
    Serial.print(nbuffer[p], HEX);
  }
  status = mfrc522.MIFARE_Write(block, nbuffer, 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("MIFARE_Write() success: "));
}

--- Fin du code ---
Dans tous les cas, une fois l'écriture effectuée, il faut clore le cryptage du RFID a l'aide de l'instruction .PCD_StopCrypto1()
Voici donc l'appel correspondant :
 
--- Code: ---   ConfigureRFID(Param[0].toInt(),Param[1], Param[2].toInt());
    mfrc522.PCD_StopCrypto1();      // Stop encryption on PCD
--- Fin du code ---

Ces premières fonctions vont me permettre d'enregistrer dans les RFID:

* Le numero MP3 du train
* Le type de train (Voyageur, Marchandise) ou de l’événement (Retard, Grève ...)
* Le nom du train a des fins d'affichage
A suivre...

Dominique:
Bonjour Xavier,

Enfin quelqu’un qui bosse en Août ! Merci Xavier pour ces explications très claires.

Il est, en effet, utile de programmer quelques octets de la mémoire des tags pour simplifier les détections, les rendre plus utilisables.

Cordialement
Dominique

Navigation

[0] Index des messages

[#] Page suivante

Utiliser la version classique