Icono del sitio AranaCorp

Uso del lector RFID PN532 con Arduino

5
(1)

El módulo NFC PN532 es un lector de tarjetas inteligentes que, entre otras cosas, activa un mecanismo cuando se presenta la tarjeta correcta al lector. Se puede encontrar en los smartphones, por ejemplo. El módulo RC522 es sin duda el módulo RFID más conocido en el mundo de Arduino, pero en este tutorial veremos cómo utilizar el lector RFID PN532, que tiene ciertas ventajas, sobre todo en cuanto a las opciones de comunicación. Veremos aquí cómo utilizar el módulo según los diferentes métodos de comunicación UART, SPI, I2C.

Material

Selección del modo de comunicación

Una de las grandes ventajas del módulo NFC es que puede utilizar diferentes protocolos para comunicarse con Arduino, UART, I2C o SPI. Estos diferentes protocolos utilizan pines y librerías específicas del microcontrolador.

Para seleccionar el modo de comunicación, el PN532 debe configurarse mediante los interruptores DIP (0-Bajo, 1-Alto):

SEL0SEL1
UART0 0
SPI01
I2C10

Asegúrese de que los ajustes de los interruptores DIP coinciden con los diagramas de cableado.

Utilización del módulo con la comunicación en serie

Esquema

Para la comunicación en serie o UART, el pinout es el siguiente (lado izquierdo PN532, lado derecho Arduino UNO):


Código

Como hay diferentes opciones de comunicación, hay que utilizar la biblioteca adecuada en cada caso. En el caso de un puerto UART, PN532_HSU.h , para un puerto SoftwareSerial, PN532_SWHSU.h . Las funciones que permiten la lectura NFC siguen siendo idénticas en cada caso.

// for Hardware Serial
/*#include <PN532_HSU.h>
  #include <PN532.h>
  PN532_HSU pn532hsu( Serial );
  PN532 nfc( pn532hsu );
*/

// for Software Serial
#include <SoftwareSerial.h>
#include <PN532_SWHSU.h>
#include <PN532.h>
SoftwareSerial SWSerial( 2, 3 ); // RX, TX
PN532_SWHSU pn532swhsu( SWSerial );
PN532 nfc( pn532swhsu );


String tagId = "None", dispTag = "None";
byte nuidPICC[4];

void setup(void) {

  Serial.begin(115200);
  Serial.println("Hello Maker!");
  //  Serial2.begin(115200, SERIAL_8N1, RXD2, TXD2);

  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
    Serial.print("Didn't Find PN53x Module");
    while (1); // Halt
  }

  // Got valid data, print it out!
  Serial.print("Found chip PN5"); Serial.println((versiondata >> 24) & 0xFF, HEX);
  Serial.print("Firmware ver. "); Serial.print((versiondata >> 16) & 0xFF, DEC);
  Serial.print('.'); Serial.println((versiondata >> 8) & 0xFF, DEC);

  // Configure board to read RFID tags
  nfc.SAMConfig();

  Serial.println("Waiting for an ISO14443A Card ...");

}

void loop() {
  readNFC();
}

void readNFC() {

  boolean success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };  // Buffer to store the returned UID
  uint8_t uidLength;                       // Length of the UID (4 or 7 bytes depending on ISO14443A card type)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

  if (success) {
    Serial.print("UID Length: "); Serial.print(uidLength, DEC); Serial.println(" bytes");
    Serial.print("UID Value: ");

    for (uint8_t i = 0; i < uidLength; i++) {
      nuidPICC[i] = uid[i];
      Serial.print(" "); Serial.print(uid[i], DEC);
    }
    Serial.println();
    tagId = tagToString(nuidPICC);
    dispTag = tagId;
    Serial.print(F("tagId is : "));
    Serial.println(tagId);
    Serial.println("");

    delay(1000);  // 1 second halt

  } else {
    // PN532 probably timed out waiting for a card
    //Serial.println("Timed out! Waiting for a card...");
  }
}

String tagToString(byte id[4]) {
  String tagId = "";
  for (byte i = 0; i < 4; i++) {
    if (i < 3) tagId += String(id[i]) + ".";
    else tagId += String(id[i]);
  }
  return tagId;
}

Uso del módulo con I2C

Equema

Para la comunicación I2C, el pinout es el siguiente:

Código para la comunicación I2C

La biblioteca PN532_I2C.h para la comunicación I2C

// for I2C Communication
#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>
PN532_I2C pn532_i2c(Wire);
NfcAdapter nfc = NfcAdapter(pn532_i2c);

String tagId = "None";
byte nuidPICC[4];

void setup(void) {
  Serial.begin(115200);
  Serial.println("System initialized");

  nfc.begin();
}

void loop() {
  readNFC();
}

void readNFC() {
  if (nfc.tagPresent())
  {
    NfcTag tag = nfc.read();
    tag.print();
    tagId = tag.getUidString();
  }
  delay(5000);
}

Uso del módulo con SPI

Esquema

Para la comunicación SPI, El pinout es el siguiente:

Código para la comunicación SPI

PN532_SPI.h para la comunicación a través del puerto SPI.

// for SPI Communication
#include <SPI.h>
#include <PN532_SPI.h>
#include <PN532.h>
#include <NfcAdapter.h>
PN532_SPI interface(SPI, 10); // create a PN532 SPI interface with the SPI CS terminal located at digital pin 10
NfcAdapter nfc = NfcAdapter(interface); // create an NFC adapter object


String tagId = "None";

void setup(void) {
  Serial.begin(115200);
  Serial.println("System initialized");

  nfc.begin();
}

void loop() {
  readNFC();
}

void readNFC() {
  if (nfc.tagPresent())
  {
    NfcTag tag = nfc.read();
    tag.print();
    tagId = tag.getUidString();
  }
  delay(5000);
}

Aplicaciones

Fuentes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuarlo!

Promedio de puntuación 5 / 5. Recuento de votos: 1

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

Salir de la versión móvil