Componentes Eletronicos

Guia Básico da NFC para Arduino

Eletrogate 2 de maio de 201813 min

O que é NFC?

NFC é a sigla em inglês de Comunicação por Campo de Proximidade (Near field communication). “É uma tecnologia que permite a troca de informações sem fio e de forma segura entre dispositivos compatíveis que estejam próximos um do outro. Ou seja, logo que os dispositivos estejam suficientemente próximos, a comunicação é estabelecida automaticamente, sem a necessidade de configurações adicionais. Estes dispositivos podem ser telefones celulares, tablets, crachás, cartões de bilhetes eletrônicos, pulseiras e qualquer outro dispositivo que tenha um  chip NFC.”

Fonte Wikipedia : NFC

Essa tecnologia foi iniciada à partir de um acordo de cooperação entre a Philips e a Sony em 2002, para o desenvolvimento da NFC. Em 2004, a Nokia entrou também no grupo de desenvolvimento e criaram o Forum NFC.

NFC Forum ORG

A distância definida para a comunicação NFC é de até 10 cm, visando velocidades rápidas o suficiente para transferir imagens de alta qualidade. Com velocidade de comunicação de até 848 kbit /s, a tecnologia NFC é totalmente compatível com as tecnologias de cartão inteligente sem contato Mifare da Philips e FeliCa da Sony.

Exemplos de transmissão :

Passivo: apenas um dos dispositivos gera o sinal de conexão, o segundo apenas recebe. Assim é possível colocar etiquetas NFC em itens que não recebem alimentação elétrica direta, como cartões, embalagens e cartazes.

Ativo: ambos os dispositivos geram o sinal, por exemplo, na conexão entre  um smartphone e um receptor no caixa de uma loja.

Leitura e gravação: leitura ou alteração de dados em um dispositivo NFC, como um receptor que desconta créditos registrados em um cartão de bilhete de ônibus.

Peer-to-peer: cada dispositivo pode tanto receber quanto enviar dados para o outro, por exemplo, para a troca de arquivos entre dois smartphones.

Como funciona a NFC:

A NFC funciona usando indução magnética, assim como no RFID: um leitor emite uma pequena corrente elétrica que cria um campo magnético. Esse campo é recebido por uma bobina semelhante no dispositivo do cliente, onde é transformada novamente em impulsos elétricos para transmitir e receber dados, como informações de identificação ou qualquer outra informação. As  etiquetas NFC  passivas usam a energia do leitor para codificar sua resposta, enquanto as etiquetas NFC ativas  têm sua própria fonte de energia e respondem ao leitor usando seus próprios campos eletromagnéticos.

Essa apostila da Nokia contém conteúdo bem interessante e detalhado sobre NFC :

Introduction_to_NFC_- Nokia


Aplicações para NFC

NFC é uma tecnologia recente e a cada dia tem sido criadas novas aplicações para o seu uso. Aqui no Brasil, vários Bancos já estão usando o NFC para que os usuários possam efetuar transações financeiras. É claro, existe uma limitação de valor  definida pelo usuário, e o uso de senha permite segurança nas transações.

As etiquetas NFC  inseridas em cartões de identificação, cartões de visita, posters, menus, etc, podem iniciar um aplicativo no  smartphone ou conectar o usuário em um site de mídia social, por exemplo. Diferentemente de códigos de barras ou QR codes, as etiquetas NFC podem armazenar uma significante quantidade de dados, são mais seguras e podem ser protegidas por senhas. As etiquetas NFC incorporadas podem fornecer informações detalhadas  sobre produtos, marcas, recomendações de consumidor, usuário,manuais, sustentabilidade, reciclagem e muito mais.

A grande maioria dos  smartphones mais modernos estão vindo com circuitos que permitem a comunicação NFC. Por exemplo, podem ser usados para pagamentos através da NFC de uma caixa registradora, podem transferir arquivos de fotos de uma camera fotográfica para o smartphone, etc.

Outra forma de automação por NFC muito utilizada nos Estados Unidos é o pagamento de bilhetes de estacionamento via smartphone com NFC. Recentemente a empresa Kameda Corp lançou o sistema no Brasil, com um funcionamento simples: o motorista pode pagar o bilhete na saída do estacionamento com seu próprio smartphone, desde que este tenha o aplicativo integrado ao PayPal.

