fbpixel
É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 voir, dans ce tutoriel, la gestion d’un module RFID RC522 avec une carte NodeMCU ESP8266 .

Prérequis : Programmez votre NodeMCU avec Arduino

Matériel

  • Ordinateur
  • Carte NodeMCU ESP8266
  • Câble USB B mâle/Micro B mâle
  • 1x module RFID RC522

Schéma

Le module RFID RC522 utilise la protocole SPI pour communiquer avec l’ESP8266. La communication SPI utilise des boches spécifiques sur ce type de microcontrôleur.

Le brochage se fait comme suit (à gauche côté RC522, à droite côté ESP8266):

  • Vcc <-> 3V3 (ou Vin(5V) selon la version du module)
  • RST (Reset) <-> D0
  • GND (Masse) <-> GND
  • MISO (Master Input Slave Output) <-> D6
  • MOSI (Master Output Slave Input) <-> D7
  • SCK (Serial Clock) <-> D5
  • SS/SDA (Slave select) <-> D8
nodemcu-esp8266-rfid-rc522_bb Utilisation d'un module RFID avec un ESP8266

Attention: Selon la version du module RFID, la tension d’alimentation peut être différentes (3.3V ou 5V). Vérifiez bien la tension d’alimentation de votre module.

Pour rappel, voici le schéma de brochage de la carte ESP8266.

nodemcu-esp8266-pinout Utilisation d'un module RFID avec un ESP8266

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 ESP8266 et le module; et la librairie MFRC522.h qui va nous permettre de dialoguer avec le module.

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

#define SS_PIN D8
#define RST_PIN D0

MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class

MFRC522::MIFARE_Key key;

// Init array that will store new NUID
byte nuidPICC[4];

void setup() {
  Serial.begin(115200);
  SPI.begin(); // Init SPI bus
  rfid.PCD_Init(); // Init MFRC522
  Serial.println();
  Serial.print(F("Reader :"));
  rfid.PCD_DumpVersionToSerial();

  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
  Serial.println();
  Serial.println(F("This code scan the MIFARE Classic NUID."));
  Serial.print(F("Using the following key:"));
  printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
}

void loop() {

  // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
  if ( ! rfid.PICC_IsNewCardPresent())
    return;

  // Verify if the NUID has been readed
  if ( ! rfid.PICC_ReadCardSerial())
    return;

  Serial.print(F("PICC type: "));
  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
  Serial.println(rfid.PICC_GetTypeName(piccType));

  // Check is the PICC of Classic MIFARE type
  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
      piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
      piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
    Serial.println(F("Your tag is not of type MIFARE Classic."));
    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.println(F("The NUID tag is:"));
    Serial.print(F("In hex: "));
    printHex(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
    Serial.print(F("In dec: "));
    printDec(rfid.uid.uidByte, rfid.uid.size);
    Serial.println();
  }
  else Serial.println(F("Card read previously."));

  // Halt PICC
  rfid.PICC_HaltA();

  // Stop encryption on PCD
  rfid.PCD_StopCrypto1();
}


/**
   Helper routine to dump a byte array as hex values to Serial.
*/
void printHex(byte *buffer, byte bufferSize) {
  for (byte i = 0; i < bufferSize; i++) {
    Serial.print(buffer[i] < 0x10 ? " 0" : " ");
    Serial.print(buffer[i], HEX);
  }
}

/**
   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);
  }
}

Résultat

Lorsqu’on passe une carte, un badge ou une puce RFID devant le module, l’adresse d’identification du badge s’affiche sur le moniteur série.

nodemcu-esp8266-rfid-rc522-result Utilisation d'un module RFID avec un ESP8266

Applications

  • Développer une interface Web qui ne s’active que lorsque le bon badge est passé devant le module

Sources