Controle de Acesso com Cartão RFID
Esse projeto tem o objetivo de indicar a liberação de acesso de um cartão ou chaveiro RFID. Será lida a UID de cada cartão ou chaveiro e esse valor será comparado com valores de UID previamente registrados no sketch. Para saber o que é a UID e conhecer mais detalhes sobre cartões RFID MIFARE acesse o artigo Cartões RFID e o Módulo MFRC522.
O presente projeto utilizará os seguintes componentes: 1 Arduino Uno, 1 módulo MFRC522, 1 display LCD 16x2, 1 módulo I2C, 1 protoboard de 830 furos e cabos jumpers.
O display LCD indicará a mensagem “Leitor RFID *** pronto *** ” quando o programa for iniciado. Se um cartão (ou chaveiro) RFID tem sua UID liberada, será indicado no display LCD a seguinte mensagem: ”SEU ACESSO LIBERADO”.
Se um cartão (ou chaveiro) RFID tem sua UID não liberada, será indicado no display LCD a seguinte mensagem: “ATENÇÃO ID RECUSADO”. ID é a identificação do cartão ou chaveiro RFID, que nessa atividade é a UID da tag RFID.
Se a UID de um cartão ou chaveiro RFID não é registrada no sketch, esta será lida pelo programa, mas isso não causará alteração na mensagem inicial do display LCD. A indicação de acesso liberado será feita em um display LCD 16x2 conectado ao Arduino através de um módulo I2C.
Figura 1: Modulo MFRC522 ligado ao Arduino. Indicação via display LCD 16x2 conectado através de módulo I2C
A ligação do Arduino ao modulo MFRC522 segue a seguinte ordem:
Tabela 1: Ligações entre o Arduino e o módulo MFRC522
A ligação do Arduino ao modulo I2C segue a seguinte ordem:
Tabela 2: Ligações entre o Arduino e o módulo I2C
Monte cuidadosamente o seu projeto e veja o sketch que faz tudo isso funcionar!
Figura 2: Controle de Acesso com Cartão RFID
O sketch desse projeto encontra-se no final desse artigo! Veja abaixo algumas observações sobre o Código.
O sketch desse projeto contém vários comentários com o objetivo de facilitar seu entendimento. Basicamente, quando uma tag RFID (cartão ou chaveiro) – chamada no programa de PICC (Proximity Integrated Circuit Card) – é aproximada do leitor RFID – chamado de PDC (Proximity Coupling Device) – o sketch lê os dados dessa tag e usa o código da UID (Unique Identifier) para tomar a decisão de registrar no display LCD 16x2 se essa tag está liberada (permitindo o acesso do portador do cartão ou chaveiro) ou se está recusada (não permitindo o acesso do portador do cartão ou chaveiro).
O sketch utiliza quatro bibliotecas com as seguintes funções:
Tabela 3: Bibliotecas usada no projeto
Na parte inicial do sketch temos a inclusão das bibliotecas, a definição dos pinos SS (pino digital 10), RST (pino digital 9) do módulo MFRC522 e é criada a instância MFRC522.
MFRC522 mfrc522(SS_PIN, RST_PIN); // Cria a instancia MFRC522
O nome mfrc522 representa o leitor de RFID.
Ainda no início do sketch é definido que o display LCD usando um módulo I2C tem o endereço 0x27, tendo 16 colunas e 2 linhas.
// Endereco 0x27 do Display LCD de 16 colunas e 2 linhas
LiquidCrystal_I2C lcd(0x27, 16, 2);
Na função setup() temos a inicialização da comunicação serial com o monitor PC, da comunicação SPI, do leitor mfrc522 e do display LCD 16x2. O backlight do display LCD é ligado e a mensagem “Leitor pronto” é impressa no mesmo. Finalmente, a função mensageminicial() é executada. Essa função apenas imprime a mensagem “Leitor RFID” na primeira linha do display LCD e a mensagem “ *** pronto *** “ na segunda linha do display LCD.
Por sua vez, a função loop() começa com o sketch interrogando se existe um novo cartao RFID no leitor.
if ( ! mfrc522.PICC_IsNewCardPresent())
Se uma tag RFID do tipo MIFARE (cartão ou chaveiro) é aproximada do leitor …
if ( ! mfrc522.PICC_ReadCardSerial())
… a UID dessa tag será impressa no monitor PC, lembrando que a UID é formada por bytes. Essa parte do código possui as seguintes principais instruções:
//Mostra UID na serial
Serial.print(“UID da tag :”);
String conteudo= “”; // String de nome conteudo
byte letra;
A string de nome conteudo foi declarada nessa parte. Uma string é uma array (ou matriz) unidimensional de caracteres, terminando com o caracter nulo (‘\0’). Para encontrar cada caracter na string é usado um índice.
Seguindo o sketch, temos o código que imprime no monitor PC os bytes da UID. Note que mfrc522.uid.size representa o tamanho da UID que está no leitor. Os cartões e chaveiros RFID do tipo MIFARE podem tem diferentes tamanhos de UID com 4 ou 7 bytes. Note que no caso apresentado nessa atividade as UID têm tamanho de 4 bytes (UID do Cartão 1: “E5 2E 7F 63″). Os bytes da UID estão na string mfrc522.uid.uidByte[i], cujo índice é i.
// mfrc522.uid.size com o tamanho da UID
// mfrc522.uid.uidByte[i] com os bytes da UID
// A UID do cartao RFID é formada por bytes
// Imprime no monitor do PC os bytes da UID
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));
}
O laço da função for() …
for (byte i = 0; i < mfrc522.uid.size; i++)
… está varrendo os bytes da UID de zero até o tamanho da UID (que está definido como mfrc522.uid.size). A função for() é incrementada de 1 em 1 (i++). Para cada rodada da função for() é impresso no monitor serial um byte da UID, convertido para hexadecimal.
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “);
Serial.print(mfrc522.uid.uidByte[i], HEX);
Os bytes isolados da UID são lidos usando mfrc522.uid.uidByte[i]. Para agrupar esses bytes e formar uma string serão usadas as instruções …
conteudo.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? ” 0″ : ” “));
conteudo.concat(String(mfrc522.uid.uidByte[i], HEX));
A instrução conteudo.concat() lê o byte na posição com i = 0 e guarda na string conteudo.
e5
Depois lê o byte na posição com i = 1 e o coloca ao lado do primeiro byte lido na string conteudo.
e5 2e
E assim por diante, até a leitura o último byte, criando uma string como, por exemplo, “e5 2e 7f 63”. Portanto, esses bytes agrupados – na forma de uma string – serão armazenados na string de nome conteudo.
O sketch continua e imprime a frase “Mensagem : “
Isso é feito com a instrução …
Serial.print(“Mensagem : “);
Em seguida, as letras da string conteúdo são alteradas para que fiquem com letras maiúsculas, com a instrução …
conteudo.toUpperCase();
Isso previne erros no código, uma vez que os bytes das UIDs das tags testadas serão registradas no sketch sempre com letras maiúsculas.
No próximo passo o sketch extrai o conteúdo da string – usando uma substring – e faz os testes de verificação, interrogando se uma tag tem acesso liberado ou recusado. Dessa forma, no conteudo.substring(1) está contida a string da UID da tag lida no leitor de RFID (PDC – Proximity Coupling Device). Na instrução conteudo.substring(1) será obtida uma substring da string conteúdo, começando do índice 1 até o final da string, uma vez que é omitido o índice final.
A instrução que interroga se a UID do chaveiro 3 está liberada ou recusada é a seguinte:
if (conteudo.substring(1) == “43 98 90 79”) //UID 3 – Chaveiro
Dentro da função if() é mostrado que esse chaveiro 3 quando for lido no leitor RFID (PDC) deve ser liberado.
Serial.println(“SEU NUMERO DE ID !”);
Serial.println();
LIBERADO ();
mensageminicial();
Essa rotina imprime a mensagem “SEU NUMERO DE ID !”, executa a função LIBERADO() e a função mensageminicial(). Os detalhes sobre essas funções serão apresentados na final dessas observações. Note que, se desejamos que uma tag seja liberada, devemos incluir seu UID no sketch, como apresentado acima. Portanto, essa rotina foi usada para liberar as tags chaveiro 2, chaveiro 3 e cartão 2. Apenas no caso do cartão 1 o sketch define essa tag como recusada.
if (conteudo.substring(1) == “E5 2E 7F 63”) //UID 1 – Cartao
{
Serial.println(“SEU NUMERO DE ID !”);
Serial.println();
RECUSADO ();
mensageminicial();
}
O sketch interroga se a tag lida é igual a do cartão 1. Se a resposta é verdadeira, o sketch imprime a mensagem “SEU NUMERO DE ID !” e executa as funções RECUSADO() e mensageminicial().
Vejamos, a seguir, as funções acima mencionadas:
Mensageminicial() é uma função que limpa o display LCD, escreve na primeira linha a mensagem ” Leitor RFID ” e escreve na segunda linha a mensagem ” *** pronto *** “.
LIBERADO() é uma função que liga o backlight do display LCD, escreve na primeira linha a mensagem “SEU ACESSO !”, escreve na segunda linha a mensagem “LIBERADO !” e apaga o backlight do display LCD.
RECUSADO() é uma função que liga o backlight do display LCD, escreve na primeira linha a mensagem “ATENÇÃO !”, escreve na segunda linha a mensagem “ ID RECUSADO !” e apaga o backlight do display LCD.
***** ***** *****
Use os desafios desse projeto para crescer e aprender algo novo. Não deixe de enviar suas perguntas em caso de dúvidas. Bem, é isso aí, até a próxima!
…………………………….
Sketch do Projeto
// Programa Identificador de UID de tags RFID e // de Controle de Acesso com leitor RFID // Leitor RFID é o PDC (Proximity Coupling Device) // Cartao RFID é o PICC (Proximity Integrated Circuit Card) // UID (Unique Identifier), identificador unico de cada cartao RFID // Usa display LCD 16x2 com I2C #include <SPI.h> #include <MFRC522.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define SS_PIN 10 // Pino 10 do Arduino ligado ao Slave Select #define RST_PIN 9 // Pino 9 do Arduino ligado ao Reset MFRC522 mfrc522(SS_PIN, RST_PIN); // Cria a instancia MFRC522 // Endereco 0x27 do Display LCD de 16 colunas e 2 linhas LiquidCrystal_I2C lcd(0x27, 16, 2); char st[20]; // Matriz st com 20 elementos void setup() { Serial.begin(9600); // Inicia a serial SPI.begin(); // Inicia a comunicacao SPI // A biblioteca MFRC522 funciona com SPI mfrc522.PCD_Init(); // Inicia MFRC522 Serial.println("Leitor pronto"); Serial.println(); // Inicializa o Display LCD lcd.begin(); // Liga o backlight (luz de fundo) do Display LCD lcd.backlight(); mensageminicial(); // Funcao mensagem inicial } void loop() { // Interroga se existe um novo cartao RFID no leitor if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Le um cartao RFID colocado no leitor if ( ! mfrc522.PICC_ReadCardSerial()) { return; } //Mostra UID na serial Serial.print("UID da tag :"); String conteudo= ""; // String de nome conteudo byte letra; // mfrc522.uid.size com o tamanho da UID // mfrc522.uid.uidByte[i] com os bytes da UID // A UID do cartao RFID é formada por bytes // Imprime no monitor do PC os bytes da UID 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)); } // Imprime "Mensagem: " Serial.println(); Serial.print("Mensagem : "); // Altera o conteudo do string conteudo para letras maiusculas conteudo.toUpperCase(); // Extrai o conteudo da string usando substring // Interroga cartao RFID (testa substring) para liberar ou negar // acesso if (conteudo.substring(1) == "43 98 90 79") //UID 3 - Chaveiro { Serial.println("SEU NUMERO DE ID !"); Serial.println(); LIBERADO (); mensageminicial(); } if (conteudo.substring(1) == "C2 51 E0 30") //UID 2 - Cartao { Serial.println("SEU NUMERO DE ID !"); Serial.println(); LIBERADO (); mensageminicial(); } if (conteudo.substring(1) == "A6 81 FC 55") //UID 4 - Chaveiro { Serial.println("SEU NUMERO DE ID !"); Serial.println(); LIBERADO (); mensageminicial(); } if (conteudo.substring(1) == "E5 2E 7F 63") //UID 1 - Cartao { Serial.println("SEU NUMERO DE ID !"); Serial.println(); RECUSADO (); mensageminicial(); } } // Funcao mensagem inicial void mensageminicial() { lcd.clear(); lcd.print(" Leitor RFID "); lcd.setCursor(0,1); lcd.print(" *** pronto *** "); } // Funcao LIBERADO void LIBERADO() { lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print("SEU ACESSO !"); lcd.setCursor(0,1); lcd.print(" LIBERADO !"); delay(1000); lcd.setBacklight(LOW); delay(2000); } // Funcao RECUSADO void RECUSADO() { lcd.setBacklight(HIGH); lcd.setCursor(0,0); lcd.print(" ATENCAO !"); lcd.setCursor(0,1); lcd.print(" ID RECUSADO !"); delay(1000); lcd.setBacklight(LOW); delay(2000); }

