Comunicação sem fio com módulo PN532 NFC RFID

Faz tempo que não falamos de RFID aqui no blog…. Foi lá em 2014 que eu montei um projeto de cancela com RFID no post controle de acesso com módulo RFID RC522.  Agora vamos ver um outro módulo, o módulo leitor RFID NFC PN532 com Arduino. Este módulo, além do RFID “tradicional”, digamos assim, também tem a tecnologia NFC.

Comunicação sem fio com módulo PN532 NFC RFID

NFC (Near Field Communication) é uma tecnologia de comunicação sem fio entre dispositivos, onde você não precisa usar senhas, digitar códigos ou configurar uma conexão: simplesmente aproxime os dispositivos e a conexão entre eles será estabelecida.

A tecnologia NFC

O NFC foi projetado de maneira que os dispositivos fiquem realmente próximos um do outro (algo em torno de 10cm) para que a comunicação e a troca de dados seja efetuada. Isso evita conexões acidentais e minimiza tentativas de acesso indevido.

A aplicação mais conhecida do NFC é no sistema de pagamentos, onde o usuário pode aproximar o smartphone da máquina de cartões (aquelas que também possuem NFC) e realizar um pagamento sem tirar o cartão do bolso. 

Entretanto, podemos pensar em outras aplicações para o NFC, como o tradicional controle de acesso de funcionários, utilização em automação residencial (uma tag RFID para cada pessoa da casa, com suas preferências de luz, som, ar condicionado, etc) ou publicidade (utilizar o seu smartphone para receber informações personalizadas dos produtos, descontos, etc).

O módulo PN532 NFC RFID

O módulo PN532 NFC RFID que estou utilizando é da Elechouse (V3), e é um módulo bem prático pois funciona com as interfaces I2CSPI ou HSU (High Speed UART), adaptando-se à maioria dos projetos. Com relação aos cartões, segundo o site do fabricante ele aceita:

O módulo tem antena embutida, e a distância de comunicação com tags e dispositivos NFC é de aproximadamente 7cm. Com ele é possível tanto ler como gravar/enviar informações, e suporta comunicação NFC com dispositivo Android. 

Fique atento ao nível de sinal do módulo: 5V para as interfaces I2C e UART, e de 3.3V se você for utilizar a interface SPI.

Conexões e configuração da interface

Como mencionamos anteriormente, o módulo PN532 aceita a utilização das interfaces I2C, HSU e SPI. Na imagem abaixo, podemos ver no lado direito do módulo os 8 pinos da interface SPI.

As interfaces I2C e HSU compartilham os mesmos pinos, e temos a marcação dos pinos I2C na parte superior do módulo (SCL, SDA, VCC e GND), e a marcação dos pinos HSU na parte de trás (RX, TX, VCC e GND):

Para selecionar a interface desejada, utilizamos a chave dip switch, que seleciona os modos HSU (chaves em 0 e 0), I2C (1,0) e SPI (0,1):

Nos nossos testes, vamos utilizar o módulo no modo de comunicação HSU, e conectá-lo ao Arduino Mega 2560.

Conexão do módulo PN532 no Arduino Mega

Optei por usar um Arduino Mega nos testes pois ele tem 4 portas seriais:

Como a Serial0 é utilizada para comunicação com o computador, posso ligar o módulo PN532 na Serial1 e acompanhar a conexão e a transferência dos dados pelo Serial Monitor. 

Utilizando então o módulo PN532 ligado na Serial1 do Arduino Mega, teremos o esquema de conexão abaixo:

Repare que na imagem acima coloquei a marcação dos pinos correspondentes à interface serial/HSU (pinos RX, TX, VCC e GND).

Biblioteca e programa PN532 com Arduino

Para utilizar o módulo PN532 com Arduino, você vai precisar das bibliotecas PN532(download) e NDEF (download).

Ao descompactar a PN532, você terá dentro dela as pastas PN532PN532_HSUPN532_I2C e PN532_SPI. Copie essas quatro pastas para a pasta LIBRARIES da IDE do Arduino, junto com a pasta da biblioteca NDEF que você baixou. Assim, a sua pasta libraries terá uma estrutura semelhante à essa:

Para testar o programa, utilizei o exemplo da própria biblioteca PN532 com algumas modificações e observações:

