Leitura e Escrita com o RFID MIFARE MFRC522
This tutorial is not available in English

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
Lista completa de produtos
comprar
BlackBoard UNO R3
Kit RFID MFRC522 (13,56MHz)
Protoboard 400 Pontos
Jumpers Macho-Macho x40 Cabos
Cabo USB AB 30cm
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:
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.
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.
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.
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).
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.
