Le module RFID RC522 est un lecteur de carte à puce qui, permet entre autre, d’activer un mécanisme lorsque la bonne carte est présenté au lecteur. Nous allons utiliser ici le module RC522 qui est le plus courant.
Prérequis : Donnez des sens à votre robot
Matériel
- Ordinateur
- Carte Arduino
- Câble USB pour connecter la carte Arduino au PC
- 1x module RFID RC522
Schéma
Le module RFID RC522 utilise la protocole SPI pour communiquer avec Arduino. La communication SPI utilise des boches spécifiques des microcontrôleurs Arduino.
Le brochage se fait comme suit (à gauche côté RC522, à droite côté Arduino UNO):
- Vcc <-> 3V3 (ou 5V selon la version du module)
- RST (Reset) <-> 9
- GND (Masse) <-> GND
- MISO (Master Input Slave Output) <-> 12
- MOSI (Master Output Slave Input) <-> 11
- SCK (Serial Clock) <-> 13
- SS/SDA (Slave select) <-> 10
Attention: Selon la version du module, la tension d’alimentation peut être différentes (3.3V ou 5V). Vérifiez bien la tension d’alimentation de votre module.
Code pour lire une carte RFID
Pour utiliser le module RFID RC522 nous utilisons la librairie SPI.h qui va nous permettre d’établir la communication entre la carte Arduino et le module; et la librairie MFRC522.h qui va nous permettre de dialoguer avec le module.
#include <SPI.h> #include <MFRC522.h> // INPUT #define SS_PIN 10 #define RST_PIN 9 MFRC522 rfid(SS_PIN, RST_PIN); // Init array that will store new NUID byte nuidPICC[4]; void setup() { Serial.begin(9600); SPI.begin(); // Init SPI bus rfid.PCD_Init(); // Init MFRC522 Serial.println(F("Scan RFID NUID...")); } void loop() { readRFID(); delay(200); } // void readRFID() { // Look for new card if ( ! rfid.PICC_IsNewCardPresent()) return; // Verify if the NUID has been readed if ( !rfid.PICC_ReadCardSerial()) return; if (rfid.uid.uidByte[0] != nuidPICC[0] || rfid.uid.uidByte[1] != nuidPICC[1] || rfid.uid.uidByte[2] != nuidPICC[2] || rfid.uid.uidByte[3] != nuidPICC[3] ) { Serial.println(F("A new card has been detected.")); // Store NUID into nuidPICC array for (byte i = 0; i < 4; i++) { nuidPICC[i] = rfid.uid.uidByte[i]; } Serial.print(F("RFID tag in dec: ")); printDec(rfid.uid.uidByte, rfid.uid.size); Serial.println(); } // Halt PICC rfid.PICC_HaltA(); // Stop encryption on PCD rfid.PCD_StopCrypto1(); } /** * Helper routine to dump a byte array as dec values to Serial. */ void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], DEC); } }
Application
Une application classique du module RFID est l’ouverture d’un mécanisme lorsque le bon badge est présenté sur le lecteur.
Pour cela , nous utilisons un module RFID et un servomoteur qui servira de serrure pilotée. Le servomoteur peut être remplacé par un solénoïde, relais ou un autre moteur selon le mécanisme que vous souhaitez utiliser.
Pour le programme, nous allons réutiliser le code de lecture de carte RFID et nous allons comparer la valeur lue à celle que nous souhaitons utiliser pour l’ouverture du système. Si la valeur est correcte, nous activons le servomoteur et allumons la LED embarquée.
#include <SPI.h> #include <MFRC522.h> #include <Servo.h> /**************************PARAMETERS******************************/ const int ipadd[4] = {103, 97, 67, 25}; //ip address à modifier selon la carte int servoOpen = 180; int servoClose = 0; int delayBeforeClosing = 1000; /******************************************************************/ // INPUT #define SS_PIN 10 #define RST_PIN 9 // OUTPUT const int servoPin = 6; const int ledPin = 13; Servo servo; MFRC522 rfid(SS_PIN, RST_PIN); bool approved = 0, oldApproved = 0; // Init array that will store new NUID byte nuidPICC[4]; void setup() { Serial.begin(9600); SPI.begin(); // Init SPI bus rfid.PCD_Init(); // Init MFRC522 pinMode(ledPin, OUTPUT); servo.write(servoClose); servo.attach(servoPin); Serial.println(F("Scan RFID NUID...")); } void loop() { readRFID(); if (nuidPICC[0] == ipadd[0] && nuidPICC[1] == ipadd[1] && nuidPICC[2] == ipadd[2] && nuidPICC[3] == ipadd[3]) { approved = true; if (approved != oldApproved) { Serial.println(F("Card approved!")); digitalWrite(ledPin, HIGH); servo.write(servoOpen); delay(delayBeforeClosing); } nuidPICC[0] = 0; nuidPICC[1] = 0; nuidPICC[2] = 0; nuidPICC[3] = 0; } else { approved = false; if (approved != oldApproved) { Serial.println(F("Card incorrect!")); digitalWrite(ledPin, LOW); servo.write(servoClose); } } oldApproved = approved; } // void readRFID() { // Look for new 1 cards if ( ! rfid.PICC_IsNewCardPresent()) return; // Verify if the NUID has been readed if ( !rfid.PICC_ReadCardSerial()) return; if (rfid.uid.uidByte[0] != nuidPICC[0] || rfid.uid.uidByte[1] != nuidPICC[1] || rfid.uid.uidByte[2] != nuidPICC[2] || rfid.uid.uidByte[3] != nuidPICC[3] ) { Serial.println(F("A new card has been detected.")); // Store NUID into nuidPICC array for (byte i = 0; i < 4; i++) { nuidPICC[i] = rfid.uid.uidByte[i]; } Serial.print(F("RFID tag in dec: ")); printDec(rfid.uid.uidByte, rfid.uid.size); Serial.println(); } // Halt PICC rfid.PICC_HaltA(); // Stop encryption on PCD rfid.PCD_StopCrypto1(); } /** Helper routine to dump a byte array as dec values to Serial. */ void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], DEC); } }
Sources
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie
Merci pour votre aide
en revenche je viens de constater que dans le code
const int ipadd[4] = {103, 97, 67, 25}; //ip address à modifier selon la carte
l adresse de la carte ne peut pas comporter plus de 4 segments de son numero de uid et doit etre exclusivement en décimal
je viens de tester pour un uid avec plus de 4 segment et le code ne fonctionne pas (impossible de téléverser dans l’arduino)
comment faire ????
Pour modifier le nombre de segments, il faut modifier plusieurs endroit du code où le nombre de segment 4 est spécifié.
const int ipadd[4]
byte nuidPICC[4];
etc.
normalement, vous devriez pouvoir utiliser le format hexadécimal dans ipadd en utilisant le préfixe « 0x »
bonjour je n’arrive pas à faire la partie code car mon mblock ne peut pas le décrypter pourriez vous m’aider s’il vous plait !
merci de votre réponse en bonne continuation !
Bonjour, je vais d’abord vous remercier pour votre aide et par la suite je voudrais savoir pourquoi on m’affiche une erreur au niveau de la première ligne de « void loop » (readRFID) on me dit que ‘readRFID’ n’est pas déclaré dans ce scope. Merci d’avance
Bonjour, merci pour votre commentaire. Il doit y avoir un soucis dans votre copier-coller. Généralement, lorsqu’il est dit qu’une fonction n’est pas déclarée, c’est qu’il y a un soucis d’accolade {}
Bonjour !
comment resoudre cette erreur, j’ai aussi la meme chose
comment connaitre l’adresse ip de sa carte ?
Bonjour,
l’uid de la carte devrait s’afficher avec le code pour lire une carte RFID.
Bonjour, je suis débutant, et cela marche du premier coup, Merci.
par contre je souhaite remplacer le Servo par un relais…
un petit complément serais utile comme schéma et code…
Merci
Bonjour,
Si vous utilisez un module relais Arduino, vous pouvez utiliser le même branchement pour le relais que pour le servo. Vous pouvez remplacer les commandes servo.write(servoOpen) par analogWrite(servoPin,250) ou digitalWrite(servoPin,HIGH) et les commandes servo.write(servoClose) par analogWrite(servoPin,0) ou digitalWrite(servoPin,LOW). Vous pouvez ensuite supprimer les commandes inutiles relatives à servo.
Bonjour, après avoir réalisé ce tuto, j’ai vu que la bibliothèque MFRC522 pouvait écrire sur le tag RFID. Je me demandais si c’était possible de réécrire un grand nombre de fois au même endroit sur le tag (pour pouvoir stocker une variable). Merci de votre réponse.
Bonjour,
Je ne connais pas la limite du nombre de réécriture. Je ne pense pas que ce soit prévu pour être modifié souvent mais je ne peux pas le garantir car jamais essayé.
Bonjour. Moi j’aimerais créer un tableau dans lequel je mettrai plusieurs adresse de carte et a chaque fois le comparer a la carte que l’utilisateur passe. J’arrive pas a le faire
Tu peux créer un tableau comme ceci
ipadd[4][2] = {{103, 97, 67, 25},{103, 97, 67, 26}}; //ip address à modifier selon la carte
Et faire une boucle for pour comparer chacune des ip
Bonjours je ne comprend pas pourquoi mais mon servo moteur ne tourne pas quand je fait détecte ma carte