Gravando no cartão RFID com Arduino
Olá, tudo bem? Hoje voltaremos a trabalhar com a tecnologia RFID através de uma aplicação onde estaremos gravando dados no cartão RFID.
Basicamente, iremos utilizar as nossas tags que você adquiriu com o nosso Módulo Leitor RFID MFRC522 e gravar dados como o nosso nome ou horários, por exemplo.
Além disso, é importante que você já tenha visto o nosso post onde explicamos detalhadamente o funcionamento dessa tecnologia. Nele, toda a explicação do esquema de ligação que iremos utilizar no projeto de hoje. Clique então no botão abaixo para acessá-lo.
Detalhes importantes
Em primeiro lugar, fique calmo. Porque antes de começarmos a colocar a mão na massa, é importante esclarecer alguns pontos importantes e também dúvidas que podem surgir. A primeira dúvida é com relação aos dados que veio com a sua tag. Essas informações irão sumir sim. Então é importante você utilize uma tag “reserva”.
Em segundo lugar, fique atento. Pois uma dúvida que sempre surge é com relação a distância segura para realizar a leitura da tag, a resposta para essa dúvida é que ele tem uma distância pequena, até 5 cm.
Outro ponto importante é em relação a cartões que utilizam essa tecnologia, isso porque essa experiência pode danificar eternamente cartões de passe, crédito, pulseiras e crachás. Portanto, deixe bem longe da experiência esses itens.
Gravando no cartão RFID – Componentes do Projeto
- 01x Arduino UNO
- 01x KIT Módulo RFID
- 01x Protoboard
- 01x Display LCD
- 02X Push Botton
- 01x Potenciômetro de 10K
- Alguns Jumpers
Montagem do Circuito
Antes de tudo, vamos partir para a ligação do esquemático de hoje que é praticamente a mesma utilizada no post onde explicamos a utilização do módulo RFID.
Entretanto, o pequeno adicional que fizemos foi de colocar dois push button para indicar o que nosso módulo deve fazer (ler / gravar). Contudo, você pode trocar os push button por outros componentes que trabalham como interruptores.
Código do Projeto Comentado
Antes de mais nada, mais um aviso, esse é o último, eu juro! Se você viu em nosso post sobre o módulo RFID, é preciso instalar uma biblioteca para utilizá-lo. Então, caso não tenha baixado ela, clique no botão abaixo e realize a sua instalação.
<code>/* Projeto: Realizando leitura e gravação de cartões RFID Autor: Danilo Nogueira - AutoCore Robótica Data: 04/02/2020 Código de Dominio Público. */ // ==================================================================================================*/ // --- Declaração Bibliotecas --- #include <SPI.h> // Biblioteca para realizar a comunicação #include <MFRC522.h> // Biblioteca para utilizar os comandos do módulo #include <LiquidCrystal.h> // Biblioteca do display LCD // ================================================================================================== // --- Declaração das Variáveis --- // Pinos de pin_ss e Reset do módulo MFRC522 int pin_ss = 10; int pin_reset = 9; MFRC522 moduloRFID(pin_ss, pin_reset); // Criando um objeto 'moduloRFID' da classe MFRC522. LiquidCrystal lcd(6, 7, 5, 4, 3, 2); // Iniciando o objeto 'lcd' com os pinos do dispay. // Pinos dos push button utilizados. float btn_leitura = A0; float btn_gravar = A1; // Variável para trabalharmos com a chave de acesso da TAG. MFRC522::MIFARE_Key key; // ================================================================================================== // --- Configurando o void setup() --- void setup() { pinMode(btn_leitura, INPUT); pinMode(btn_gravar, INPUT); Serial.begin(9600); // Inicia a serial SPI.begin(); // Inicia o barramento SPI // Iniciando o módulo moduloRFID.PCD_Init(); //Inicializa o LCD 16x2 lcd.begin(16, 2); mensageminicial(); //Prepara chave - padrao de fabrica = FFFFFFFFFFFFh for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF; } // ================================================================================================== // --- Configurando o void loop() --- void loop() { /* Agora dentro no loop, devemos sempre estar verificando * qual botão foi pressionado. Para então, dizer ao * módulo o que ele deve fazer. */ // Verificando se o botão leitura foi pressionado int modo_le = digitalRead(btn_leitura); delay(150); if (modo_le != 0) { lcd.clear(); Serial.println("Modo leitura selecionado"); lcd.setCursor(2, 0); lcd.print("Modo leitura"); lcd.setCursor(3, 1); lcd.print("selecionado"); while (digitalRead(btn_leitura) == 1) {} delay(3000); // Chamanda a função 'modo_leitura' modo_leitura(); } // Verificando se o botao gravacao foi pressionado int modo_gr = digitalRead(btn_gravar); if (modo_gr != 0) { lcd.clear(); Serial.println("Modo gravacao selecionado"); lcd.setCursor(2, 0); lcd.print("Modo gravacao"); lcd.setCursor(3, 1); lcd.print("selecionado"); while (digitalRead(btn_gravar) == 1) {} delay(3000); modo_gravacao(); } } // fim void loop // ================================================================================================== // --- Configurando as funções --- void mensageminicial() { Serial.println("Selecione o modo do operação leitura ou gravacao..."); Serial.println(); lcd.clear(); lcd.print("Selecione o modo"); lcd.setCursor(0, 1); lcd.print("leitura/gravacao: "); } void mensagem_inicial_cartao() { Serial.println("Aproxime o seu cartao do leitor..."); lcd.clear(); lcd.print(" Aproxime o seu"); lcd.setCursor(0, 1); lcd.print("cartao do leitor"); } void modo_leitura() { // chama a função 'mensagem_inicial_cartao' mensagem_inicial_cartao(); //Aguarda o cartao ser aproximado while ( ! moduloRFID.PICC_IsNewCardPresent()) { delay(100); } if ( ! moduloRFID.PICC_ReadCardSerial()) { return; } //Mostra UID na serial Serial.print("UID da tag : "); String conteudo = ""; byte letra; // Realiza a leitura de todo o conteúdo da TAG for (byte i = 0; i < moduloRFID.uid.size; i++) { Serial.print(moduloRFID.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(moduloRFID.uid.uidByte[i], HEX); // Agrupando o conteudo lido conteudo.concat(String(moduloRFID.uid.uidByte[i]<0x10 ? " 0" : " ")); conteudo.concat(String(moduloRFID.uid.uidByte[i], HEX)); } Serial.println(); // Obtem os dados do setor 1, bloco 4 = Nome byte sector = 1; byte blockAddr = 4; byte trailerBlock = 7; byte status; byte buffer[18]; byte size = sizeof(buffer); // Autenticacao usando chave inicial do código status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(moduloRFID.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); return; } // Realiza a leitura do block (que nesse caso é o bloco 4) status = moduloRFID.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); } // Mostra os dados do nome no Serial Monitor e LCD lcd.clear(); lcd.setCursor(0, 0); Serial.print("O nome cadastrado foi: "); // Os valores lido em 'status' serão convertidos e mostrados no display for (byte i = 1; i < 16; i++) { Serial.print(char(buffer[i])); lcd.write(char(buffer[i])); } // Obtem os dados do setor 0, bloco 1 = Sobrenome sector = 0; blockAddr = 1; trailerBlock = 3; // Autenticacao usando chave inicial status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(moduloRFID.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); return; } status = moduloRFID.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Read() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); } // Mostra os dados do sobrenome no Serial Monitor e LCD lcd.setCursor(0, 1); for (byte i = 0; i < 16; i++) { Serial.print(char(buffer[i])); lcd.write(char(buffer[i])); } Serial.println(); // Halt PICC moduloRFID.PICC_HaltA(); // Stop encryption on PCD moduloRFID.PCD_StopCrypto1(); // Espera 3 segundos e inicia a verificação delay(3000); mensageminicial(); } void modo_gravacao() { mensagem_inicial_cartao(); //Aguarda cartao while ( ! moduloRFID.PICC_IsNewCardPresent()) { delay(100); } if ( ! moduloRFID.PICC_ReadCardSerial()) return; //Mostra UID na serial Serial.print(F("UID do Cartao: ")); //Dump UID for (byte i = 0; i < moduloRFID.uid.size; i++) { Serial.print(moduloRFID.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(moduloRFID.uid.uidByte[i], HEX); } // Mostra o tipo do cartao Serial.print(F("nTipo do PICC: ")); byte piccType = moduloRFID.PICC_GetType(moduloRFID.uid.sak); Serial.println(moduloRFID.PICC_GetTypeName(piccType)); byte buffer[34]; byte block; byte status, len; Serial.setTimeout(20000L) ; Serial.println(F("Digite o sobrenome + o caractere #")); lcd.clear(); lcd.print("Digite o sobreno"); lcd.setCursor(0, 1); lcd.print("me + #"); // Guarda todo o texto antes de '#' na variavel 'buffer' len = Serial.readBytesUntil('#', (char *) buffer, 30) ; for (byte i = len; i < 30; i++) buffer[i] = ' '; // Gravando o sobrenome no bloco 1 (que depois iremos ler também no bloco 1) block = 1; status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(moduloRFID.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); return; } // Gravando no bloco selecionado (1) status = moduloRFID.MIFARE_Write(block, buffer, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); return; } // Agora selecionamos o bloco 2 para a gravação block = 2; status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(moduloRFID.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); return; } // Gravando no bloco selecionado (2) status = moduloRFID.MIFARE_Write(block, &buffer[16], 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); return; } Serial.println(F("Digite o nome + o caractere #")); lcd.clear(); lcd.print("Digite o nome e"); lcd.setCursor(0, 1); lcd.print("em seguida #"); // Segue o mesmo esquema que usamos para armazenos o valor do sobrenome len = Serial.readBytesUntil('#', (char *) buffer, 20) ; for (byte i = len; i < 20; i++) buffer[i] = ' '; // Agora vamos gravar nos blocos 4 e 5 o nosso nome block = 4; status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(moduloRFID.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); return; } // Gravando no bloco 4 status = moduloRFID.MIFARE_Write(block, buffer, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); return; } block = 5; status=moduloRFID.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(moduloRFID.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("PCD_Authenticate() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); return; } // Gravando no bloco 5 status = moduloRFID.MIFARE_Write(block, &buffer[16], 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("MIFARE_Write() failed: ")); Serial.println(moduloRFID.GetStatusCodeName(status)); //return; } // Se tudo ocorreu bem, aparece a mensagem abaixo no display else { Serial.println(F("Parabéns, os seus dados foram gravados com sucesso!")); lcd.clear(); lcd.print("Gravacao OK!"); } moduloRFID.PICC_HaltA(); // Halt PICC moduloRFID.PCD_StopCrypto1(); // Stop encryption on PCD // Após 5 segundos, realiza novamente a verificação delay(5000); mensageminicial(); }</code>
Resultado do Projeto
Por fim, para finalizar o projeto de hoje, deixo abaixo o vídeo de nosso canal mostrando o funcionamento de todo o projeto.
Gostou do post? Caso tenha ficado algo incompleto para você, comente abaixo 📝
Dicas? Dúvidas? 🤔 Críticas? 😱 Só comentar abaixo! 👇
Forte abraço e compartilha se gostou! 🤘