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.
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.
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):
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:
- 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:
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 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:
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.
Ola, gostaria de saber quanto e a distancia que ele detecta? que ele pode liberar o sinal? por que no caso do RFID a distancia entre o receptor eh de cm.. e neste caso do NFC qual é a distancia?
Boa noite,
Olha, não é muito não.. uns 4 ou 5 cm, mais ou menos…
Abraço!
Ola boa noite, como faço para colocar no uno ??? não estou conseguindo
Como eu faço para comparar o ID da tag que foi captado pelo 532 e fazer com que ele acione um LED? Se certa tag for captada, ela aciona a saída 13, se outra tag foi captada, aciona a saida 14.
Obrigado.
Usa este programa de scanner de uid, salva seu endereço (Uid). Entretanto no seu programa, cria além do buffer "uint8_t uid [] = { 0, 0, 0, 0};" uma nova array com a uid que vc deseja comparar (será a que vc escaneou) "card [] = {0x1,0xA2,0xB3,0xC4};". Após isso, faz um If (Uid [0] == card[0] && Uid [1] == card [1] && Uid [2] == card [2] && Uid [3] == card [3])
{digitalWrite (led , HIGH); }
aí pra outra tag vc faz um Else If seguindo o raciocínio acima
O que muda no código para o Arduino UNO?
Boa noite,
No Uno você pode usar a biblioteca SoftwareSerial para simular a interface serial nos pinos digitais 2 e 3, por exemplo.
Abraço!
Você pode por favor compartilhar o arquivo de Fritzing? Passei horas tentando encontrar o módulo RFID e acabei com você. Desde já, obrigado!
Mesmo seguindo todo o passo a passo, o arduino está retornando no monitor serial: a placa PN53x não encontrada. O que devo fazer?
Bom dia! O módulo PN532 aceita o meu smartphone(usando o NFC do smartphone) como um cartão de acesso? Você já viu uma utilização desse tipo?
Obrigado
Oi Eduardo,
Ainda não fiz algo do tipo, mas é perfeitamente possível sim.
Abraço!
Adilson
Boa tarde! Você pode por favor disponibilizar o download da parte do PN532 para o Fritzing?
Bom dia! Alem de data, hota e id tambem grava os dados contidos no cartao?
Oi Junior,
Esse módulo é apenas leitor. De qualquer forma, se você aproximar um cartão RFID com os dados gravados, consegue capturar essa informação e jogar em um cartão SD, por exemplo.
Abraço!
Adilson
Oi, estou com uma dúvida. Você disse que ele só lê,mas é esse:
https://www.makerhero.com/produto/kit-modulo-leitor-rfid-nfc-pn532/
É somente leitura? Estou confuso, parece que é o mesmo que você apresentou.
Boa tarde!
Como faço para gravar dados (um texto curto, por exemplo) nessas tags NFC?
Grato!
Use nxp TagWriter for android. It is able to write dataset into the NFC tags (Be it text, website, Phone no. or anything).
Good Hint. Thank you! 🙂
Best regards,
Adilson
Gostei muito módulo, acho que vou colocar um no meu projeto.
Como que posso fazer a gravação?
Bom dia,
Esse realmente só faz a leitura. Para gravação, recomendo usar o MFRC522:
http://www.arduinoecia.com.br/2014/12/controle-de-acesso-modulo-rfid-rc522.html
Abraço!
Adilson
Please share the fritzing part schematic for the PN532 nfc rfid module.
Hi Mehfooz,
I don´t have the PN532 as a fritzing part. I draw it separately.
Best regards!
Adilson
Hello,
Thanks for the reply.
I had a question. How did you manage to draw the PN532? I am not so good in Illustrator, Corel and all. Hence, not able to make the templates for it, else I would have made the part for fritzing.
Hi Mehfooz,
I draw it using Photoshop… I´m not so good on it too, but it works… 🙂
Best regards!
Adilson
Ola, otima matéria, como eu faço para ter varios readers menores que se comuniquem com o reader principal do arduino ?
Olá alguém já teve problema com esse modulo? coloquei em um projeto e está travando.
Este módulo Elechouse V3 tem como usar simultaneamente para ler Mifare e SNEP server (P2P com Android) ?
Bom dia,
Se não me engano ele permite o uso de uma função de cada vez.
Abraço!
Adilson
Boa noite
Preciso fazer um controle de acesso, porém preciso criar um crédito para a TAG e toda vez queqfpr usada retire um dos créditos armazenado dentro da TAG, teria como?
Obrigado
Oi Ricardo,
Sim, algumas tags permitem que você armazene dados como ID do usuário, créditos, senhas e outras informações.
Abraço!
Adilson
Bom dia , estou com um projeto de contagem de estoque , esse leitor consegue ler várias tags ao mesmo tempo ? Qual a distância máxima de leitura ?
Oi Lucas,
Ele lê uma tag de cada vez, e pelos teste que eu fiz aqui a distância de leitura é bem pequena, vc tem quase que encostar a tag no leitor.
Abraço!
Adilson
Alguém ja testou no a PN532 no ESP32? Estou a varios dias tentando e não consigo achar uum tutorial que me ajude. Esse código pode ser inserido no ESP32? HELP-ME!
Bom dia , já rodei a internet toda a semanas e não achei nenhum código que funcionasse oESP32 com o PN532 . No arduino funcionou mas, no Esp32 não consegui sempre da isso:11:52:01.195 -> Hello!
11:52:01.681 -> Didn’t find PN53x board
Alguém ja testou no ESP32? Preciso de ajuda.
Oi Gustavo,
Veja se este link te ajuda: https://github.com/Robotto/ESPnfc
Abraço!
Adilson
como trocar o endereco I2c do pn532 de 0x24 para outro para poder usar 2 leitores em slave com um esp
Oi Paulo,
Pelo que eu vi aqui não é possível alterar o endereço I2C, mas vou procurar alguma alternativa.
Abraço!
Adilson