Leitura e Escrita com o RFID MIFARE MFRC522




Introdução

Você já precisou guardar uma informação importante, que ninguém poderia saber e não soube onde guardar? É possível deixar sua informação criptografada com o Kit RFID MFRC522 (13,56MHz). Com esse kit é possível fazer a leitura e gravação de dados dentro de uma tag. Neste tutorial, você aprenderá de maneira simples como realizar a leitura e gravação de dados em uma tag RFID de 13,56 MHz.

Observação: Este tutorial é apenas para fins educacionais com tags compatíveis (13,56 MHz). Nunca tente regravar cartões de transporte, bancários ou outros, pois pode ser que algum dado importante do cartão seja apagado e deixe-o inutilizável.

Lista de Materiais

Conceitos teóricos

As tags (cartão e chaveiro) de 13,56 MHz incluídas no kit possuem memória EEPROM de 1 KB, com aproximadamente 768 bytes disponíveis para armazenamento de dados. Essa memória é organizada em 16 setores, cada um contendo 4 blocos de 16 bytes. Cada bloco pode ser regravado inúmeras vezes, permitindo alterar seu conteúdo conforme necessário.

Os blocos de dados são protegidos, daí a popularidade de tags MIFARE. É necessário autenticar o leitor para o setor respectivo antes de ler ou escrever dados em um bloco. Também é possível alterar essas configurações de segurança. Contudo, esse tipo de alteração pode corromper a tag, então é preciso ter cuidado ao trabalhar nos blocos de configuração.

Circuito

Para realizar a leitura ou gravação da tag, através do leitor MFRC522, monte o circuito a seguir:

Circuito
Circuito Elétrico

Biblioteca

Para o projeto deste tutorial, é necessário realizar a instalação da biblioteca do leitor RFID. A biblioteca está disponível para ser instalada diretamente pelo "Gerenciador de Bibliotecas" da Arduino IDE. Para acessá-lo, siga o caminho da imagem abaixo, ou então pressione Ctrl+Shift+I.

Caminho Gerenciador de Bibliotecas
Caminho para o "Gerenciador de Bibliotecas"

Com o gerenciador aberto, digite "MFRC522v2" e, em seguida, clique em instalar a biblioteca desenvolvida por "GithubCommunity". Após alguns instantes, será exibido INSTALADA ao lado do seu nome, indicando que a instalação foi feita com sucesso, conforme mostrado na imagem abaixo.

Biblioteca MFRC522 Encontrada
Biblioteca "MFRC522" Encontrada.

Código

Com a biblioteca adicionada à Arduino IDE e o circuito montado, carregue o código a seguir para sua placa.

Entendendo o Código

Primeiramente, incluímos a biblioteca de comunicação SPI e as bibliotecas MFRC522v2. E então criamos o objeto mfrc522, que será responsável por inicializar o leitor e realizar as operações na tag. Por fim, criamos uma instância de chave MFRC522::MIFARE_Key chamada chave, usada para autenticar a tag antes de ler ou gravar um bloco.

Em seguida declaramos as variáveis que armazenam os pinos conectados aos botões, criamos quatro variáveis do tipo byte, que são: a variável bloco, que irá armazenar o valor que vai ser responsável por definir qual bloco da tag vai ser utilizado; a variável buffer, que é responsável por armazenar temporariamente o conteúdo lido da tag; a variável tamanho, que define o total de caracteres a serem lidos ou gravados na tag; e a última variável texto, que define os dados que serão gravados na tag. O tamanho está definido como 18 bytes, porém é possível gravar apenas 16 bytes em cada bloco, os outros 2 bytes são utilizados como uma verificação "CRC", que é uma "verificação cíclica de redundância para detecção de mudança acidental em cadeias de dados".

Na função setup(), realizamos as configurações iniciais. Primeiro, definimos os pinos dos botões BOTAO_GRAVACAO e BOTAO_LEITURA como entrada e com resistor pull-up interno, o que elimina a necessidade de resistores externos. Em seguida, inicializamos a comunicação serial, a interface SPI e o módulo RFID.

