Kit RFID com Arduino: Sistema de controle de acesso

Kit RIFD com Arduino

Kit RIFD com Arduino

Os cartões RFID são usados em uma pletora de aplicações na vida cotidiana, desde cartões de crédito até cartões de identificação automática para controle de acesso. Esses cartões possuem uma tarja magnética que armazena dados digitais e podem ser lidos e escritos por meio de ondas de rádio.

RFID é a sigla para: Radio Frequency Identification. É uma tecnologia que pertence a uma área chamada de Automatic Identification and Data Capture(AIDC). Os métodos AIDC identificam objetos e pessoas automaticamente, coletam dados sobre eles e entram com esses dados diretamente em softwares com pouca ou nenhuma intervenção humana.

 

Introdução

 

O  módulo leitor RFID baseado no chip MFRC522 é utilizado para comunicação sem fio a  uma frequência de 13,56MHz. A empresa que desenvolveu o módulo é a NXP, uma das gigantes do setor de semicondutores.  Trata-se de um chip de consumo extremamente baixo e dimensões reduzidas. A sua principal aplicação é a leitura de cartões que utilizam o padrão Mifare.

Com o kit é possível desenvolver e validar projetos de sistemas de controle de acesso, sistemas de segurança e outras variações. As tags RFID podem ser usadas para ler várias informações sobre o portador do cartão, permitindo sua identificação automática para validação ou não do acesso.

Especificações:

  • Corrente de trabalho: 13-26mA / DC 3.3V;
  • Pico de corrente: <30mA;
  • Frequência de operação: 13,56MHz;
  • Tipos de cartões suportados: Mifare1 S50, S70 Mifare1, Mifare UltraLight, Mifare Pro, Mifare Desfire;
  • Parâmetro de Interface SPI;
  • Taxa de transferência: 10 Mbit/s;

Como funciona um módulo RFID

 

Métodos e tecnologias que usam RFID baseiam-se em ondas de rádio para ler e gravar dados. Os sistemas RFID são feitos dos seguintes componentes principais:

  • RFID tag + Antena: Um pequeno circuito integrado embutido no cartão e um antena são usados para armazenar e transmitir dados para o leitor RFID. A Identificação da tag é chamada de UID, trata-se de um número hexadecimal característico de cada cartão ou chaveira RFID;
  • Leitor RFID: O leitor converte as ondas de rádio transmitidas pela antena da tag para um formato que possa ser usado internamente no computador;

Os kits RFID como o usado nessa montagem vem com todos esses componentes. A RFID tag e antena vem integrados no cartão ou numa tag tipo chaveiro.  O módulo leitor também faz parte do kit e é por meio dele que é feita a gravação/leitura de dados. No nosso caso, o leitor é baseado no CI MFRC522(veja o datasheet).

Ao se aproximar o cartão do módulo leitor, a antena transmite os dados na frequência de operação(13,56MHz) para o leitor, que recebe os dados e converte para um formato que possa ser processado pelo CI e manipulado por um MCU externo(Arduino, Raspberry ou outro sistema qualquer).

Aplicações

 

As aplicações vão muito além do controle de acesso. Algumas das mais comuns são:

  • Identificação de produtos em cadeias logísticas;
  • Rastreamento/identificação de produtos no comércio internacional;
  • Medidas de tempo em corridas e maratonas;
  • Eliminação de filas de cadastro em eventos;
  • Controle de acesso;

Para saber mais sobre essas e outras aplicações, recomendamos o blog Atlasrfidstore. Para mais informações sobre a tecnologia RFID, recomendamos este texto da UFRJ e este artigo do Instituto Newton Braga.

Descrição do projeto

 

Montar um circuito para ler um cartão RFID. Fazer um software com arduino para identificar a tag do cartão e apresentar uma mensagem num display LCD de “Acesso Liberado” para a tag salva, ou “Acesso negado”, para qualquer outra tag. Um buzzer também será inserido no circuito para avisar e emitirá beeps para cada situação.

Aspectos de Hardware

 

Vamos precisar dos seguintes materiais para montar o circuito:

De posse de todos os componentes, você pode montar o circuito conforme o diagrama abaixo. A pinagem do RC522 com Arduino é a seguinte:

  • SDA -> 9
  • SCK -> 13
  • MOSI -> 11
  • MISO -> 12
  • RST -> 8

Lembre-se de ligar o Vcc do RFID-RC522 no 3.3V ! O circuito do RFID trabalha com a tensão de 3.3V, e não os 5V tradicionais do Arduino. Daí a necessidade de usar o level shifter bidirecional entre um e outro. Alguns canais são unidirecionais, mas como você já vai usar um circuito de level shifter, recomendamos já comprar um totalmente bidirecional, como o indicado na lista de componentes.

