fbpixel
Etiquetas: , , ,
1
(1)

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

  • Computador
  • Arduino
  • Cabo USB para ligar a placa Arduino ao PC
  • Módulo RFID RC522

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

  • Vcc <-> 3V3 (ou 5V, dependendo da versão do módulo)
  • RST (Reset) <-> 9
  • GND (Terra) <-> GND
  • MISO (Master Input Slave Output) <-> 12
  • MOSI (Master Output Slave Input) <-> 11
  • SCK (Serial Clock) <-> 13
  • SS/SDA (Slave select) <-> 10

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

How useful was this post?

Click on a star to rate it!

Average rating 1 / 5. Vote count: 1

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?