No NFC Forum existe um concurso anual para divulgação de novas aplicações do NFC. Acho que vale a pena dar uma olhada no vídeo abaixo , nos vencedores e finalistas do concurso de 2017:

 


Tipos de Etiquetas NFC

Como no caso da RFID, a  etiqueta NFC funciona no espectro de radiofrequência de 13,56MHz usando menos de 15mA de energia para comunicar dados entre distâncias que são geralmente menores que 10 cm. As etiquetas normalmente armazenam entre 48 e 888 bytes de dados e transferem dados usando velocidades de 106Kb / s, 212Kb / s,  424Kb / s ou 848Kb / s – o suficiente para mover os blocos de informação virtualmente instantaneamente. Veja na etiqueta abaixo NFC NTAG213, o chip NTGAG213 onde ficam armazenados os dados (EEPROM) e a antena que é formada pelo circuito circular. A retenção dos dados pode durar até 10 anos. E a memória pode ser regravada até 100.000 vezes !

Frequência de operação : 13,56 MHz

Diâmetro da antena = 35 mm (para NTag213)

Diâmetro da etiqueta = 38 mm (para NTag213)

Padrão : ISO 14443 A (da etiqueta NFC)

NTAG213 EEPROM:     possui 180 bytes, organizados  em 45 páginas de 4 bytes.

  • 26 bytes reservados para dados de identificação (configuração e fabricante)
  • 34 bits usados para mecanismo de trava de leitura somente
  • 4 bytes disponíveis para capability container
  • 144 bytes para memória do usuário (leitura e gravação)

Tamanho das memórias do usuário nos chips NTAG :

  •  NXP NTAG210  =   48 bytes
  •  NXP NTAG213  =  144 bytes
  •  NXP NTAG216  = 888 bytes
  • Sony FeliCa Lite-S =  224 bytes

Informações detalhadas sobre os chips das etiquetas NTAG 213, 215 e 216 :   NTAG213_215_216 Datasheet

Especificações das Etiquetas BullsEye

Especificações das etiquetas Tipo 2 (NFC Forum) :

NFCForum-TS-Type-2-Tag_1.1

        NTAG213 – mapa de memória EEPROM

  • UID – identificador único / número de série
  • Lock – bytes para seleção de Leitura somente (‘FF’)  ou Leitura e Gravação (’00’) de blocos de dados
  • CC – capability container – definições de tamanho da memória (gravado na fábrica)
  • User memory – para armazenar dados do usuário
  • CFG – páginas de configuração
  • PWD – senha de acesso (somente grava – nunca pode ser lida)
  • PACK – autorização de acesso

Protocolos e Interfaces da NFC:

As interfaces NFC são definidas pelos padrões ISO e ECMA.  As normas ISO / IEC 18092 / ECMA-340 determinam modos de comunicação para NFC Interface e Protocol (NFCIP), para comunicação ativa e passiva, esquemas de modulação relevantes e velocidades de transferência.  A ISO / IEC 21481 / ECMA-352 define NFCIP-2, que especifica os modos de comunicação para minimizar a interferência com outros dispositivos de cartão sem contato.

Se você se interessou pela NFC e deseja estudar a fundo o protocolo e interface ECMA, anexei esses dois documentos detalhados sobre a NFC-1 e NFC-2 .

ECMA-340 NFC-1 – Interface and Protocol

ECMA-352 NFC-2 – Interface and Protocol

referência : APCMAG – dentro da NFC


Usando o Módulo RFID RC522 para Ler Tags NFC

O módulo RFID-RC522, como o nome diz, foi desenvolvido para leitura de etiquetas RFID. Mas o chip MFRC522 do módulo permite também o uso de etiquetas NFC. Portanto vamos usa-lo para ler essas NTAGs.

Esse é o Datasheet do chip MFRC522, que contém todas as informações sobre como usá-lo.

Datasheet do chip MFRC522

