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