15 de maio de 2021

Do bit Ao Byte

Embarcados, Linux e programação

RFID RC522 com ESP8266

RC522 com ESP8266

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.

Como usar o RC522 no 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.

Especificações do RC522

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.

Wiring do RC522 com ESP8266

A conexão é comum, não tem nada de especial, basta fazer assim:

RC522Wemos D1 mini
RST/ResetD3
SPI SSD8
SPI MOSID7
SPI MISOD6
SPI SCKD5

Biblioteca MFRC522

Feito o wiring (claro que isso pode ser feito antes do wiring, mas se seguiu o tutorial), instale a biblioteca MFRC522 pelo 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.

Bibliotea MFRC522 para RC522 com ESP8266

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.

RC522 com ESP8266 - jumpers

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.

Código de exemplo do RC522 com ESP8266

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:

leitura do RC522 com ESP8266

Agora é hora de implementar o código da maquineta. Aguardem novos artigos!

Vídeo

Fiz um vídeo simples apenas para mostrar a leitura e a sensibilidade do leitor, é realmente impressionante!

Onde comprar o leitor de RFID RC522?

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