Olá pessoal,

Estou tentando construir um leitor de Tags RFID que leia o ID e o guarde, junto com data e hora em um cartão de memória, porém quando coloco o comando para abrir o arquivo "variável = SD.open ("arquivo.txt", FILEWRITE);" o programa não consegue detectar mais de uma tag. Ele detecta a tag que entra no campo, guarda o valor mas não faz um loop, identificando após o tempo de delay. Gostaria de saber se alguem ja passou  por isso e como solucionou. Não achei muita coisa online a respeito, pelo menos nada que desse resultado.

Exibições: 718

Anexos

Responder esta

Respostas a este tópico

Olá,

Antes que nada sugiro ler este link e postar da maneira adequada, creio que será melhor para que os colegas lhe ajudem.

http://labdegaragem.com/forum/topics/sugest-o-de-como-postar

Você esta usando o codigo do link abaixo?:

http://www.arduinoecia.com.br/2016/10/modulo-pn532-nfc-rfid-arduino...

Eu tenho um tutorial de envio da TAG mas usando o RFID Milfare e um site de IoT link abaixo no meu canal, e na descrição do vídeo link do projeto completo.

https://www.youtube.com/watch?v=a9HOjz0DkN8&t=3s 

Abs.

CK 

Olá,

Esse código foi adaptado seguindo o exemplo "Read all memory blocks" que vem juntamente da biblioteca PN532, ou seja, este:

//This example reads all MIFARE memory block from 0x00 to 0x63.
//It is tested with a new MIFARE 1K cards. Uses default keys for authenication.
//Contributed by Seeed Technology Inc (www.seeedstudio.com)

#include <PN532.h>
#include <SPI.h>

/*Chip select pin can be connected to D10 or D9 which is hareware optional*/
/*if you the version of NFC Shield from SeeedStudio is v2.0.*/
#define PN532_CS 10

PN532 nfc(PN532_CS);

#define  NFC_DEMO_DEBUG 1

void setup(void) {
#ifdef NFC_DEMO_DEBUG
  Serial.begin(9600);
  Serial.println("Hello!");
#endif
  nfc.begin();

  uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
#ifdef NFC_DEMO_DEBUG
    Serial.print("Didn't find PN53x board");
#endif
    while (1); // halt
  }
#ifdef NFC_DEMO_DEBUG
  // Got ok data, print it out!
  Serial.print("Found chip PN5");
  Serial.println((versiondata>>24) & 0xFF, HEX);
  Serial.print("Firmware ver. ");
  Serial.print((versiondata>>16) & 0xFF, DEC);
  Serial.print('.');
  Serial.println((versiondata>>8) & 0xFF, DEC);
  Serial.print("Supports ");
  Serial.println(versiondata & 0xFF, HEX);
#endif
  // configure board to read RFID tags and cards
  nfc.SAMConfig();
}

void loop(void) {
  uint32_t id;
  // look for MiFare type cards
  id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);

  if (id != 0)
  {
#ifdef NFC_DEMO_DEBUG
    Serial.print("Read card #");
    Serial.println(id);
    Serial.println();
#endif
  /* uint8_t keys[]= { 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF };// default key of a fresh card
    for(uint8_t blockn=0;blockn<64;blockn++)
    {
      if(nfc.authenticateBlock(1, id ,blockn,KEY_A,keys)) //authenticate block blockn
      {
        //if authentication successful
        uint8_t block[16];
        //read memory block blockn
        if(nfc.readMemoryBlock(1,blockn,block))
        {
#ifdef NFC_DEMO_DEBUG
          //if read operation is successful
          for(uint8_t i=0;i<16;i++)
          {
            //print memory block
            Serial.print(block[i],HEX);
            if(block[i] <= 0xF) //Data arrangement / beautify
            {
              Serial.print("  ");
            }
            else
            {
              Serial.print(" ");
            }
          }

          Serial.print("| Block ");
          if(blockn <= 9) //Data arrangement / beautify
          {
            Serial.print(" ");
          }
          Serial.print(blockn,DEC);
          Serial.print(" | ");

          if(blockn == 0)
          {
            Serial.println("Manufacturer Block");
          }
          else
          {
            if(((blockn + 1) % 4) == 0)
            {
              Serial.println("Sector Trailer");
            }
            else
            {
              Serial.println("Data Block");
            }
          }
#endif
        }
      }
    } */
  }
  delay(1000);
}

