sábado, 14 de setembro de 2013

Arduino leonardo + RFID introdução

O Arduino Leonardo difere de todas as placas precedentes por que o ATmega32u4 tem comunicação USB embarcada, eliminando a necessidade de um segundo processador. Isto permite ao Leonardo aparecer em um computador conectado como um mouse ou um teclado além de uma porta COM virtual (CDC) serial.

Isso torna essa placa otina para interfacear com computador pela USB. Vamos descrever ao longo desse post como utilizar em conjunto com um modulo de RFID, vamos fazer a leitura desse cartão, e verificar se ele foi previamente cadastrado, se sim, o programa vai bloquear/desbloquear o windows(win+l)

Em um ambiente de trabalho esse projeto traz mais segurança as suas informações, sem necessidade de digitar senhas e se expor a vírus etc... Existe a possibilidade de ler o cartão e executar uma ação, assim como ficar lendo continuamente, se o cartão com a senha não estiver mais presente ele toma uma ação.

Nessa primeira parte vamos mostrar a leitura do cartão. Não vou entrar em detalhes sobre os módulos porque já foi feito nos reviews:

Review Arduino Leonardo
Review RFID Shield

Biblioteca usada

Esse exemplo faz a leitura de todos blocos de memoria de 0x00 até 0x63:
Esta tudo bem comendado e fácil de entender, vou colocar um vídeo para exemplificar

  1. #include <PN532.h>
  2. #define SCK 13
  3. #define MOSI 11
  4. #define SS 10
  5. #define MISO 12
  6. PN532 nfc(SCK, MISO, MOSI, SS);
  7. void setup(void)
  8. {
  9.     Serial.begin(9600);
  10.     Serial.println("Ola!");
  11.     nfc.begin();
  12.     uint32_t versiondata = nfc.getFirmwareVersion();
  13.     if (! versiondata)
  14.     {
  15.         Serial.print("Placa com PN53x nao encontrada");
  16.         while (1); // para programa
  17.     }
  18.     // Recebeu dados, hora de imprimir!
  19.     Serial.print("Chip PN5 encontrado"); Serial.println((versiondata>>24) & 0xFF, HEX);
  20.     Serial.print("Versao do Firmware: "); Serial.print((versiondata>>16) & 0xFF, DEC);
  21.     Serial.print('.'); Serial.println((versiondata>>8) & 0xFF, DEC);
  22.     Serial.print("Suporta "); Serial.println(versiondata & 0xFF, HEX);
  23.     // configura placa para ler RFID
  24.     nfc.SAMConfig();
  25. }
  26. void loop(void)
  27. {
  28.     uint32_t id;
  29.     // procura por cartoes
  30.     id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);
  31.     if (id != 0)
  32.     {
  33.         Serial.print("Lendo cartao #");
  34.         Serial.println(id);
  35.         Serial.println();
  36.         uint8_t keys[]= {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};  // chave primaria de cartao novo
  37.         for(uint8_t blockn=0;blockn<64;blockn++)
  38.         {
  39.             if(nfc.authenticateBlock(1, id ,blockn,KEY_A,keys)) //autentica bloco
  40.             {
  41.                 //se autenticou com sucesso
  42.                 uint8_t block[16];
  43.                 //faz leitura do bloco de memoria
  44.                 if(nfc.readMemoryBlock(1,blockn,block))
  45.                 {
  46.                     //se operacao de leitura teve sucesso
  47.                     for(uint8_t i=0;i<16;i++)
  48.                     {
  49.                         //imprime bloco de memoria
  50.                         Serial.print(block[i],HEX);
  51.                         if(block[i] <= 0xF) //arrumando dados para mostra de forma mais bonita
  52.                         {
  53.                             Serial.print("  ");
  54.                         }
  55.                         else
  56.                         {
  57.                             Serial.print(" ");
  58.                         }
  59.                     }
  60.                     Serial.print("| Bloco ");
  61.                     if(blockn <= 9) //arrumando dados para mostra de forma mais bonita
  62.                     {
  63.                         Serial.print(" ");
  64.                     }
  65.                     Serial.print(blockn,DEC);
  66.                     Serial.print(" | ");
  67.                     if(blockn == 0)
  68.                     {
  69.                         Serial.println("Block do produtor");
  70.                     }
  71.                     else
  72.                     {
  73.                         if(((blockn + 1) % 4) == 0)
  74.                         {
  75.                             Serial.println("Setor");
  76.                         }
  77.                         else
  78.                         {
  79.                             Serial.println("Dados do bloco");
  80.                         }
  81.                     }
  82.                 }
  83.             }
  84.         }
  85.     }
  86.     delay(2000);
  87. }


Ao se aproximar o cartão do modulo tem a seguinte leitura:



Chip PN5 encontrado32
Versao do Firmware: 1.6
Suporta 7
Found 1 tags
Sens Response: 0x4
Sel Response: 0x8
 0x7 0x83 0xBE 0x4ELendo cartao #126074446

7  83 BE 4E 74 8  4  0  B9 46 7  83 BE 4E 74 2  | Bloco  0 | Block do produtor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco  1 | Dados do bloco
A  FF FF 7F F5 0  0  80 A  FF FF 7F 0  FF 0  FF | Bloco  2 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco  3 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco  4 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco  5 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco  6 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco  7 | Setor
0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F  | Bloco  8 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco  9 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 10 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 11 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 12 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 13 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 14 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 15 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 16 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 17 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 18 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 19 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 20 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 21 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 22 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 23 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 24 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 25 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 26 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 27 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 28 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 29 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 30 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 31 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 32 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 33 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 34 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 35 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 36 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 37 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 38 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 39 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 40 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 41 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 42 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 43 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 44 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 45 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 46 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 47 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 48 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 49 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 50 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 51 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 52 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 53 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 54 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 55 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 56 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 57 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 58 | Dados do bloco
0  0  0  0  0  0  FF 7  80 69 FF FF FF FF FF FF | Bloco 59 | Setor
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 60 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 61 | Dados do bloco
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  | Bloco 62 | Dados do bloco
0  0  0  0  0  0  FF 7  80 BC FF FF FF FF FF FF | Bloco 63 | Setor


Assim conseguimos fazer a leitura completa do cartão, no próximo post vamos aprender a escrever os dados no cartão.

2 comentários:

  1. Olá
    É possível realizar a leitura dos dados de um celular que possua a tecnologia nfc com essa shield ?

    ResponderExcluir
    Respostas
    1. Oi Plinio, com Arduino nunca vi funcionando. Não sei te dizer ao certo se funciona e a compatibilidade com telefones.

      abs

      Excluir