Controle de acesso por RFID com Arduino

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

* 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 😀

Referências:

Arduino Guide Libraries

Sobre Lucas Soares Gomes 5 artigos
Bacharelando em Ciência da Computação | UFV Campus Florestal (31) 9 9820-1535 l.u.c.a.s.21 - Skype lucas.s.gomes@ufv.br

2 Comentários

Deixe uma resposta

O seu endereço de email não será publicado.


*