É hora de assumir o controle utilizando uma tecnologia bastante útil no mundo Maker: o RFID.
No tutorial de hoje vamos aprender a desenvolver um sistema de controle de acesso usando um Arduino Nano, um Módulo RFID, um Buzzer ou Módulo Buzzer, um Led Vermelho, um Led Verde, uma Protoboard(Opcional) e Jumpers.
O Módulo RFID contém 2 pinos de alimentação, sendo 1 positivo (3.3 V) e 1 negativo (GND -); 1 pino SDA; 1 pino SCK; 1 pino MOSI; 1 pino MISO; 1 pino IRQ; e 1 pino RST. A configuração dos pinos nas entradas do Arduino segue conforme a tabela abaixo:
A biblioteca SPI.h é responsável pela manipulação das portas do módulo e do Arduino.
Nesse tutorial estamos utilizando os seguintes componentes:
-
Buzzer ou Módulo Buzzer;
-
Protoboard(Opcional).
* O Arduino Nano pode ser substituído por um Arduino Uno, um Arduino Mega ou um Arduino de qualquer outra versão compatível.
Montando o projeto
O sistema é fácil de ser implementado tendo em mãos todos os componentes listados. Um ponto importante que deve ser seguido é a pinagem mostrada na tabela acima. O esquemático eletrônico está abaixo para referência:
Mergulhando no Projeto
Software
A IDE do Arduino foi utilizada para programar nosso sistema. Primeiramente incluímos as bibliotecas responsáveis pela manipulação das entradas e do Módulo RFID, que tem sua própria biblioteca. Incluímos a biblioteca SPI.h e a MFRC522.h pode ser incluída navegando através do menu Sketch→Incluir Biblioteca → Adicionar Biblioteca .ZIP e selecione o arquivo .ZIP que pode ser baixado em neste link.
Feito a inclusão das bibliotecas corretas, iremos definir constantes para os leds, o buzzer e os pinos SDA(ou SS) e RST. Para armazenarmos a identificação (ID) das tags do chaveiro e do cartão que acompanham o Módulo RFID, criamo a variável tagID (Armazena o ID da Tag) e o vetor tagsPermitidas[] contendo as tags que você fará a leitura na primeira vez que inicializar o programa. Como iremos fazer uma verificação através de uma estrutura de repetição usamos uma variável booleana para liberar ou não dependendo do seu valor. Criamos então uma nova instância da biblioteca MFRC522 e passamos como parâmetro as constantes dos pinos SDA e RST.
A partir de agora entraremos na função de inicialização do Arduino, a função setup. Na função setup vamos inicializar a comunicação serial através do comando Serial.begin(9600), assim como a comunicação SPI com o comando SPI.begin(); e, por último mas não menos importante(ÓBVIO!), inicializamos o leitor pela variável usada na instância da biblioteca. Declaramos os pinos dos leds e do buzzer como saída(Output) e então podemos programar a função de leitura dentro do loop.
As funções PICC_IsNewCardPresent() e PICC_ReadCardSerial() verificam se há uma tag presente no sensor. Para a leitura das tags vamos criar uma função e inicializar a tagID como vazia (“”) e para armazenar os valores das tags usamos a função uid e armazenamos então na variável tagID. Comparamos a tag lida com os valores do vetor através da estrutura de repetição “for” e atribuímos true a variável caso a tag esteja no vetor. A última verificação executa as funções de acesso liberado e acesso negado dependendo do valor da variável booleana de liberação.
As funções acessoLiberado() e acessoNegado() simplesmente escrevem nos pinos dos leds e do buzzer(na frequência 1500hz) os valores de ligado ou desligado. Abaixo segue o código deste tutorial:
#include <SPI.h> #include <MFRC522.h> #define verde 6 #define vermelho 7 #define buzzer 8 #define sda 10 #define rst 9 String tagID = ""; bool liberado = false; //Vetor de ID's cadastrados String tagsPermitidas[] = {"3d7f7d63","75f8375f"}; MFRC522 RFID(sda, rst); void setup() { Serial.begin(9600); // Comunicação Serial SPI.begin(); // Comunicacao SPI RFID.PCD_Init(); // Leitor RFID pinMode(verde, OUTPUT); pinMode(vermelho, OUTPUT); pinMode(buzzer, OUTPUT); } void loop() { // Verificação de existência de tag if ( !RFID.PICC_IsNewCardPresent() || !RFID.PICC_ReadCardSerial() ) { delay(50); return; } tagID = ""; // Estrutura de repetição padrão para coleta dos valores das tags pela função uid for (byte i = 0; i < RFID.uid.size; i++) { tagID.concat(String(RFID.uid.uidByte[i], HEX)); } // Estrutura de repetição para comparação com as tags que permitimos no vetor for (int i = 0; i < (sizeof(tagsPermitidas)/sizeof(String)); i++) { if( tagID.equalsIgnoreCase(tagsPermitidas[i]) ){ liberado = true; //Libera tag } } if(liberado == true){ acessoLiberado(); Serial.println("Tag Cadastrada: " + tagID); //Exibe a mensagem "Tag Cadastrada" e o ID da tag não cadastrada } else{ acessoNegado(); Serial.println("Tag Não Cadastrada: " + tagID); //Exibe a mensagem "Tag Cadastrada" e o ID da tag não cadastrada } delay(1000); //1 seg até a próxima leitura } void acessoLiberado(){ int bips = 1; //quantidade de bips for(int j=0; j < bips; j++){ tone(buzzer,1500); //Liga buzzer digitalWrite(verde, HIGH); delay(100); noTone(buzzer); //Desliga buzzer digitalWrite(verde, LOW); delay(500); } liberado = false; } void acessoNegado(){ int bips = 2; //quantidade de bips for(int j=0; j < bips; j++){ tone(buzzer,500); //Liga buzzer digitalWrite(vermelho, HIGH); delay(100); noTone(buzzer); //Desliga buzzer digitalWrite(vermelho, LOW); delay(100); } }
O código do projeto pode ser encontrado em nosso repositório no GitHub.
Hardware
A leitura das tag deve ser próxima o suficiente(máx 3cm) do Módulo RFID. No sistema usamos o Arduino Nano que pode ser substituído por um Arduino Uno, um Arduino Mega ou um Arduino de qualquer outra versão compatível. O buzzer pode ser substituído por um Módulo Buzzer ligando-o nos 5v.
Conclusão
Os sistemas de leitura de tags são bastante comuns hoje em dia na indústria, comércio e transporte, como pode ser visto nos pedágios automáticos onde a única diferença é uma antena para detecção de tags em uma distância maior. Portanto, o aprendizado e implementação do sistema utilizando o Módulo RFID é super interessante 😀
Gostei muito. ótima explicação.
Pode adicionar pra nós, neste projeto, rotina para gravar logs dos cartões com data e hora locais?
Olá Marcos!
Ficamos muito feliz que tenha gostado do projeto!
Anotamos sua sugestão para uma futura versão 2.0!
Abraço!