O módulo RC522 RFID é um leitor de cartões inteligentes que, entre outras coisas, permite ativar um mecanismo quando o cartão certo é apresentado ao leitor. Neste tutorial, veremos como usar o módulo RC522 RFID com um cartão NodeMCU ESP32.
Pré-requisito: Programar o seu NodeMCU com Arduino
Material
- Computador
- Cartão ESP32 NodeMCU
- Cabo USB A macho/ Micro B macho
- módulo RFID RC522
Esquema
O módulo RC522 RFID se comunica com o ESP32 por meio do protocolo SPI. A comunicação SPI utiliza pinos específicos neste tipo de microcontrolador.
A ligação é feita da seguinte forma (lado esquerdo RC522, lado direito ESP32):
- Vcc <-> 3V3 (ou Vin(5V), dependendo da versão do módulo)
- RST (Reset) <-> D0
- GND (Masse) <-> GND
- MISO (Master Input Slave Output) <-> 19
- MOSI (Master Output Slave Input) <-> 23
- SCK (Serial Clock) <-> 18
- SS/SDA (Slave select) <-> 5
Atenção: Dependendo da versão do módulo RFID, a tensão de alimentação pode mudar (3,3V ou 5V). Verifique a tensão de alimentação do seu módulo.
Para lembrar, este é o diagrama de ligação do cartão ESP32:
Código para ler um cartão RFID
Para usar o módulo RC522 RFID, utilizamos a biblioteca SPI.h , que permite estabelecer a comunicação entre o cartão ESP32 e o módulo. Também usamos a biblioteca MFRC522.h, que permite dialogar com o módulo.
//Libraries #include <SPI.h>//https://www.arduino.cc/en/reference/SPI #include <MFRC522.h>//https://github.com/miguelbalboa/rfid //Constants #define SS_PIN 5 #define RST_PIN 0 //Parameters const int ipaddress[4] = {103, 97, 67, 25}; //Variables byte nuidPICC[4] = {0, 0, 0, 0}; MFRC522::MIFARE_Key key; MFRC522 rfid = MFRC522(SS_PIN, RST_PIN); void setup() { //Init Serial USB Serial.begin(115200); Serial.println(F("Initialize System")); //init rfid D8,D5,D6,D7 SPI.begin(); rfid.PCD_Init(); Serial.print(F("Reader :")); rfid.PCD_DumpVersionToSerial(); } void loop() { readRFID(); } void readRFID(void ) { /* function readRFID */ ////Read RFID card for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } // Look for new 1 cards if ( ! rfid.PICC_IsNewCardPresent()) return; // Verify if the NUID has been readed if ( !rfid.PICC_ReadCardSerial()) return; // Store NUID into nuidPICC array for (byte i = 0; i < 4; i++) { nuidPICC[i] = rfid.uid.uidByte[i]; } Serial.print(F("RFID In dec: ")); printDec(rfid.uid.uidByte, rfid.uid.size); Serial.println(); // 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 em frente do módulo, o monitor serial exibe o seu endereço de comunicação.
Aplicações
- Desenvolver uma interface web que se ativa somente quando o cartão certo é passado em frente do módulo