RFID : stop UID, bonjour Block

Coucou tout le monde, alors voilà, si je viens ici requérir de l'aide, c'est que je sèche pitoyablement...

Voici l'idée de mon projet :

  • un module de lecture RFID connecté à un arduino, qui à la lecture d'un badge, carte ou tag, doit pouvoir ouvrir la porte 1 ou bien la porte 2 selon le niveau d'accès.
  • un module permettant d'upgrader le badge, carte ou tag du niveau 01 au niveau 02.

Pour se faire, j'ai épluché un peu la librairie bien obscure de mfrc522 ayant acheté le lecteur RFID-RC522 bien connu du web.

Je me suis un peu amusé avec les exemples (lecture, écriture, dump...) mais mon problème arrive à ce moment.

Quasiment tous les tutoriels ne parle que de la lecture de l'UID, et de sont identification pour ouvrir ou fermer une porte.

Seulement voilà, j'aimerai pouvoir "upgrader" le niveau du badge, carte ou tag sans forcément avoir à tenter de réécrire UID...

Et là impossible de trouver le moindre tuto sur la lecture d'un block spécifique ni même l'ouverture sur les bonne données contenues....

J'en viens donc à faire appel à la puissance de la communauté afin d'éclairer ma lanterne qui manque cruellement d'huile :stuck_out_tongue:

Merci à tous !

Je pense que les niveaux d'accès ne doivent pas être codés dans le badge mais décidés par le programme de l'Arduino. Lorsque le lecteur lit un badge, il reconnait l'ID. L'arduino va lire dans un tableau le niveau d'accès du badge lu. Niveau 1 : ouverture porte 1, niveau 2 : ouverture portes 1 & 2.

Pour changer le niveau d'accès, tu peux ajouter un bouton. Après lecture et reconnaissance d'un badge, l'appui sur le bouton propose de changer le niveau. Pour valider le changement, tu passes (par exemple) le badge de l'administrateur devant le lecteur. Si le lecteur reconnait le badge admin, le programme change le niveau d'accès du badge précédent. Ça se traduit par une simple modification de la valeur dans la case du tableau correspondant au badge lu : passage de 1 à 2 ou de 2 à 1.

Tout ça c'est du code, le lecteur ne fait que ce qu'il sait faire : lire un badge et envoyer à l'Arduino l'ID qu'il a lu.

Merci pour cette réponse lesept ^^

J'avais également réfléchi à cela, mais le problème est plutôt de ma faute, je me suis mal exprimé.

Réellement il y aurait deux lecteurs (un pour chaque porte), et un encodeur... mais aucun d'entre eux n'est connecté ensemble. Ils sont autonomes.

Par contre je trouve dingue que tout passe par l'UID alors qu'il y a temps de mémoire disponible et don de possibilités dans les blocks... :smiley:

Elle me plait bien aussi la solution de lesept, peut-être rajouter 2 fonctions, si utile, pour l'ajout et retrait d'un badge :

  • badge admin -> bouton 2 ou menu 2) -> Ajout -> Nouveau badge
  • badge admin -> bouton 3 ou menu 3) -> Retrait -> Badge a supprimer

Claymenia:
Réellement il y aurait deux lecteurs (un pour chaque porte), et un encodeur... mais aucun d'entre eux n'est connecté ensemble. Ils sont autonomes.

L'intelligence est dans l'Arduino (parfois devant le clavier, mais pas toujours :slight_smile: ), le lecteur est bête.

Qu'appelles-tu un encodeur ?

Merci Supercc ! :grinning:

Claymenia:
Merci pour cette réponse lesept ^^

J'avais également réfléchi à cela, mais le problème est plutôt de ma faute, je me suis mal exprimé.

Réellement il y aurait deux lecteurs (un pour chaque porte), et un encodeur... mais aucun d'entre eux n'est connecté ensemble. Ils sont autonomes.

Par contre je trouve dingue que tout passe par l'UID alors qu'il y a temps de mémoire disponible et don de possibilités dans les blocks... :smiley:

Bonjour
Il te suffit de ne pas tenir compte de l'UID et de programmer les tags avec les infos que tu souhaite dans les blocks utilisables
en theorie tous les blocks sont capables d'etre lus et ecris (evidement pour des tags RW capables)
sauf le 1er block qui contient l'UID et qui sauf sur des cartes "asia" est en lecture seule.
regarde ces 3 exemples de la lib "balboa
ReadAndWrite
rfid_read_personal_data
rfid_write_personal_data

lesept:
L'intelligence est dans l'Arduino (parfois devant le clavier, mais pas toujours :slight_smile: ), le lecteur est bête.

Qu'appelles-tu un encodeur ?

Merci Supercc ! :grinning:

Encoder = l'arduino qui va écrire les nouvelles valeurs sur le badge, carte ou tags :smiley: (encoder des données ?) et malheureusement oui l'intelligence fait défaut devant le clavier là :wink:

Artouste:
Bonjour
Il te suffit de ne pas tenir compte de l'UID et de programmer les tags avec les infos que tu souhaite dans les blocks utilisables
en theorie tous les blocks sont capables d'etre lus et ecris (evidement pour des tags RW capables)
sauf le 1er block qui contient l'UID et qui sauf sur des cartes "asia" est en lecture seule.
regarde ces 3 exemples de la lib "balboa
ReadAndWrite
rfid_read_personal_data
rfid_write_personal_data

Merci Artouste, effectivement j'ai tenté de travailler à partir de ces fonctions et de l'exemple, mais je n'arrive ni à sélectionner un bloc en particulier, ni (et surtout) à comparer la valeur d'un block avec une chaine de comparaison (et c'est bien là que le bas blesse :p).

Honnêtement la librairie n'est pas ultra claire pour des débutants...

Quand j'use de l'exemple write pour inscrire 1234 et que je passe le badge en read j'obtiens :

Read personal data on a MIFARE PICC:
**Card Detected:**
Card UID: B5 13 35 83
Card SAK: 08
PICC type: MIFARE 1KB
Name: a	⸮ 1234            
**End Reading**

Apparemment la fonction

 byte buffer1[18];

  block = 4;
  len = 18;

  //------------------------------------------- GET FIRST NAME
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(mfrc522.uid)); //line 834 of MFRC522.cpp file
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Authentication failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  status = mfrc522.MIFARE_Read(block, buffer1, &len);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Reading failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  //PRINT FIRST NAME
  for (uint8_t i = 0; i < 16; i++)
  {
    if (buffer1[i] != 32)
    {
      Serial.write(buffer1[i]);
    }
  }
  Serial.print(" ");

donne :

a ⸮

et la fonction

  //---------------------------------------- GET LAST NAME

  byte buffer2[18];
  block = 1;

  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 1, &key, &(mfrc522.uid)); //line 834
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Authentication failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  status = mfrc522.MIFARE_Read(block, buffer2, &len);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Reading failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  //PRINT LAST NAME
  for (uint8_t i = 0; i < 16; i++) {
    Serial.write(buffer2[i] );
   }

donne bien le 1234

Toutefois si je tente d'adapter le code afin d'éteindre une led témoin, cela ne donne rien :

/*
 * Initial Author: ryand1011 (https://github.com/ryand1011)
 *
 * Reads data written by a program such as "rfid_write_personal_data.ino"
 *
 * See: https://github.com/miguelbalboa/rfid/tree/master/examples/rfid_write_personal_data
 *
 * Uses MIFARE RFID card using RFID-RC522 reader
 * Uses MFRC522 - Library
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
*/

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

int pinLed = 4;

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance

//*****************************************************************************************//
void setup() {
  Serial.begin(9600);                                           // Initialize serial communications with the PC
  pinMode(pinLed, OUTPUT);
  digitalWrite(pinLed, HIGH);
  SPI.begin();                                                  // Init SPI bus
  mfrc522.PCD_Init();                                              // Init MFRC522 card
  Serial.println(F("Read personal data on a MIFARE PICC:"));    //shows in serial that it is ready to read
}

//*****************************************************************************************//
void loop() {

  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

  //some variables we need
  byte block;
  byte len;
  MFRC522::StatusCode status;

  //-------------------------------------------

  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  Serial.println(F("**Card Detected:**"));

  //-------------------------------------------

  mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid)); //dump some details about the card

  //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));      //uncomment this to see all blocks in hex

  //-------------------------------------------

  Serial.print(F("Name: "));

  byte buffer1[18];

  block = 4;
  len = 18;

  //------------------------------------------- GET FIRST NAME
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(mfrc522.uid)); //line 834 of MFRC522.cpp file
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Authentication failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  status = mfrc522.MIFARE_Read(block, buffer1, &len);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Reading failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  //PRINT FIRST NAME
  for (uint8_t i = 0; i < 16; i++)
  {
    if (buffer1[i] != 32)
    {
      Serial.write(buffer1[i]);
    }
  }
  Serial.print(" ");

  //---------------------------------------- GET LAST NAME

  byte buffer2[18];
  block = 1;

  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 1, &key, &(mfrc522.uid)); //line 834
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Authentication failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  status = mfrc522.MIFARE_Read(block, buffer2, &len);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Reading failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  //PRINT LAST NAME
  for (uint8_t i = 0; i < 16; i++) {
    Serial.write(buffer2[i] );
    if (buffer2[i] == "1234") {
      digitalWrite(pinLed, LOW);
      delay(2000);
    }
  }

  //----------------------------------------

  Serial.println(F("\n**End Reading**\n"));

  delay(1000); //change value if you want to read cards faster

  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
}
//*****************************************************************************************//