Esse diagrama abaixo foi feito por mim. É o diagrama eletrônico do módulo RFID-RC522. Veja que a alimentação do módulo deve ser de 3,3V. As portas de controle e de comunicação SPI  do Chip podem ser conectadas diretamente nas portas do Arduino (5V). A tensão das portas fica no limite, mas funcionam normalmente. Por isso não usei conversores de níveis de tensão.

Diagrama eletrônico do módulo RFID-RC522

O dois diagramas abaixo, mostram como devem ser feitas as conexões entre o Módulo RFID-RC522 e o Arduino UNO. Não se esqueça de conectar o GND do módulo ao GND do Arduino!

Materiais necessários para o projeto com Arduino e Módulo NFC RFID

Diagrama FRITZING – Arduino UNO com Módulo Leitor RC522

Arduino UNO com Módulo leitor RC522

A Biblioteca MFRC522 será usada nos exemplos desse tutorial. Para instalar a nova Biblioteca, clique em

Sketch > Incluir Biblioteca > Gerenciar Bibliotecas 

Após abrir a janela do Gerenciador de Biblioteca, refine a busca digitando MFRC522. Na biblioteca  MFRC522, clique em More Info e depois em Instalar. Após alguns segundos, ela será automaticamente instalada. Lembre-se que o seu computador precisa estar conectado na internet, para poder baixar a biblioteca. Após a instalação da Biblioteca, é necessário que feche e abra novamente o programa  Arduino IDE.

Biblioteca MFRC522

Como não encontrei nenhum exemplo de Sketch para a leitura de todos os dados das Etiquetas NFC NTAG213, criei esse programa baseado  na Biblioteca MFRC522.

Programa para mostrar todos os dados das Etiquetas NFC NTAG213:   DumpNTAG213.INO

/* Programa de Dump da etiqueta NFC NTAG213
  Blog Eletrogate - https://blog.eletrogate.com/guia-basico-da-nfc-para-arduino
  Arduino UNO - IDE 1.8.5 - Modulo RC522
  Gustavo Murta   06/maio/2018
  Biblioteca MFRC522 https://github.com/miguelbalboa/rfid     Baseado no exemplo DumpInfo.ino
*/

#include <SPI.h>                                              // Biblioteca SPI 
#include <MFRC522.h>                                          // Biblioteca MFRC522

int RST_PIN = 9;                                              // pino Reset - pino D9 do Arduino
int SS_PIN = 10;                                              // pino SS ou SDA - pino D10 do Arduino

MFRC522 mfrc522(SS_PIN, RST_PIN);                             // cria instancia MFRC522

void setup() {
  Serial.begin(9600);		                                  // inicializa a comunicação serial com o PC
  while (!Serial);		                                      // aguarda a abertura da interface serial
  SPI.begin();			                                      // inicializa o barramento SPI
  mfrc522.PCD_Init();	                                      // inicializa o modulo RC522
  mfrc522.PCD_DumpVersionToSerial();	                      // mostra as informções do modulo RC522
  Serial.println("Lendo a etiqueta NTAG213 =  UID, SAK, tipo e blocos de dados...");
}

void dumpNTAG213 ()
{
  byte byteCount;                                             // contador de bytes
  byte buffer[18];                                            // 16 bytes de dados mais 2 bytes de CRC
  byte i;                                                     // indice
  byte Status;                                                // código do status

  Serial.println("Page  0  1  2  3");                         // imprime o cabeçalho da tabela
  for (byte page = 0; page < 45; page += 4)                   // NTAG213 possui 45 paginas
  {
    byteCount = sizeof(buffer);                               // tamanho do buffer = 18 bytes
    Status = mfrc522.MIFARE_Read(page, buffer, &byteCount);   // lendo 4 bytes por pagina
    if (Status != 0)                                          // STATUS_OK = 0
    {
      Serial.print("Leitura da etiqueta falhou = ");          // imprime monitor serial
      Serial.println(mfrc522.GetStatusCodeName(Status));      // imprime o código da falha de leitura
      break;
    }
    for (byte offset = 0; offset < 4; offset++)               // contando os bytes das paginas
    {
      i = page + offset;
      if (i < 10)
        Serial.print("  ");                                   // imprimindo espaço
      else
        Serial.print(" ");                                    // imprimindo espaço
      if (i < 45)                                             // no maximo 45 paginas de dados
      {
        Serial.print(i);                                      // imprimindo o endereço da pagina
        Serial.print("  ");
        for (byte index = 0; index < 4; index++)              // indexando os bytes de enedereço
        {
          i = 4 * offset + index;
          if (buffer[i] < 0x10)                               // imprimindo o buffer 16 bytes
            Serial.print(" 0");
          else
            Serial.print(" ");                                // imprimindo espaço
          Serial.print(buffer[i], HEX);                       // imprimindo os bytes da memoria
        }
        Serial.println();                                     // salta uma linha
      }
    }
  }
}

