Étiquettes : , , ,

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):

  • 3V3 (Alimentation) <-> 3V3
  • RST (Reset) <-> 9
  • GND (Masse) <-> GND
  • MISO (Master Input Slave Output) <-> 11
  • MOSI (Master Output Slave Input) <-> 10
  • SCK (Serial Clock) <-> 13
  • SS/SDA (Slave select) <-> 12

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écansime lorsque la bonne carte RFID est présentée sur le lecteur.

#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
#define servoPin 6
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
 
 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!"));
     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!"));
     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

https://github.com/miguelbalboa/rfid