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!