void loop()
{
  if ( ! mfrc522.PICC_IsNewCardPresent())                    // Verificando novas etiquetas NFC
  {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial())                      // Seleciona uma etiqueta NFC
  {
    return;
  }
  dumpNTAG213 ();                                            // imprime dados da NTAG213
  Serial.println();                                          // salta uma linha
  delay(1000);                                               // atraso de um segundo
}

Monitor Serial com as informações da NTAG 213 :

Todas as 45 páginas de dados da etiqueta podem ser visualizadas. Nessa tela somente aparecem as 19 primeiras páginas. Cada  página tem 4 bytes.


Controle de Acesso com Etiquetas NFC

Baseando-me no tutorial RFID do Blog da Eletrogate, fiz algumas adaptações para o uso de Etiquetas NFC :

 Kit RFID com Arduino: Sistema de controle de acesso

Para simplificar a montagem, usei um Display LDC 16×2 com interface I2C. A campainha (Buzzer) foi conectada no pino D7 do Arduino.  Não se esqueça de interligar todos os terras (GND).

Esses são os diagramas da montagem do Circuito de Controle de Acesso com NFC.

Materiais necessários para o projeto Controle de Acesso com Etiquetas NFC

cta_cart

Diagrama FRITZING – Arduino UNO com RC522, Display LCD I2C e Buzzer

As Bibliotecas MFRC522 e LiquidCrystal_I2C serão usadas no Skecth dessa montagem. Para instalar uma nova Biblioteca, use o mesmo procedimento citado anteriormente.

Esse é o Sketch da montagem Controle de Acesso com NFC :  NFCAcesso.INO

/*
  Programa de Controle de Acesso para etiqueta NFC NTAG213
  Blog Eletrogate - https://blog.eletrogate.com/guia-basico-da-nfc-para-arduino
  Arduino UNO - IDE 1.8.5 - Modulo RFID RC522
  Display LCD 16x2 I2C
  Gustavo Murta   09/maio/2018
  Biblioteca MFRC522 https://github.com/miguelbalboa/rfid
  Adaptado de https://blog.eletrogate.com/kit-rfid-com-arduino-sistema-de-controle-de-acesso/
*/

#include <SPI.h>                              // biblioteca SPI 
#include <MFRC522.h>                          // biblioteca do modulo RC522
#include <LiquidCrystal_I2C.h>                // biblioteca do display LCD com I2C 

#define SDA_PIN 10                            // pino SDA RC522 = D10 Arduino
#define RST_PIN 9                             // pino RST RC522 = D9  Arduino
#define TAGLiberada " 04 58 F1 72 20 4E 80"   // UID da etiqueta NFC liberada 
#define AcionaBuzzer 7                        // buzzer = D7 Arduino
#define BeepsLiberado 1                       // 1 bip = acesso liberado
#define BeepsNegado 2                         // 2 bips = acesso negado 

MFRC522 mfrc522(SDA_PIN, RST_PIN);    // cria uma instância MFRC522
LiquidCrystal_I2C lcd(0x3F, 16, 2);   // configuração do display LCD 16x2 I2C - mude para  0x27 se não funcionar

char st[20];                          // string com 20 caracteres
String UID = "";                      // string da identificação UID

void setup()
{
  pinMode(AcionaBuzzer, OUTPUT);
  Serial.begin(9600);                // monitor serial a 9600 Bps
  SPI.begin();                       // inicializa comunicação SPI
  mfrc522.PCD_Init();                // inicializa modulo RC522

  lcd.init();                        // inicializa display LCD
  lcd.backlight();                   // acende o led backlight do LCD
  StandardMessage();                 // imprime mensagem no LCD
}

