Módulo RFID-RC522 Escritura

publicado en: Tutoriales | 0

Módulo Lector RFID-RC522 RF con Arduino

El Módulo Lector RFID-RC522 RF utiliza 3.3V como voltaje de alimentación y se controla a través del protocolo SPI o UART. Es compatible con casi cualquier micro controlador, Arduino o tarjeta de desarrollo. El RC522 utiliza un sistema avanzado de modulación y de-modulación para todo tipo de dispositivos pasivos de 13.56Mhz. Como se hará una lectura y escritura de la tarjeta, es necesario conocer las características de los bloques de memoria una tarjeta. La tarjeta que viene con el módulo RFID cuenta con 64 bloques de memoria (0-63) donde se hace lectura y/o escritura. Cada bloque de memoria tiene la capacidad de almacenar hasta 16 Bytes. El número de serie consiste de 5 valores hexadecimales, se podría utilizar esto para hacer una operación dependiendo del número de serie.

RFID-RC522

Características del Módulo Lector RFID-RC522 RF

• Modelo: MF522-ED
• Corriente de operación: 13-26mA a 3.3V
• Corriente de stand by: 10-13mA a 3.3V
• Corriente de sleep-mode: <80uA
• Corriente máxima: 30mA
• Frecuencia de operación: 13.56Mhz
• Distancia de lectura: 0 a 60mm
• Protocolo de comunicación: SPI
• Velocidad de datos máxima: 10Mbit/s
• Dimensiones: 40 x 60 mm
• Temperatura de operación: -20 a 80ºC
• Humedad de operación: 5%-95%
• Máxima velocidad de SPI: 10Mbit/s
• Incluye pines, llavero y tarjeta

RFID-RC522

DESCRIPCIÓN del ejemplo

Se hara uso del Arduino UNO y el Módulo Lector RFID-RC522 RF para escribir sobre la tarjeta o llavero y ejecutaremos un programa el cual leerá la información escrita.

MATERIALES

Módulo Lector RFID-RC522 RF y tarjeta.
1 Arduino Uno.
Cables jumper macho a macho.
Protoboard.

 

CONEXIÓN Módulo Lector RFID-RC522 RF con arduino

Conexiones

Diagrama de conexión del RFID-RC522 RF con Arduino

RFID-RC522

Biblioteca

Link de descargar de librerías :
https://github.com/miguelbalboa/rfid

Como instalar bibliotecas: https://www.arduino.cc/en/Guide/Libraries

 

Código para escribir en la tarjeta/llavero


#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance

void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card
Serial.println(F("Ingrese Tarjeta para Escribir Dato Personal"));
}

void loop() {

// Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
MFRC522::MIFARE_Key key;
for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent()) {
return;
}

// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial()) return;

Serial.print(F("Num. de Serie unico:")); //Dump UID
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
Serial.print(F(" PICC type: ")); // Dump PICC type
MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
Serial.println(mfrc522.PICC_GetTypeName(piccType));

byte buffer[34];
byte block;
MFRC522::StatusCode status;
byte len;

Serial.setTimeout(20000L) ; // wait until 20 seconds for input from serial

// Ask personal data: First name
Serial.println(F("Escriba Dato, al final incluya #"));
len=Serial.readBytesUntil('#', (char *) buffer, 20) ; // read first name from serial
for (byte i = len; i < 20; i++) buffer[i] = ' '; // pad with spaces

block = 6; //Se especifica en que bloque se escribira _____------______-----______

//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}

// Write block
status = mfrc522.MIFARE_Write(block, buffer, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() Escritura Realizada Corectamente: "));

block = 5;
//Serial.println(F("Authenticating using key A..."));
status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}

// Write block
status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
else Serial.println(F("MIFARE_Write() Escritura Realizada Corectamente: "));
Serial.println(" ");
mfrc522.PICC_HaltA(); // Halt PICC
mfrc522.PCD_StopCrypto1(); // Stop encryption on PCD

}

 

Aspectos del programa de escritura

Se agregan las librerías


#include <SPI.h>

#include <MFRC522.h>

Esta línea específica que se tendrán 20s para poder escribir el dado a grabar en la tarjeta/llavero


Serial.setTimeout(20000L) ;     // wait until 20 seconds for input from serial

Al ingresar el dato a escribir se tendrá que ingresar “#” al final para confirmar el dato
En nuestro caso se grabo fue:
HETPRO RFID-RC522, por lo cual se ingresó en el monitor serial: HETPRO RFID-RC522#
NOTA: recuerda que la capacidad por bloque es de 16 Bytes = 16 caracteres


