30 outubro 2016

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, que além do RFID "tradicional", digamos assim, também tem a tecnologia NFC.

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

O 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.

Pagamento utilizando NFC Near Field Communication


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 I2C, SPI ou HSU (High Speed UART), adaptando-se à maioria dos projetos. Com relação aos cartões, segundo o site do fabricante ele aceita:

  • Mifare 1K, 4K, Ultralight, e cartões DesFire
  • Cartões ISO/IEC 14443-4 como o CD97BX, CD light, DesFire, P5CN072 (SMX)
  • Cartões IRT5001 Innovision Jewel
  • Cartões FeliCa como os RCS_860 e RCS_854

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):

Módulo PN532 NFC - Detalhes

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):

Configuração interfaces

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: 

  • Serial0: Pinos   0 (RX) e   1 (TX)
  • Serial1: Pinos 19 (RX) e 18 (TX)
  • Serial2: Pinos 17 (RX) e 16 (TX)
  • Serial3: Pinos 15 (RX) e 14 (TX)

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:

Circuito Arduino Mega e módulo PN532 NFC RFID

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

Biblioteca e programa


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 PN532, PN532_HSU, PN532_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:

Bibliotecas PN532 e NDEF

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
//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:

Serial Monitor PN532

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:

NFC TagInfo NXP Android

Vou fazer mais alguns testes e dependendo do progresso posto os resultados aqui no blog. Até a próxima!

Nenhum comentário:

Postar um comentário