void StandardMessage()
{
  lcd.clear();                       // limpa tela do LCD
  lcd.setCursor(3, 0);               // cursor na coluna 3 linha 0
  lcd.print("Aproxime a");           // print no LCD
  lcd.setCursor(2, 1);               // cursor na coluna 2 linha 1
  lcd.print("Etiqueta NFC");         // print no LCD
}

void getUID()
{
  Serial.print("UID da tag NFC : ");                            // imprime no monitor serial
  for (byte i = 0; i < mfrc522.uid.size; i++)                   // leitura da identificação UID da NFC
  {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");   // imprime os bytes
    Serial.print(mfrc522.uid.uidByte[i], HEX);                  // imprime UID em hexadecimal
    if ( mfrc522.uid.uidByte[i] < 0x10)                         // se byte menor do que 16
      UID.concat(" 0");                                         // insere um zero
    else                                                        // senão
      UID.concat(" ");                                          // insere um espaço

    UID.concat(String(mfrc522.uid.uidByte[i], HEX));            // concatena todos os bytes da UID
  }
  UID.toUpperCase();                                            // converte em maiusculos
  Serial.println(" ");                                          // imprime espaço
}

void BuzzerBeeps(int NumeroBeeps)
{
  int i;
  for (i = 0; i < NumeroBeeps; i++)
  {
    digitalWrite(AcionaBuzzer, HIGH);
    delay(150);                            // atraso de 0,15 segundos
    digitalWrite(AcionaBuzzer, LOW);
    delay(150);                            // atraso de 0,15 segundos
  }
}

void loop()
{
  if ( ! mfrc522.PICC_IsNewCardPresent())   // verifica a presença de etiqueta
  {
    return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial())     // leitura da etiqueta NFC
  {
    return;
  }
  UID = "";                            // limpa o registro de identificação UID
  getUID();                            // lê e formata a identificação UID
  if (UID == TAGLiberada)              // verifica a liberação da etiqueta
  {
    lcd.clear();                       // limpa tela do LCD
    lcd.setCursor(0, 0);               // cursor na coluna 0 linha 0
    lcd.print("Acesso Liberado!");     // print no LCD
    BuzzerBeeps(BeepsLiberado);
    delay(500);                        // atraso de 0,5 segundos
    StandardMessage();                 // print da mensagem no LCD
  }
  else
  {
    lcd.clear();                       // limpa tela do LCD
    lcd.setCursor(1, 0);               // cursor na coluna 1 linha 0
    lcd.print("Acesso Negado!");       // print no LCD
    BuzzerBeeps(BeepsNegado);
    delay(500);                        // atraso de 0,5 segundos
    StandardMessage();                 // print da mensagem no LCD
  }
  delay(500);                          // atraso de 0,5 segundos
}

Para inserir a Identificação da Etiqueta NFC a ser liberada, rode o programa e abra o monitor serial da Arduino IDE. Ao aproximar a etiqueta NFC , a identificação UID será mostrada. Copie essa identificação no Sketch, na linha abaixo (exemplo – insira um espaço antes da UID):

#define TAGLiberada ” 04 58 F1 72 20 4E 80″          // UID da etiqueta NFC liberada

Faça o upload do Sketch no Arduino e a etiqueta será liberada pelo Controle de acesso ! As outras etiquetas terão acesso negado. Com essa montagem, você poderá fazer um controle de fechadura elétrica de porta, por exemplo.

Tenha a Metodologia Eletrogate na sua Escola! Conheça nosso Programa de Robótica Educacional.


Sobre o Autor


José Gustavo Abreu Murta

Consultor e Projetista de Sistemas Embarcados. Técnico em eletrônica, formado em Curso superior de TPD, pós-graduado em Marketing. Trabalhou por muitos anos na IBM na área de manutenção de computadores de grande porte. Aposentou-se, podendo curtir o que mais gosta : estudar e ensinar Tecnologia. Hobista em eletrônica desde 1976. Gosta muito de Fotografia e Observação de aves.


Eletrogate

2 de maio de 2018

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Conheça a Metodologia Eletrogate e Lecione um Curso de Robótica nas Escolas da sua Região!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!