Site icon AranaCorp

Usar um módulo RFID com o Arduino

O módulo RFID RC522 é um leitor de cartões inteligentes que, entre outras coisas, permite ativar um mecanismo quando o cartão certo é apresentado ao leitor. Usaremos aqui o módulo RC522, que é o mais comum.

Pré-requisito: Dar sentidos ao seu robô

Material

Esquema

O módulo RC522 RFID comunica com o Arduino por meio do protocolo SPI. A comunicação SPI usa pinos específicos dos microcontroladores Arduino.

O pinout é o seguinte (lado esquerdo RC522, lado direito Arduino UNO):

Atenção: Dependendo da versão do módulo, a tensão de alimentação pode ser diferente (3,3V ou 5V). Verifique a tensão de alimentação do seu módulo.

Código para ler um cartão RFID

Para utilizar o módulo RFID RC522, usamos a biblioteca SPI.h, que permite estabelecer a comunicação entre a placa Arduino e o módulo. Usamos também a biblioteca MFRC522.h, que permite dialogar com o módulo.

#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);
  }
}

Aplicação

Uma típica aplicação do módulo RFID é fazer abrir um mecanismo quando o crachá correto é apresentado ao leitor.

Para isso, utilizamos um módulo RFID e um servomotor que servirá como fechadura controlada. O servomotor pode ser substituído por um solenoide, um relé ou outro motor, dependendo do mecanismo que se pretende utilizar.

Para o programa, vamos reutilizar o código de leitura do cartão RFID e comparar o valor lido com o valor que pretendemos usar para abrir o sistema. Se o valor estiver correto, o servomotor é ativado e o LED integrado se acende.

#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);
  }
}

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Exit mobile version