Manual
do
Maker
.
com
Faz muito tempo que escrevi sobre esse leitor de RFID no Raspberry. Dessa vez tenho um propósito de uso, que é fazer a maquineta para minha filha usar no banco imobiliário. Bem, eu jogo também, então é para "nós" usarmos. Só que não quero algo básico e também vou fazer 2 implementações diferentes; uma com o RFID RC522 da CurtoCircuito e, a outra, com o material que está a caminho, da AutoCore Robótica - mas vou manter a discrição sobre o material para fazer surpresa. Então o primeiro passo é configurar o RC522 com ESP8266.
Estou usando aqui o ESP8266 e o shield de prototipagem da Eletrogate, do qual já escrevi outros artigos. Essa combinação é ideal porque poderei manter a montagem somente nos jumpers, além de que os furos do shield de prototipagem são ideias para fazer o case, que será cortado na CNC laser da ECNC, a L-560. Visite o site para ver a linha de CNCs, recomendo demais pela qualidade e produção nacional.
Ele opera na frequência de 13.56MHz, então na hora de comprar os RFIDs, basta verificar essa característica.
A tensão de operação é 3v3, o que facilita a interface com o ESP8266. A corrente de operação varia entre 13 e 26mA.
A distância de leitura é de até 3cm. A interface de comunicação é SPI, com taxa de transferência de 10Mbps.
Seu tamanho é inferior a um cartão de crédito, com dimensões de 6CM por 3.9CM.
Esse é o link para o datasheet do RC522.
A conexão é comum, não tem nada de especial, basta fazer assim:
RC522 | Wemos D1 mini |
---|---|
RST/Reset | D3 |
SPI SS | D8 |
SPI MOSI | D7 |
SPI MISO | D6 |
SPI SCK | D5 |
Feito o wiring (claro que isso pode ser feito antes do wiring, mas se seguiu o tutorial), instale a biblioteca MFRC522pelo gerenciador de bibliotecas. Estou mostrando o exemplo de instalação usando o gerenciador de bibliotecas do Arduino, mas pode ser feito pelo PlatformIO sem problemas.
Tem um monte de sketches nos exemplos, só garanta os defines e instância que seguem após a inclusão das bibliotecas:
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN D3
#define SS_PIN D8
MFRC522 mfrc522(SS_PIN, RST_PIN);
...
Esse pinout pode ser redefinido no wiring e então redeclarado no sketch, caso esteja usando esses pinos para outro propósito.
Jumpers nunca são demais, eu os consumo como se espaguetes fossem. Um dos parceiros recomendado para aquisição de jumpers é a Eletrônica Mangili, que você pode acessar através desse link. Eles também vendem o multiplexador CD74HC4067 (desse artigo e mais dois seguidos), com link para o produto aqui.
Uma coisa que gosto bastante de adicionar ao wiring são esses conectores paralelos, que deixam a conexão mais justinha e evitam que os jumpers fiquem se soltando.
Tem de vários tamanhos, mas de 8 posições exatamente eu não tinha. Eles são vendidos pela MASUGUX, que agora está na Shopee.
Para não ter que mudar uma linha sequer, estou usando o NodeMCU com o sketch do próprio exemplo da biblioteca. Só tive que mudar os defines:
#include <Arduino.h>
#include <SPI.h>
#include <MFRC522.h>
#define SS_PIN D8
#define RST_PIN D3
MFRC522 rfid(SS_PIN, RST_PIN); // Instance of the class
MFRC522::MIFARE_Key key;
// Init array that will store new NUID
byte nuidPICC[4];
void printDec(byte *buffer, byte bufferSize);
void printHex(byte *buffer, byte bufferSize);
void setup() {
Serial.begin(9600);
SPI.begin(); // Init SPI bus
rfid.PCD_Init(); // Init MFRC522
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
Serial.println(F("This code scan the MIFARE Classsic NUID."));
Serial.print(F("Using the following key:"));
printHex(key.keyByte, MFRC522::MF_KEY_SIZE);
}
void loop() {
// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
if ( ! rfid.PICC_IsNewCardPresent())
return;
// Verify if the NUID has been readed
if ( ! rfid.PICC_ReadCardSerial())
return;
Serial.print(F("PICC type: "));
MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
Serial.println(rfid.PICC_GetTypeName(piccType));
// Check is the PICC of Classic MIFARE type
if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI &&
piccType != MFRC522::PICC_TYPE_MIFARE_1K &&
piccType != MFRC522::PICC_TYPE_MIFARE_4K) {
Serial.println(F("Your tag is not of type MIFARE Classic."));
return;
}
if (rfid.uid.uidByte[0] != nuidPICC[0] ||
rfid.uid.uidByte[1] != nuidPICC[1] ||
rfid.uid.uidByte[2] != nuidPICC[2] ||
rfid.uid.uidByte[3] != nuidPICC[3] ) {
Serial.println(F("A new card has been detected."));
// Store NUID into nuidPICC array
for (byte i = 0; i < 4; i++) {
nuidPICC[i] = rfid.uid.uidByte[i];
}
Serial.println(F("The NUID tag is:"));
Serial.print(F("In hex: "));
printHex(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
Serial.print(F("In dec: "));
printDec(rfid.uid.uidByte, rfid.uid.size);
Serial.println();
}
else Serial.println(F("Card read previously."));
// Halt PICC
rfid.PICC_HaltA();
// Stop encryption on PCD
rfid.PCD_StopCrypto1();
}
/**
* Helper routine to dump a byte array as hex values to Serial.
*/
void printHex(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], HEX);
}
}
/**
* Helper routine to dump a byte array as dec values to Serial.
*/
void printDec(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
Serial.print(buffer[i] < 0x10 ? " 0" : " ");
Serial.print(buffer[i], DEC);
}
}
A leitura não teve falhas e o sketch guarda as leituras em um array. Lendo 2 vezes o mesmo RFID peguei essa saída:
Agora é hora de implementar o código da maquineta. Aguardem novos artigos!
Fiz um vídeo simples apenas para mostrar a leitura e a sensibilidade do leitor, é realmente impressionante!
Como citado no primeiro parágrafo, esse leitor é da CurtoCircuito. A compra é segura e a CurtoCircuito é parceira de longa data, com ótimos preços.
Até a próxima!
Revisão: Ricardo Amaral de Andrade
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.