O módulo RC522 RFID é um leitor de cartões inteligentes que permite, entre outras coisas, ativar um mecanismo quando o cartão certo é apresentado ao leitor. Neste tutorial, veremos como usar um módulo RC522 RFID com um cartão NodeMCU ESP8266.
Pré-requisito: Programar o seu NodeMCU com Arduino
Material
- Computador
- NodeMCU ESP8266
- Cabo USB B macho/Micro B macho
- Módulo RFID RC522
Esquema
O módulo RC522 RFID utiliza o protocolo SPI para comunicar com o ESP8266. A comunicação SPI utiliza pinos específicos neste tipo de microcontrolador.
O esquema de ligação é o seguinte (lado esquerdo RC522, lado direito ESP8266):
- Vcc <-> 3V3 (ou Vin(5V), dependendo da versão do módulo)
- RST (Reset) <-> D0
- GND (Terra) <-> GND
- MISO (Master Input Slave Output) <-> D6
- MOSI (Master Output Slave Input) <-> D7
- SCK (Serial Clock) <-> D5
- SS/SDA (Slave select) <-> D8
Atenção: Dependendo da versão do módulo RFID, a tensão de alimentação pode ser diferente (3,3V ou 5V). Verifique a tensão de alimentação do seu módulo.
`Relembrando, o diagrama de ligação da placa ESP8266 é:
Código para leitura de um cartão RFID
Para utilizar o módulo RC522 RFID, utilizamos a biblioteca SPI.h, que permite estabelecer a comunicação entre o cartão ESP8266 e o módulo. Também usamos a biblioteca MFRC522.h, que permite dialogar com o módulo.
#include <SPI.h> #include <MFRC522.h> #define SS_PIN D8 #define RST_PIN D0 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 setup() { Serial.begin(115200); SPI.begin(); // Init SPI bus rfid.PCD_Init(); // Init MFRC522 Serial.println(); Serial.print(F("Reader :")); rfid.PCD_DumpVersionToSerial(); for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } Serial.println(); Serial.println(F("This code scan the MIFARE Classic 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); } }
Resultado
Quando um cartão, crachá ou chip RFID é passado na frente do módulo, o o monitor serial exibe o seu endereço de identificação.
Aplicações
- Desenvolver uma interface web que se ativa somente quando o cartão certo é passado na frente do módulo