Serial.println(F("Escriba Dato, al final incluya #"));
len=Serial.readBytesUntil('#', (char *) buffer, 20) ; // read first name from serial
for (byte i = len; i < 20; i++) buffer[i] = ' '; // pad with spaces

Se especifica cual será el bloque en el que escribirá


block = 6; //Se especifica en que bloque se escribira

 

Al abrir el monitor serial lo primero que aparecerá será el mensaje de “Ingrese Tarjeta para Escribir Dato Personal”
Una vez colocada la tarjeta aparecerá su núm. De serie único y su PICC type, ademas del mensaje “Escriba Dato, al final incluya #”
Entonces tendrá 20s para agregar el dato a escribir
Si se escribió correctamente aparecerá el mensaje
MIFARE_Write() Escritura Realizada Corectamente:
MIFARE_Write() Escritura Realizada Corectamente:

MONITOR CERIAL ESCRITURA 522

Una vez realizado esto el dato quedara escrito en la tarjeta/llavero.
Para poder hacer lectura de este dato usaremos el siguiente programa


#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN 9 // Configurable, see typical pin layout above
#define SS_PIN 10 // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance.

MFRC522::MIFARE_Key key;

/**
* Initialize.
*/
void setup() {
Serial.begin(9600); // Initialize serial communications with the PC
while (!Serial); // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
SPI.begin(); // Init SPI bus
mfrc522.PCD_Init(); // Init MFRC522 card

// using FFFFFFFFFFFFh which is the default at chip delivery from the factory
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}

Serial.println(F("Ingrese Tarjeta"));
}

/**
* Main loop.
*/
void loop() {
// Look for new cards
if ( ! mfrc522.PICC_IsNewCardPresent())
return;

// Select one of the cards
if ( ! mfrc522.PICC_ReadCardSerial())
return;

byte sector = 1;
byte blockAddr = 6; //Se especifica que bloque se leera _____------______-----______
byte dataBlock[] = {
0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4,
0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8,
0x08, 0x09, 0xff, 0x0b, // 9, 10, 255, 12,
0x0c, 0x0d, 0x0e, 0x0f // 13, 14, 15, 16
};
byte trailerBlock = 7;
MFRC522::StatusCode status;
byte buffer[18];
byte size = sizeof(buffer);

Serial.println(F("Datos actuales en el sector:"));
mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);
Serial.println();

// Read data from the block
Serial.print(F("Cargando dato del bloque ")); Serial.print(blockAddr);
Serial.println(F(" ..."));
status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Read() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print(F("Dato en el bloque ")); Serial.print(blockAddr); Serial.println(F(":"));
dump_byte_array(buffer, 16); Serial.println();
Serial.println();

}

/**
* Helper routine to dump a byte array as hex values to Serial.
*/
void dump_byte_array(byte *buffer, byte bufferSize) {
for (byte i = 0; i < bufferSize; i++) {
// Serial.print(buffer[i] < 0x10 ? " 0" : " ");
// Serial.print(buffer[i], HEX);

Serial.write(buffer[i]);

}
}

Aspectos del programa lectura

Agregar librerías


#include <SPI.h>

#include <MFRC522.h>

Se especifica el sector y bloque que se leerá
Nota:Este debe coincidir con el bloque en que se escribió en el primer programa, o simplemente con el bloque que se desee leer

byte sector         = 1;
byte blockAddr      = 6; //Se especifica  que bloque se leera _____------______-----______

Es importante recalcar que los datos escritos en la tarjeta/llavero siempre serán en hexadecimal, por lo cual para su lectura es importante hacer la conversión de HEX a ASCII

Serial.write(buffer[i]);

Al ejecutar el programa aparecerá el mensaje “Ingrese Tarjeta”
Una vez colocada la tarjeta aparecerá los “Datos actuales en el sector”, esto te permitirá ver que bloques están disponibles para escribir en ellos, además de ver si hay algo ya escrito en otro bloque
Nota: se puede sobrescribir en el bloque en el cual ya escribiste, así que si quiere cambiar lo escrito por algún error o por algún otro motivo puedes hacer.
En el primer bloque no se puede escribir, en nuestro caso el bloque 7
Después aparece
Cargando el dato del bloque “se imprime el número del bloque que se leerá”
Dato en el bloque “se imprime el número del bloque que se leerá”
“Se imprime dato escrito en la tarjeta/llavero”

Lectura de rc522

 

 

 

 

 

 

Dejar una opinión