Haroldo Mamede Coutinho Simões
Engenheiro de telecomunicações e pós-graduado em gerenciamento de negócios, tendo trabalhado em empresas de médio e grande porte por mais de 30 anos, atuando em diferentes projetos e departamentos. É instrutor de treinamento, tendo ministrado workshops em várias empresas, professor universitário em cursos MBA presenciais e tutor de cursos à distância. É apaixonado por tecnologia, especialmente pela plataforma Arduino e tudo de positivo que ela pode fazer pelas pessoas quando dela se aproximam.
VEJA TAMBÉM
Regador automático de plantas com Arduino
Aprenda neste artigo, como automatizar a rega de suas plantas, utilizando o Arduino NANO. Este projeto, além do baixo custo, pode ser montado em menos de uma hora e irá garantir que as suas plantas sempre tenham água disponível, garantido um crescimento adequado e...
Datalogger com cartão SD. Registre: temperatura, umidade, luminosidade e tensão)
Neste post, vamos aprender a como montar datalogger, para registrar em um cartão SD, temperatura, umidade relativa, tensão e nível de luminosidade. Esse tipo de dispositivo é extremamente útil para fazer análises de fenômenos que dependem do tempo. Por exemplo,...
Fita de LEDs RGB endereçáveis WS2812B e a biblioteca fastLED
No post de hoje, vamos conhecer a fita de LEDs WS2812B endereçáveis e como utilizá-la com o Arduino UNO. Essa fita de LEDs se destaca, em relação as outras do mercado, pelo fato de que seus LEDs podem ser controlados de maneira individual, permitindo que o...
NEWSLETTER
Assine nossa newsletter e receba as novidades.
0 comentários