//Programa: Teste modulo PN532 NFC RFID Arduino
//Autor: Arduino e Cia
//Baseado no programa exemplo da biblioteca PN532

//Define a interface de comunicação
#if 0
#include <SPI.h>
#include <PN532_SPI.h>
#include "PN532.h"
PN532_SPI pn532spi(SPI, 10);
PN532 nfc(pn532spi);

#elif 1
#include <PN532_HSU.h>
#include <PN532.h>
PN532_HSU pn532hsu(Serial1);
PN532 nfc(pn532hsu);

#else
#include <Wire.h>
#include <PN532_I2C.h>
#include <PN532.h>
#include <NfcAdapter.h>

PN532_I2C pn532i2c(Wire);
PN532 nfc(pn532i2c);
#endif

void setup(void)
{
  Serial.begin(115200);
  Serial.println("*** Teste Modulo PN532 NFC RFID ***");

  nfc.begin();

  //Verifica a conexao do modulo PN532
  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata)
  {
    Serial.print("Placa PN53x nao encontrada...");
    while (1); // halt
  }

  //Conexao ok, mostra informacoes do firmware
  Serial.print("Encontrado chip PN5"); Serial.println((versiondata >> 24) & 0xFF, HEX);
  Serial.print("Firmware versao: "); Serial.print((versiondata >> 16) & 0xFF, DEC);
  Serial.print('.'); Serial.println((versiondata >> 8) & 0xFF, DEC);

  // Set the max number of retry attempts to read from a card
  // This prevents us from waiting forever for a card, which is
  // the default behaviour of the PN532.
  nfc.setPassiveActivationRetries(0xFF);

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

  Serial.println("Aguardando cartao ISO14443A...");
  Serial.println("");
}

void loop(void)
{
  boolean success;
  //Buffer para armazenar a UID lida
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
  //Tamanho da UID (4 ou 7 bytes dependendo do tipo do cartao)
  uint8_t uidLength;

  //Wait for an ISO14443A type cards (Mifare, etc.).  When one is found
  //'uid' will be populated with the UID, and uidLength will indicate
  //if the uid is 4 bytes (Mifare Classic) or 7 bytes (Mifare Ultralight)
  success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, &uid[0], &uidLength);

  //Caso o cartao seja detectado, imprime o UID do cartao
  if (success)
  {
    Serial.println("Cartao detectado!");
    Serial.print("Tamanho do UID: "); Serial.print(uidLength, DEC); Serial.println(" bytes");
    Serial.print("UID: ");
    for (uint8_t i = 0; i < uidLength; i++)
    {
      Serial.print(" 0x"); Serial.print(uid[i], HEX);
    }
    Serial.println("");
    Serial.println("");
    //Aguarda 1 segundo para continuar
    delay(1000);
  }
  else
  {
    //PN532 probably timed out waiting for a card
    //Serial.println("Timed out waiting for a card");
  }
}

Carregue o programa no Arduino, abra o serial monitor e aproxime o cartão do módulo PN532 para que as informações de UID da tag sejam exibidas:

O UID pode ser utilizado como um identificador único para o seu projeto, liberando (ou não), o acesso à determinada funcionalidade conforme a tag utilizada.

Testando o NFC com um smartphone

Para efetuar o teste de comunicação entre o módulo e um smartphone, utilizei o exemplo emulate_tag_ndef da biblioteca PN532. Não consegui fazer com que a URL enviada pelo módulo fosse aberta no celular (creio que seja alguma limitação do NFC do meu aparelho), mas utilizando o programa NFC TagInfo by NXP (download Google Play) pude verificar que o módulo envia informações e é identificado corretamente como uma tag FeliCa:

Agora que você já sabe como usar o módulo PN532 com comunicação serial, veja também o post Como usar o Data Logger Shield com módulo RFID, onde a conexão é com interface I2C e os dados são gravados em um cartão SD.

5/5 - (2 votos)

Related posts

Tutorial: como acessar a internet com o Arduino GSM Shield SIM900

by Arduino e Cia
9 anos ago

Controlando um servo motor utilizando Android e Bluetooth

by Arduino e Cia
11 anos ago

Como programar o ESP32 por Wifi usando OTA

by Arduino e Cia
6 anos ago
Sair da versão mobile