InicioTarjetas de DesarrolloESP32Lee tarjetas RFID con PN532 y ESP32

Lee tarjetas RFID con PN532 y ESP32

Para utilizar el lector RFID PN532 con ESP32 es necesario modificar la librería ya que la librería original de Adafruit no es 100% compatible con un ESP32.

Para esto podemos modificar la librería directamente o podemos utilizar la librería UNIT_PN532 que ya viene modificada y solamente hay que descargarla y agregarla a nuestro IDE.

Modificación a la librería

Para usar el lector PN532 con ESP32 hay que modificar la librería, ya que la tasa de bits que viene predefinida en la librería de Adafruit es demasiado rápida para el ESP32 por lo cual se debe modificar este dato para poder utilizarlo con esta placa.

El problema que genera no modificar la tasa de bits, es la desconexión constante de la placa, el no reconocimiento de la placa PN532, la no lectura de las tarjetas RFID o que el programa entre en un bucle y se tenga que estar reiniciando constantemente la placa.

Solución

Hay dos soluciones para este problema, la primera es descargar la librería que se muestra a continuación, esta librería ya esta modificada para ser usada con el ESP32 y que no genere ningún error.

Librería UNIT_PN532

La segunda opción es modificar la siguiente parte de código dentro de la librería original de Adafruit.

Tenemos que modificar el dato que esta en el recuadro por el siguiente valor: “100000”, esto nos dará una mejor comunicación con el ESP32 y así tendremos una conexión mas estable entre el PN532 y el ESP32. Esto sirve para la comunicación del PN532 por SPI, se recomienda usar SPI ya que es mas estable y la librería esta mejor diseñada para ese tipo de comunicación.

Conexión ESP32 y PN532

Estas son las conexiones que se tienen que hacer entre el lector PN532 y el ESP32, la comunicación que estaremos manejando será por SPI, revisa que tengas configurado el PN532 para este tipo de comunicación.

Código con la librería UNIT_PN532

//Declaración de Librerías
#include <Wire.h>
#include <SPI.h> //Librería para comunicación SPI
#include <UNIT_PN532.h> //Librería Modificada

//Conexiones SPI del ESP32
#define PN532_SCK  (18)
#define PN532_MOSI (23)
#define PN532_SS   (5)
#define PN532_MISO (19)

uint8_t DatoRecibido[4]; //Para almacenar los datos

UNIT_PN532 nfc(PN532_SS);// Línea enfocada para la comunicación por SPI

void setup() {
  Serial.begin(115200); //Inicio de puerto Serial a 115200 baudios
  nfc.begin(); //Comienza la comunicación del PN532

  uint32_t versiondata = nfc.getFirmwareVersion();//Obtiene información de la placa

  if (! versiondata) { //Si no se encuentra comunicación con la placa --->
    Serial.print("No se encontró la placa PN53x");
    while (1); // Detener
  }
  Serial.print("Chip encontrado PN5");
  Serial.println((versiondata >> 24) & 0xFF, HEX); //Imprime en el serial que version de Chip es el lector
  Serial.print("Firmware ver. ");
  Serial.print((versiondata >> 16) & 0xFF, DEC); // Imprime que versión de firmware tiene la placa
  Serial.print('.'); Serial.println((versiondata >> 8) & 0xFF, DEC);

  //Establezca el número máximo de reintentos para leer de una tarjeta.
  //Esto evita que tengamos que esperar eternamente por una tarjeta,
  //que es el comportamiento predeterminado del PN532.
  nfc.setPassiveActivationRetries(0xFF);

  nfc.SAMConfig(); //Configura la placa para realizar la lectura

  Serial.println("Esperando una tarjeta ISO14443A ...");
}

void loop() {
  boolean LeeTarjeta; //Variable para almacenar la detección de una tarjeta
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Búfer para almacenar el UID devuelto
  uint8_t LongitudUID; //Variable para almacenar la longitud del UID de la tarjeta

  //Recepción y detección de los datos de la tarjeta y almacenamiento en la variable "LeeTarjeta"
  LeeTarjeta = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &LongitudUID);

  //Se detecto un tarjeta RFID
  if (LeeTarjeta) {
    Serial.println("Tarjeta encontrada!");
    Serial.print("Longitud del UID: ");
    Serial.print(LongitudUID, DEC); //Imprime la longitud de los datos de la tarjeta en decimal
    Serial.println(" bytes");
    Serial.print("Valor del UID: ");
    // Imprime los datos almacenados en la tarjeta en Hexadecimal
    for (uint8_t i = 0; i < LongitudUID; i++)
    {
      Serial.print(" 0x"); Serial.print(uid[i], HEX);

    }
    Serial.println("");
    delay (1000); // Espera de 1 segundo
  }

  //Si no se detecta tarjeta
  else
  {
    Serial.println("Se agotó el tiempo de espera de una tarjeta");
  }
}

Este es el código de prueba para la tarjeta PN532, con este código podremos obtener la información y el UID que se encuentra en la tarjeta, como se puede observar a continuación

Dispositivos

A continuación se encuentras los links de las dos placas que se utilizaron, para que las puedas adquirir al igual que los links a las tarjetas RFID.

TUTORIALES RELACIONADOS

1 COMENTARIO