El módulo RFID RC522 es un lector de tarjetas inteligentes que, entre otras cosas, permite activar un mecanismo cuando se presenta la tarjeta adecuada al lector. En este tutorial veremos la gestión de un módulo RFID RC522 con una tarjeta NodeMCU ESP8266.
Prerrequisito: Programar tu NodeMCU con Arduino
Material
- Ordenador
- NodeMCU ESP8266
- Cable USB B Macho/micro B Macho
- módulo RFID RC522
Esquema
El módulo RC522 RFID utiliza el protocolo SPI para comunicarse con el ESP8266. La comunicación SPI utiliza cajas específicas en este tipo de microcontroladores.
El pinout es el siguiente (lado izquierdo RC522, lado derecho ESP8266):
- Vcc <-> 3V3 (o Vin(5V) según la versión del módulo)
- RST (Reset) <-> D0
- GND (Tierra) <-> GND
- MISO (Master Input Slave Output) <-> D6
- MOSI (Master Output Slave Input) <-> D7
- SCK (Serial Clock) <-> D5
- SS/SDA (Slave select) <-> D8
Atención: Según la versión del módulo RFID, la tensión de alimentación puede ser diferente (3,3V o 5V). Compruebe la tensión de alimentación de su módulo.
Como recordatorio, aquí está el diagrama de pines de la placa ESP8266.
Código para leer una tarjeta RFID
Para utilizar el módulo RC522 RFID utilizamos la librería SPI.h que nos permitirá establecer la comunicación entre la tarjeta ESP8266 y el módulo; y la librería MFRC522.h que nos permitirá dialogar con el 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
Cuando se pasa una tarjeta, un distintivo o un chip RFID por delante del módulo, la dirección de identificación del distintivo se muestra en el monitor de serie.
Aplicaciones
- Desarrollar una interfaz web que sólo se active cuando se pase el distintivo adecuado por delante del módulo