Montagem Cartão RFID + Display LCD

As conexões do LCD estão bem explicitadas no código mais abaixo. Cada pino do LCD está associado a uma macro por meio da qual nós definimos o pino de ligação com o Arduino.

Aspectos de Software

 

O software para carregar no Arduino é o seguinte:

#include <SPI.h>
#include <LiquidCrystal.h>
#include <MFRC522.h>
 
#define LCD_RS 7
#define LCD_E 6
#define LCD_D4 2
#define LCD_D5 3
#define LCD_D6 4
#define LCD_D7 5
#define SDA_PIN  9
#define RST_PIN 8
#define CartaoLiberado " 22 C9 0A 10"
#define AcionaBuzzer 10
#define BeepsLiberado 2
#define BeepsNegado 4

MFRC522 mfrc522(SDA_PIN, RST_PIN);	// Create MFRC522 instance.
 
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
 
char st[20];
void mensageminicial();
String UID= "";
byte letra;
 
void setup() 
{
  pinMode(AcionaBuzzer,OUTPUT);
  Serial.begin(9600);	
  SPI.begin();		
  mfrc522.PCD_Init();	
  lcd.begin(16, 2);  
  StandardMessage();
}
 
void loop() 
{
  
  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  
  getUID();  //separa a string com o UID para ser testada

  if (UID == CartaoLiberado) 
  {
    lcd.clear();
    lcd.setCursor(0,0);
    //Mostra mensagem de acesso liberado  e aciona buzzer
    lcd.print("Acesso Liberado!");
    BuzzerBeeps(BeepsLiberado);
    delay(2000);
    StandardMessage();
  }
  else
  {
    lcd.clear();
    lcd.setCursor(0,0);
    //Mostra mensagem de acesso negado e aciona buzzer
    lcd.print("Acesso Negado!");
    BuzzerBeeps(BeepsNegado);
    delay(2000);
    StandardMessage();
  }
  
  delay(1000);
} 

void StandardMessage()
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" Pronto para");  
  lcd.setCursor(0,1);
  lcd.print(" Leitura!");  
}

void getUID()
{
  Serial.print("UID da tag : ");
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
    
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     if( mfrc522.uid.uidByte[i] < 0x10)
       UID.concat(" 0");
     else
       UID.concat(" ");
      
    // conteudo.concat( String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     UID.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  UID.toUpperCase();
  Serial.println(" ");
}

void BuzzerBeeps(int NumeroBeeps)
{
  int i;
  for(i=0; i<NumeroBeeps; i++)
  {
    digitalWrite(AcionaBuzzer, HIGH);
    delay(500);
    digitalWrite(AcionaBuzzer, LOW);
    delay(500);
  }
}


Funções Setup() e Lopp()

 

Na função void setup() nós fazemos todas as inicializações necessários:

  • LCD;
  • Porta serial;
  • mfrc522;
  • Pinos de entrada e saída;

Além disso, nós já chamamos a função StandardMessage() para exibir uma mensagem padrão no LCD.

Na função void Loop(), temos dois if’s que estão presentes em todos os exemplos de programas da biblioteca MFRC522.h. Nesses dois if’s são chamadas as funções específicas da biblioteca para procurar por algum cartão nas proximidades do leitor e selecionar/ler esse cartão, caso o mesmo esteja presente.

Após essa primeira etapa, chamamos a função getUID(), na qual nós separamos os bytes de identificação do cartão lido em uma string de nome UID. Além disso, nós apresentamos esse UID na porta serial. Caso você não saiba ainda qual o UID do seu cartão, a primeira vez que você rodar o programa, sempre que você aproximar o cartão do leitor vai aparecer a mensagem de acesso negado, pois o UID que está no programa(22 C9 0A 10) é do cartão que usamos na elaboração do post. Basta você abrir o terminal serial e aproximar o cartão do leitor, assim o UID do seu cartão será exibido no terminal serial e você pode substituir a flag CartaoLiberado no programa pelo seu UID. Após carregar o programa com a flag atualizada, a mensagem exibida para o seu cartão será de “Acesso Liberado”.

De posse do UID do cartão lido, nós fazemos um if-else para saber se esse UID é o mesmo que está salvo no programa(na flagCartaoLiberado). Se for o mesmo, o programa mostra a mensagem “Acesso Liberado” e dispara 2 beeps com o buzzer. Se for qualquer outro cartão, é mostrada a mensagem “Acesso  Negado” e disparamos 4 beeps com o Buzzer,

Funções auxiliares

 

Temos três funções auxiliares, são elas;

  • BuzzerBeeps(int NumeroBeeps);
  • StandardMessage();
  • getUID();

