RFID (Radio Frequency IDentification ou Identificação por radiofrequência) é uma tecnologia que utiliza sinais de rádio e uma etiqueta (tag) RFID para leitura e gravação de dados, e neste post vamos mostrar como montar um controle de acesso usando módulo RFID RC522 juntamento com placa Arduino.
A forma mais comum de utilização do RFID é na identificação de produtos, onde uma tag pode conter informações como código do produto, procedência, data de validade, fabricante, etc. Mas a sua utilização não se restringe a isso. Podemos usar etiquetas RFID em animais para fins de rastreamento, em veículos no conhecido sistema Sem Parar, em passaportes, rastreamento de cargas, controle de acesso e em várias outras aplicações.
O módulo RFID RC522 para Arduino é capaz de ler tags que operam na frequência de 13,56 Mhz, e suporta cartões do tipo Mifare1 S50, Mifare1 S70 Mifare Ultralight, Mifare Pro e Mifare DESFire.
Ligação do módulo RFID ao Arduino
O módulo RFID RC522 utiliza a interface SPI para comunicação com o Arduino por meio dos pinos digitais de 10 à 13, além do pino 9 ligado ao RST do módulo. Veja na imagem abaixo a disposição dos pinos e a ligação ao Arduino, com os pinos suportados pela biblioteca MFRC522, que utilizaremos no nosso programa de controle de acesso:
Atenção à alimentação do módulo, que é feita por meio do pino 3.3V do Arduino.
Controle de acesso com RFID
Vamos testar o módulo RFID montando um controle de acesso utilizando o Arduino Uno e que verifica o número da tag e libera (ou não), a passagem por uma cancela controlada por um servo motor (microservo 9G):
Esse controle de acesso utiliza o circuito abaixo, lembrando mais uma vez que a alimentação do módulo RFID é feita por meio do pino 3.3V, e o servo motor é alimentado por 5V, por isso atenção na montagem para não inverter as ligações:
Reconhecendo as tags e controlando o servo motor
No programa utilizamos a biblioteca Servo, já presente na IDE do Arduino, e também a biblioteca MFRC522, que você encontra nesse link.
Adicionamos dois leds para mostrar se o acesso foi liberado (led verde, ligado à porta 5), ou negado (led vermelho piscante, ligado à porta 6).
Para adaptar o programa à sua tag, verifique no serial monitor o número (UID) da tag lida pelo sensor, e então coloque esse número nessa linha, no lugar do “D8 4B 12 22”:
if (conteudo.substring(1) == “D8 4B 12 22”)
Como temos dois cartões, adicionamos duas entradas idênticas e mudamos apenas o número do UID em cada uma delas, com um dos cartões com acesso liberado e que aciona o servo motor, movimentando o mesmo em 90 graus, e outro com acesso negado, que pisca o led vermelho.
// Programa : RFID - Controle de acesso / cancela
// Autor : Arduino e Cia
#include <SPI.h>
#include <MFRC522.h>
#include <Servo.h>
Servo microservo9g;
#define SS_PIN 10
#define RST_PIN 9
// Definicoes pino modulo RC522
MFRC522 mfrc522(SS_PIN, RST_PIN);
// Leds indicadores acesso liberado ou negado
int led_liberado = 5;
int led_negado = 6;
char st[20];
void setup()
{
pinMode(led_liberado, OUTPUT);
pinMode(led_negado, OUTPUT);
// Define que o servo esta ligado a porta digital 3
microservo9g.attach(3);
// Move o servo para a posicao inicial (cancela fechada)
microservo9g.write(90);
// Inicia a serial
Serial.begin(9600);
// Inicia SPI bus
SPI.begin();
// Inicia MFRC522
mfrc522.PCD_Init();
// Mensagens iniciais no serial monitor
Serial.println("Aproxime o seu cartao do leitor...");
Serial.println();
}
void loop()
{
// Aguarda a aproximacao do cartao
if ( ! mfrc522.PICC_IsNewCardPresent())
{
return;
}
// Seleciona um dos cartoes
if ( ! mfrc522.PICC_ReadCardSerial())
{
return;
}
// Mostra UID na serial
Serial.print("UID da tag :");
String conteudo= "";
byte letra;
for (byte i = 0; i < mfrc522.uid.size; i++)
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.println();
Serial.print("Mensagem : ");
conteudo.toUpperCase();
// Testa se o cartao1 foi lido
if (conteudo.substring(1) == "D8 4B 12 22")
{
// Levanta a cancela e acende o led verde
microservo9g.write(-90);
digitalWrite(led_liberado, HIGH);
Serial.println("Cartao1 - Acesso liberado !");
Serial.println();
delay(3000);
microservo9g.write(90);
digitalWrite(led_liberado, LOW);
}
// Testa se o cartao2 foi lido
if (conteudo.substring(1) == "87 4B DC 8A")
{
Serial.println("Cartao2 - Acesso negado !!");
Serial.println();
// Pisca o led vermelho
for (int i= 1; i<5 ; i++)
{
digitalWrite(led_negado, HIGH);
delay(200);
digitalWrite(led_negado, LOW);
delay(200);
}
}
delay(1000);
}
Abaixo, o serial monitor mostrando os dados referentes às tags que foram liberadas ou negadas:
Esse projeto pode ser melhorado adicionando-se um sensor infravermelho para detectar a passagem de veículos/pessoas/objetos pela cancela, ou um display para contagem de acessos. Abaixo, circuito em funcionamento:
Gostou? Confira outros posts usando RFID aqui mesmo no Arduino e Cia!