Controle de Acesso com Cartão RFID | Modulo Eletrônica

Controle de Acesso com Cartão RFID

Publicado: 15/08/2019

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!

…………………………….


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
// 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);
}
Voltar