Estou usando um shield da Elecrow (https://www.elecrow.com/wiki/index.php?title=NFC_Shield) que utiliza a biblioteca PN532.

Quando não coloco o Cartão SD, a saída fica conforme a imagem:

Agora, quando eu coloco a instrução pra abrir, escrever e fechar o arquivo, ele se comporta da seguinte forma:

talvez você deva mudar o esquema, abra o arquivo no setup e use a função SD.flush(), esse comando força a biblioteca a gravar os dados fisicamente, o tempo de abrir/gravar/ fechar, vai deixar de existir

Acredito que esteja usando a sintaxe do flush() errado, pois ele não conseguiu abrir o arquivo:

//Placa PN532 NFC
#include <PN532.h>
#include <SPI.h>
#define PN532_CS 10
PN532 nfc(PN532_CS);
#define  NFC_DEMO_DEBUG 1

//RTC
#include <Time.h>
#include <DS1307.h>
DS1307 rtc (A4, A5);



//CARTAO SD
#include <SPI.h>
#include <SD.h>
Sd2Card card;
const int chipSelect = 8;
File CatracaLog;


void setup(void) {
SD.begin (8);
CatracaLog.flush();

#ifdef NFC_DEMO_DEBUG
  Serial.begin(9600);
  Serial.println("Olá");
#endif  
nfc.begin();


uint32_t versiondata = nfc.getFirmwareVersion();
  if (! versiondata) {
#ifdef NFC_DEMO_DEBUG
    tone(5,262,200); //DO
    delay(200);
    tone(5,262,200); //DO
    delay(200);
    Serial.print("Didn't find PN53x board");
#endif
    while (1); // halt
  }
 
#ifdef NFC_DEMO_DEBUG
  // Got ok data, print it out!
  Serial.print("Found chip PN5");
  Serial.println((versiondata>>24) & 0xFF, HEX);
  Serial.print("Firmware ver. ");
  Serial.print((versiondata>>16) & 0xFF, DEC);
  Serial.print('.');
  Serial.println((versiondata>>8) & 0xFF, DEC);
  Serial.print("Supports ");
  Serial.println(versiondata & 0xFF, HEX);
#endif

// configure board to read RFID tags and cards
  nfc.SAMConfig();
    
rtc.halt(false);
  //As linhas abaixo setam a data e hora do modulo
  //e podem ser comentada apos a primeira utilizacao
  //rtc.setDOW(SATURDAY);      //Define o dia da semana
  //rtc.setTime(03, 01, 0);   //Define o horario
  //rtc.setDate(04, 11, 2017);   //Define o dia, mes e ano
 
  //Definicoes do pino SQW/Out
  rtc.setSQWRate(SQW_RATE_1);
  rtc.enableSQW(true);

    //Mostra as informações no Serial Monitor
  Serial.print("Hora atual : ");
  Serial.print(rtc.getTimeStr());
  Serial.print(" ");
  Serial.print("Data atual: ");
  Serial.print(rtc.getDateStr(FORMAT_SHORT));
  Serial.print(" ");
  Serial.println(rtc.getDOWStr(FORMAT_SHORT));
 
}

void loop(void) {
 uint32_t id;
  // look for MiFare type cards
  id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);

    if (id != 0){

    Serial.print("Read card #");
    Serial.println(id);
    Serial.println();

    //CatracaLog = SD.open("log.txt", FILE_WRITE);
    

    if (CatracaLog) {
    Serial.println("Hora: ");
    Serial.println(rtc.getTimeStr());  
    Serial.println("Data:");
    Serial.println(rtc.getDateStr(FORMAT_SHORT));
    
    Serial.print("ID: #");
    Serial.println(id);
    Serial.println();
    
     
    CatracaLog.print("ID do cartão lido: #");
    CatracaLog.print(id);
    CatracaLog.print(" ");
    
    CatracaLog.print("Hora : ");
    CatracaLog.print(rtc.getTimeStr());
    CatracaLog.print(" ");
    CatracaLog.print("Data : ");
    CatracaLog.print(rtc.getDateStr(FORMAT_SHORT));
    CatracaLog.println(" ");
    
    // Fechando o arquivo:
   CatracaLog.close();
    
    tone(5,262,200); //DO
    delay(200);
    
  } else {
    tone(5,262,800); //DO
    delay(1000);
    tone(5,262,800); //DO
    delay(1000);
    // if the file didn't open, print an error:
    Serial.println("Erro ao tentar abrir o arquivo log.txt para escrita");
    //return;
    }
  }
    // if the file didn't open, print an error:
    //Serial.println("Erro ao tentar abrir o arquivo log.txt para escrita");
    //return;
    delay (3000);
    }

Ta certo?

Boa tarde APA.

Recomendações:
1. Leia http://labdegaragem.com/forum/topics/sugest-o-de-como-postar
2. Remova seu sketch da área de texto do seu tópico;
3. Clique em : " Deseja carregar arquivos? " e depois em " Escolher arquivo" e anexe o arquivo
com o seu sketch.

RV

Boa tarde!

Sim concordo com o Mineirin.

Postando muito código na área do post fica difícil de analisar pois, além de ficar desalinhado, mistura código com texto, dificultando as buscas.

Porque você usou

SD.begin (8);

No Arduino UNO, normalmente é

SD.begin (10) ou SD.begin ();

Por conta do Shield do NFC mudei o conector dele. Acha que isso pode estar interferindo?

MISO -- 12
MOSI -- 11
SCK -- 13
CS -- 8

Obs: 3.3 v não conectado, nem o eu GND.

Alex, Você já fez testes separados de cada dispositivo? Funcionou?

Pode ser que o NFC esteja entrando em conflito com o SD, devido ao pino SS.

O NFC por padrão é o pino 10

Veja se este post te ajuda;

http://forum.arduino.cc/index.php?topic=225914.0

Sim. As funcionalidades foram testadas de forma distinta e não houve problemas, mesmo com esse padrão alterado. Vale destacar que a funcionalidade de gravar no SD não deixa de acontecer, ela só não entra em loop como deveria.

Isso acontece quando a instrução " SD.open("log.txt", FILE_WRITE);" é chamada no código, mesmo com pinos diferentes, tendo sua conclusão de escrita, pois o dado aparece no cartão. Após esse comando de escrita, o dispositivo não volta no início do "void loop (void){...}"


O shield de NFC que eu estou usando tem padrão 9 e 10 como pinos para o SS, conforme a imagem abaixo fornecida pelo fabricante:

Sobre o tutorial, irei tentar mais tarde e posto aqui a resposta.

Agradeço pela ajuda.

Alex, bom dia!

Se o cartão gravou uma vez, então a configuração deve estar certa.

O problema pode ser nesse IF abaixo:

id = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A);

if (id != 0){ ....

Imprima o valor da variável id na serial para ver se ela está sendo obtida corretamente todas as vezes.

Boa noite,

Sim. Está sendo obtida corretamente. O Cartão parece interromper o processo todo.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço