Arduino et module RFID RC522 – Gérer plusieurs cartes

Le Module RFID-RC522 est module RFID utilisé pour lecture/écriture sans contact d’un tag. Le lecteur utilise une communication SPI.

RFID est l’abréviation de Radio Frequency IDentification. Les modules RFID utilisent des champs électromagnétiques pour transférer des données entre la carte et le lecteur. Différents tags sont attachés à des objets (carte, porte clé…) et lorsque nous plaçons cet objet en face du lecteur, le lecteur lit ces balises.

Un avantage du RFID est qu’il n’a pas besoin d’être dans une ligne de mire pour être détecté.

 

Les Tags possèdent une antenne associée à une puce électronique qui leur permet de recevoir et de répondre aux requêtes radio émises depuis l’émetteur-récepteur.
Ils contiennent un identifiant individuel (standard Epc-96 sur 96 bits). Leur fonctionnement est passif (sans source d’énergie, donc c’est autonome et inusable).

Module RFID Arduino UNO
3.3V [3,3V]
RST [9]
GND [GND]
MISO [12]
MOSI [11]
SCK [13]
SDK ou  NSS [10]
IRQ (non connecté)

Il faut télécharger les librairies suivantes et les installer dans le dossier librairies de votre dossier Arduino : Librairies RFID et SPI

Pour installer la librairie, dans Arduino, se rendre dans :
–> Croquis
–> Inclure une bibliothèque
–> Ajouter une bibliothèque .zip
et rechercher la bibliothèque que vous venez de télécharger.

Vous trouverez ensuite deux codes :
– Le premier permet de récupérer le numéro d’un TAG RFID
– Le second permet de vérifier si le TAG est correct (un numéro de TAG est en mémoire dans le programme).

#include <SPI.h>
#include <RFID.h>

RFID rfid(10, 9);
unsigned char status;
unsigned char str[MAX_LEN];

void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init();
}

void loop()
{
//Search card, return card types
if (rfid.findCard(PICC_REQIDL, str) == MI_OK) {

if (rfid.anticoll(str) == MI_OK) {
Serial.print("Le numéro de carte est : ");

Serial.println("");
}
rfid.selectTag(str);
Serial.print(str[0]);Serial.print(",");
Serial.print(str[1]);Serial.print(",");
Serial.print(str[2]);Serial.print(",");
Serial.print(str[3]);Serial.print(",");
Serial.println(str[4]);

rfid.halt();
}
}
Récuperer le numéro du badge RFID

Une fois le numéro du badge récupéré, vous pouvez compléter ce code avec votre numéro de badge, à la ligne 9 :

#include <SPI.h>
#include <RFID.h>

RFID rfid(10, 9);
unsigned char str[MAX_LEN];
int ValCarte;

// Valeur de votre carte
int IDCarte_1[5] = {214, 10, 81, 30, 147};

void setup() {
Serial.begin(9600);
SPI.begin();
rfid.init();
}

void loop() {
// On modifie la valeur de ValCarte, pour éviter de boucler indéfiniment dans les conditions
ValCarte = 2;

// Recherche de la carte
LectureCarte();

// Si la carte est bonne
if (ValCarte == 1) {
// Faire quelque chose si la carte est bonne
}
// Si la carte n'est pas bonne
else {
// Faire autre chose si la carte est mauvaise
}
}

void LectureCarte() {
if (rfid.findCard(PICC_REQIDL, str) == MI_OK) {
Serial.print("Carte trouvée : ");
if (rfid.anticoll(str) == MI_OK) {
}
rfid.selectTag(str);

// Comparaison des valeurs des cartes
if (compareCarte(str, IDCarte_1)) {
Serial.println("Bonne carte");
ValCarte = 1;
}
else {
Serial.println("Mauvaise carte");
ValCarte = 0;
}
rfid.halt();
}
}

// Fonction pour comparer les valeurs des cartes
bool compareCarte(unsigned char* carte, int* modele) {
for (int i = 0; i < 5; i++) {
if (carte[i] != modele[i]) {
return false;
}
}
return true;
}
Vérifier si le badge RFID est bon

Et si vous devez gérer plusieurs cartes, il est possible de comparer les différents tableaux :

#include <SPI.h>
#include <RFID.h>

RFID rfid(10, 9);
unsigned char status;
unsigned char str[MAX_LEN];
int ValCarte;

// Valeur de votre carte
int IDCarte_1[5] = {217, 236, 15, 195, 249};
int IDCarte_2[5] = {254, 52, 102, 195, 111};

void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init();
}

void loop()
{
// On modifie la valeur de ValCarte, pour éviter de boucler indéfiniment dans les conditions
ValCarte = 2;

// Recherche de la carte
LectureCarte();

// Si la carte est bonne
if (ValCarte == 1) {

// Je fais qqchose si la carte est bonne !

}
// Si la carte n'est pas bonne
else {

// Je fais autre chose, si la carte est mauvaise
}
}

void LectureCarte() {
if (rfid.findCard(PICC_REQIDL, str) == MI_OK) {
Serial.print("Carte trouvée : ");
if (rfid.anticoll(str) == MI_OK) {
}
rfid.selectTag(str);

if ((str[0] == IDCarte_1[0] && str[1] == IDCarte_1[1] && str[2] == IDCarte_1[2] && str[3] == IDCarte_1[3] && str[4] == IDCarte_1[4]) || str[0] == IDCarte_2[0] && str[1] == IDCarte_2[1] && str[2] == IDCarte_2[2] && str[3] == IDCarte_2[3] && str[4] == IDCarte_2[4]) {
Serial.println("Bonne carte");
ValCarte = 1;
}
else {
Serial.println("Mauvaise carte");
ValCarte = 0;
}
rfid.halt();
}
}
Comparer plusieurs cartes

7 commentaires

  1. Bonjour,
    Vos travails se sont tous nickels vraiment.
    Moi, ce que je voulais savoir c’est comment contrôler avec Arduino un moteur CC via App inventor.

  2. Bonjour.
    Je m’intéresse au module RFID, et me suis servi de votre tuto mais j’ai un problème avec la bibliothèque RFID.h, qui n’est pas acceptée au téléversement du sketch.
    Peut-être avez -vous une solution ou une explication à me transmettre ?
    Merci pour votre réponse, bien cordialement
    Jacques.

  3. merci beaucoup mais j ai eu une erreur

    C:\Users\HP\AppData\Local\Temp\.arduinoIDE-unsaved2024212-12740-rikvua.uu0l\sketch_mar12b\sketch_mar12b.ino: In function ‘void LectureCarte()’:
    C:\Users\HP\AppData\Local\Temp\.arduinoIDE-unsaved2024212-12740-rikvua.uu0l\sketch_mar12b\sketch_mar12b.ino:43:12: error: ‘class RFID’ has no member named ‘findCard’; did you mean ‘isCard’?
    if (rfid.findCard(PICC_REQIDL, str) == MI_OK) {
    ^~~~~~~~
    isCard

    exit status 1

    Compilation error: ‘class RFID’ has no member named ‘findCard’; did you mean ‘isCard’?

Rejoignez la conversation

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.