A função BuzzerBeeps é para acionar o buzzer um determinado número de vezes. O parâmetro NumeroBeeps é o número de vezes que o buzzer será acionado com um intervalo de 500ms(você pode ajustar o intervalo se quiser).

A função StandarMessage() mostra uma mensagem padrão no LCD, dizendo: ” Pronto para Leitura”;

Por fim, a função getUID(), como dissemos mais acima, utiliza a função mfrc522.uid.uidByte[i] da biblioteca MFRC522.h para acessar as informações lidas do cartão anteriormente(esses dados foram lidos com a função mfrc522.PICC_ReadCardSerial(), no início do void loop)

Botando pra rodar!

 

O UID do cartão será exibido no terminal serial como a seguir:

A montagem pode ficar um pouco mais cheia do que o normal, devido aos fios para conectar o RF522 aos level shifters e deles ao Arduino. Mas esperamos que você veja uma mensagem como a mostrada abaixo:

 

Montagem RFID com arduino

Montagem RFID com arduino

Considerações finais

 

Antes de fecharmos mais esse post, fica a recomendação de leitura dos exemplos disponibilizados na biblioteca MFRC522.h. Ao fazer o download do arquivo e extraí-lo para seu computador, uma pasta chamada “examples” poderá ser acessada. Nela estão vários exemplos de programas com aplicações de RFID com arduino. A partir dos códigos de exemplo, é possível criar aplicações próprias e aprender muito mais sobre essa tecnologia.

Se tiver alguma dúvida mais, ou tiver alguma sugestão de melhoria ou correção, deixe nos comentários e compartilhe com os demais leitores.



Faça sua avaliação.
Por favor, aguarde...
Vitor Vidal
Vitor Vidal
Engenheiro eletricista, mestrando em eng. elétrica e apaixonado por eletrônica, literatura, tecnologia e ciência. Divide o tempo entre pesquisas na área de sistemas de controle, desenvolvimento de projetos eletrônicos e sua estante de livros.
  • Cristiano Closs

    Ótimo post…
    Boa noite… tu terias algum exemplo para gravar algum dado no cartão, já olhei alguns por aí… e tbm já escrevi o meu… mas nnão consegui gravar…. ler os cartões… eu gravar os cartões no SD e botar pra rodar blz…mas gostaria de poder gravar tbm no cartão…

    Faça sua avaliação.
    Por favor, aguarde...
    • Vitor Vidal

      Bom dia, Cristiano, obrigado pelo comentário.

      No arquivo da biblioteca MC552.h há um exemplo chamado ReadAndWrite que acredito ser útil para você. A biblioeca está neste link:

      Alguns exemplos que encontrei que podem te ajudar também são esses:
      https://www.cooking-hacks.com/documentation/tutorials/how-to-store-read-data-on-rfid-tags-nfc-rfid-13-56mhz/
      https://www.youtube.com/watch?v=uihjXyMuqMY

      Estão em inglês, mas os códigos podem ser visualizados facilmente se isso for problema. Pesquisando por exemplos em inglês as chances de encontrar bons exemplos são maiores.

      Espero ter ajudado.
      Abraço

      Faça sua avaliação.
      Por favor, aguarde...
    • Vitor

      Bom dia, Cristiano, obrigado pelo comentário.

      No arquivo da biblioteca MC552.h há um exemplo chamado ReadAndWrite que acredito ser útil para você. A biblioeca está neste link:

      Alguns exemplos que encontrei que podem te ajudar também são esses:
      https://www.cooking-hacks.com/documentation/tutorials/how-to-store-read-data-on-rfid-tags-nfc-rfid-13-56mhz/
      https://www.youtube.com/watch?v=uihjXyMuqMY

      Estão em inglês, mas os códigos podem ser visualizados facilmente se isso for problema. Pesquisando por exemplos em inglês as chances de encontrar bons exemplos são maiores.

      Espero ter ajudado.
      Abraço

      Faça sua avaliação.
      Por favor, aguarde...
    • Vitor

      Bom dia, Cristiano, obrigado pelo comentário.
      No arquivo da biblioteca MC552.h há um exemplo chamado ReadAndWrite que acredito ser útil para você. A biblioeca está neste link:
      Alguns exemplos que encontrei que podem te ajudar também são esses:
      https://www.cooking-hacks.com/documentation/tutorials/how-to-store-read-data-on-rfid-tags-nfc-rfid-13-56mhz/
      https://youtu.be/uihjXyMuqMY

      Estão em inglês, mas os códigos podem ser visualizados facilmente se isso for problema. Pesquisando por exemplos em inglês as chances de encontrar bons exemplos são maiores.
      Espero ter ajudado.
      Abraço

      Faça sua avaliação.
      Por favor, aguarde...