Além disso, definimos a chave de autenticação das tags a serem lidas, com a chave padrão que vem de fábrica. A chave de autenticação padrão (chave A) é usada para acessar os blocos de memória da tag. Essa chave, composta por seis bytes, é necessária tanto para leitura quanto para gravação dos dados. Por fim, exibimos uma mensagem no monitor serial instruindo o usuário a pressionar um dos botões.

No looping do programa, criamos duas condições que verificam se um dos botões foi pressionado. Com o comando if (digitalRead(BOTAO_LEITURA) == 0) verificamos se o botão de leitura é pressionado, e caso seja, chamamos a função leitura() . Já com o comando if (digitalRead(BOTAO_GRAVACAO) == 0), verificamos se o botão de gravação foi pressionado, e caso seja, chamamos a função gravacao(). Além disso, utilizamos a estrutura while após detectar o pressionamento de um botão para evitar leituras múltiplas e imprecisas. Esse processo é conhecido como tratamento de debounce por software.

Na função leitura(), exibimos uma mensagem no Monitor Serial indicando que o modo leitura foi selecionado. Em seguida, chamamos a função esperarTagESelecionar(), que tenta detectar e selecionar uma tag (ler o UID) por um tempo limitado. Esse processo é repetido algumas vezes para aumentar a confiabilidade, pois dependendo da distância, posição da tag ou interferência, a leitura pode falhar mesmo com a tag próxima.

Se uma tag for detectada, o próximo passo é autenticar o bloco de memória que será acessado. Para isso, usamos a função autenticarBloco(), que realiza a autenticação do bloco definido na variável bloco utilizando a chave A (armazenada na variável chave). A autenticação é necessária nas tags MIFARE Classic antes de permitir a leitura ou gravação de dados.

Após autenticar com sucesso, chamamos a função lerBloco16() para ler os 16 bytes do bloco selecionado e armazená-los em um vetor de bytes. Por fim, percorremos esses 16 bytes e os exibimos no Monitor Serial como texto (caracteres ASCII). Ao terminar, chamamos finalizaOperacao() para encerrar a comunicação com a tag e deixar o leitor pronto para a próxima leitura.

Na função gravacao(), o processo inicial é o mesmo da leitura: o programa tenta detectar e selecionar uma tag RFID chamando a função esperarTagESelecionar(). Caso nenhuma tag seja detectada dentro do tempo limite, uma mensagem de erro é exibida no Monitor Serial e a operação é encerrada.

Com a tag selecionada, chamamos a função gravarBloco16Verificado(texto). Essa função é responsável por autenticar o bloco de memória definido na variável bloco utilizando a chave A, gravar os 16 bytes contidos na variável texto e, em seguida, realizar uma nova leitura do mesmo bloco para comparar byte a byte os dados gravados. Dessa forma, garantimos que a gravação foi concluída corretamente.

Por fim, de acordo com o resultado da verificação, o código exibe no Monitor Serial a mensagem de sucesso ou falha. Independentemente do resultado, chamamos a função finalizaOperacao(), que encerra a criptografia e coloca a tag em modo de espera, deixando o leitor pronto para uma nova operação.

O que deve acontecer

Após carregar o código na placa e montar o circuito, abra o Monitor Serial (9600 bps). Pressione o botão de gravação, aproxime a tag do leitor e aguarde a mensagem de sucesso.

Monitor Serial
Resultado Final de Gravação

Para conferir o conteúdo gravado, pressione o botão de leitura e aproxime a mesma tag: os dados aparecerão no serial. Caso deseje gravar uma informação de sua preferência, edite o conteúdo da variável texto, e digite o que deseja. Lembrando que cada bloco do cartão consegue armazenar até 16 caracteres (16 bytes).

Monitor Serial
Resultado Final de Leitura

Indo além

Agora que você sabe como ler e gravar dados em tags RFID, por que não criar um sistema de controle de acesso ou um simulador de créditos? Por exemplo, um sistema onde, ao detectar uma tag com saldo suficiente, um relé é acionado e o saldo é descontado, ideal para catracas, vending machines ou sistemas de bilhetagem.

Conclusão

Neste tutorial, você aprendeu como utilizar o módulo MFRC522 com Arduino para ler e gravar informações em tags RFID. Este é o primeiro passo para desenvolver projetos mais avançados com RFID no mundo maker.

Avatar