collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Arduino + RFID  (Lida 15486 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Carlcox89

  • Mini Robot
  • *
  • Mensagens: 24
Arduino + RFID
« em: 24 de Dezembro de 2010, 12:44 »
Boas, estou a tentar-me iniciar nisto, mas surgiu um problema.
Estou a usar a NewSoftSerial, e o leitor RFID está a funcionar bem, no entanto o que eu queria era que após ele ler uma tag (que esteja enfrente a ele) ele a ignore... ou seja se o utilizador puser uma tag durante 2 segundos enfrente ao leitor, ele apenas lê a tag a primeira vez e faz uma determinada coisa e ignora se ele continuar lá com a tag enfrente ao leitor por mais de 2 segundos.
Neste momento apenas tenho a fazer print do codigo da tag, e não estou a conseguir localizar o sitio para por o Delay(2000);
Citar
if (RFID.available() > 0)
  {
    if (bytesread > 10)
    {
      Serial.println("Weird: buffer overflow");
      bytesread = 0;
    }
    char c = RFID.read();
    if (c == '\r' || c == '\n')
    {
      code[bytesread] = 0;
      if (c == '\r')
      {
      bytesread = 0;
      Serial.print("TAG: ");
      Serial.print(code);
      Serial.println("");
      }
    }
    else
    {
      code[bytesread++] = c;
    }
  }

cumps

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Arduino + RFID
« Responder #1 em: 24 de Dezembro de 2010, 13:57 »
Se calhar era melhor meteres o código todo, mas supostamemte metes o delay ou no inicio ou no fim do loop e deve dar.
Avr fanboy

Offline Carlcox89

  • Mini Robot
  • *
  • Mensagens: 24
Re: Arduino + RFID
« Responder #2 em: 28 de Dezembro de 2010, 17:10 »
Citar

#include <NewSoftSerial.h>
#include <LCD4Bit.h>

int  val = 0;
char code[11];
int bytesread = 0;
char tag1[11] = "0F01C68668"; // this is size 11 because it is a NULL terminating string
char tag2[11] = "0F0302867B";
int switchPin = 11;      //  digital input pin for a switch
int switchState = 0;    // the state of the switch
int rxPin = 9; // RFID reader SOUT pin connected to Serial RX pin at 2400bps to pin8
int enablePin = 10;
int ledpin = 13;
int RED = 4;
int GREEN = 2;
int BLUE = 3;
int doorPin = 12;
LCD4Bit lcd = LCD4Bit(2);
NewSoftSerial RFID(rxPin, -1);

void setup()
{
  Serial.begin(9600);
  Serial.println("OLA");
  pinMode(ledpin, OUTPUT);
  pinMode(switchPin, INPUT);       // set the switch pin to be an input
  pinMode(doorPin, OUTPUT);
  digitalWrite(doorPin, LOW); // lock door
  RFID.begin(2400);
  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  pinMode(enablePin,OUTPUT);       // Set digital pin 2 as OUTPUT to connect it to the RFID /ENABLE pin
  digitalWrite(enablePin, LOW);    // Activate the RFID reader
//  inicialize();
  lcd.init();
  lcd.commandWrite(0x0F);
  lcd.printIn("BEM-VINDO!");
 // delay(3000);
  lcd.clear();
  lcdMessage();

}


void loop()
{
  switchState = digitalRead(switchPin);
   if (switchState == 1) { // if the switch is closed:
     digitalWrite(doorPin, HIGH);
     digitalWrite(ledpin, HIGH);
     delay(9000);
     digitalWrite(ledpin, LOW);
     digitalWrite(doorPin, LOW);
   }
   else { // if the switch is open:
     digitalWrite(doorPin, LOW);
     digitalWrite(ledpin, LOW);
   }

 if (RFID.available() > 0)
  {
    if (bytesread > 10)
    {
      Serial.println("Weird: buffer overflow");
      bytesread = 0;
    }
    char c = RFID.read();
    if (c == '\r' || c == '\n')
    {
      code[bytesread] = 0;
      if (c == '\r')
      {
      bytesread = 0;
      Serial.print("TAG: ");
      Serial.print(code);
      Serial.println("");
      }
    }
    else
    {
      code[bytesread++] = c;
    }
  }

   
}

void lcdMessage(){
  lcd.printIn("   Apresente   ");
  lcd.cursorTo(2, 0);
  lcd.printIn("      ID!      ");
}

boolean findGoodTag(){
  if (checkTag(tag1)){ return true;}
  else if (checkTag(tag2)){ return true;}
  else{
    //serial.print("Bad tag: ");
    //serial.println(code);
    return false;
  }

}

boolean checkTag(char *tag){

  for (int x=0;x<10;x++){
    if( tag
  • != code
  • ){

      return false;
    }
  }
  return true;
}

// Flashes Red LED if failed login
void failed()
{
  digitalWrite(doorPin, LOW);
  digitalWrite(GREEN, LOW);   // Make sure green LED is off
  digitalWrite(BLUE, LOW);  // Make sure blue LED is off
  // Blink red fail LED 3 times to indicate failed key
  for(int i=0; i<5; i++) {
    digitalWrite(RED, HIGH);  // Turn on red LED
    delay(500);
    digitalWrite(RED, LOW);   // Turn off red LED
    delay(500);
  }
}

void sucess()
{     
      digitalWrite(doorPin, HIGH);
      digitalWrite(RED, LOW);
      digitalWrite(BLUE, LOW);
      digitalWrite(GREEN, HIGH);
      delay(9000);
      digitalWrite(GREEN, LOW);
      digitalWrite(doorPin, LOW);
}

void inicialize() {
  for(int i=0; i<8; i++)
  {
  digitalWrite(BLUE, HIGH);
  delay(100);
  digitalWrite(BLUE, LOW);
  delay(150);
  }
  digitalWrite(BLUE, HIGH);
}


Está aí o código todo, está a funcionar "bem", só preciso mesmo de por um delay para que se uma tag estiver a' frente do leitor ele leia e depois ignore, ou seja não ler mais que uma vez durante x segundos. E já experimentei por delay(3000) em vários sitios e ele le a 1ª vez e volta a dar o output para a serial passados 3 segundos...e isto praí 3 ou 4 vezes.

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: Arduino + RFID
« Responder #3 em: 28 de Dezembro de 2010, 17:15 »
Não olhei para o teu código, mas o que tu queres é tipo, passas a tag, reconheces a tag, e nos proximos 2 segundos se essa pessoa voltar a passar a tag nao queres que seja reconhecida, ou mesmo que a pessoa coloque a tag la durante 2 segundos que so seja reconhecida uma vez, certo?!

Offline Carlcox89

  • Mini Robot
  • *
  • Mensagens: 24
Re: Arduino + RFID
« Responder #4 em: 28 de Dezembro de 2010, 19:00 »
Não olhei para o teu código, mas o que tu queres é tipo, passas a tag, reconheces a tag, e nos proximos 2 segundos se essa pessoa voltar a passar a tag nao queres que seja reconhecida, ou mesmo que a pessoa coloque a tag la durante 2 segundos que so seja reconhecida uma vez, certo?!

Certíssimo metro_ !
Eu tenho isso a funcionar com o SoftwareSerial, mas ao adaptar para o NewSoftSerial já nao consegui introduzir esse delay (em qq lado que o ponha o que acontece é q o utilizador deixa o cartão enfrente ao RFID reader durante tipo 2 segundos e aquilo faz output pra Serial do code da tag 3 ou 4 vezes :S )

o unico problema com o codigo que tinha para o SoftwareSerial é que queria usar também um butão e ler o seu estado (isto para abrir a porta do lado de dentro) e pelos vistos a parte de ler o estado do butao nao funciona com o SoftwareSerial, já com o Newsoftserial funciona bem, exatamente o mesmo codigo de ler o butão.
Então mudei tudo para NewSoftSerial, no entanto agora o unico problema é mesmo por esse delay para que a tag nao esteja semrpe a ser lida (ou seja haja um intervalo de espera).
Código antigo:
Citar
void loop()
{
   switchState = digitalRead(switchPin);
   if (switchState==1) { // if the switch is closed:
     digitalWrite(doorPin, HIGH);
     digitalWrite(ledpin, HIGH);
     delay(9000);
     digitalWrite(ledpin, LOW);
     digitalWrite(doorPin, LOW);
   }

if((val = RFID.read()) == 10)
  {   // check for header
    bytesread = 0;
    while(bytesread<10)
    {  // read 10 digit code
      val = RFID.read();
      if((val == 10)||(val == 13))
      {  // if header or stop bytes before the 10 digit reading
        break;                       // stop reading
      }
      code[bytesread] = val;         // add the digit           
      bytesread++;                   // ready to read next digit 
    }
    if (bytesread == 10){
        if (findGoodTag()) {
          Serial.println("VALIDO");
          lcd.clear();
          lcd.printIn("       ID       ");
          lcd.cursorTo(2, 0);
          lcd.printIn("     VALIDA!     ");
          sucess();
          lcd.clear();
          lcdMessage();
        } else {
          Serial.println("INVALIDO");
          lcd.clear();
          lcd.printIn("       ID       ");
          lcd.cursorTo(2, 0);
          lcd.printIn("    INVALIDA!    ");
          failed();
          lcd.clear();
          lcdMessage();
        }
    }

    bytesread = 0;
    digitalWrite(GREEN, LOW);
    digitalWrite(RED, LOW);
    digitalWrite(BLUE, HIGH);
    delay(5500); 
  }

}

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: Arduino + RFID
« Responder #5 em: 30 de Dezembro de 2010, 21:06 »
Dizes que o delay a seguir ao digitalWrite dos leds não funciona!?

Offline Carlcox89

  • Mini Robot
  • *
  • Mensagens: 24
Re: Arduino + RFID
« Responder #6 em: 31 de Dezembro de 2010, 01:19 »
Dizes que o delay a seguir ao digitalWrite dos leds não funciona!?

o código que citei por ultimo usa SoftwareSerial e funciona bem excepto a parte de ler o butão (digitalRead(switchPin)) isso nunca chega a funcionar.
Se conseguisse por isso a funcionar, excusava de usar a NewSoftSerial...
também nao me acredito que seja o único que nao consigo por o SoftwareSerial a funcionar com o RFID e mais um digitalRead a ler um switch (ON/OFF) :|

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Arduino + RFID
« Responder #7 em: 31 de Dezembro de 2010, 01:40 »
Mas supostamemte o NewSoftwareSerial é melhor que o antigo Software Serial, dai o New no nome..
Isso são problemas meio estranhos, mas é provavel que tenha algo a ver com o facto de o delay e o NewSoftSerial dependerem ambos de interrupções de timers.
Avr fanboy

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: Arduino + RFID
« Responder #8 em: 31 de Dezembro de 2010, 02:47 »
Mas supostamemte o NewSoftwareSerial é melhor que o antigo Software Serial, dai o New no nome..
Isso são problemas meio estranhos, mas é provavel que tenha algo a ver com o facto de o delay e o NewSoftSerial dependerem ambos de interrupções de timers.

Mas o delay usa timers?! É provavel mas normalmente este delay é feito com for's e nop!

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Arduino + RFID
« Responder #9 em: 31 de Dezembro de 2010, 02:53 »
Directamente não, mas o millis do arduino é criado usando o overflow de um timer, e a função de delay do arduino usa a millis, logo indirectamenta o delay depende de interrupções para funcionar, mas as bibliotecas bit-banged serial tambem dependem de outras interrupções ou do milis, não sei porque nunca vi o source para funcionarem sincronizadas e para conseguirem manter o baud-rate, o resultado disso é uma molhada de interrupts a disparar por todo o lado, o Arduino é basicamente uma confusão de código cada vez mais desorganizada..
Avr fanboy

Offline Carlcox89

  • Mini Robot
  • *
  • Mensagens: 24
Re: Arduino + RFID
« Responder #10 em: 31 de Dezembro de 2010, 12:40 »
Resumindo para eu que estou a iniciar.
Há outra maneira de fazer isto com ambas as partes a funcionar ? Não me importa se é NewSoftSerial ou a antiga SoftwareSerial.
Obrigado

Offline metRo_

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 3.753
Re: Arduino + RFID
« Responder #11 em: 31 de Dezembro de 2010, 14:43 »
Resumindo para eu que estou a iniciar.
Há outra maneira de fazer isto com ambas as partes a funcionar ? Não me importa se é NewSoftSerial ou a antiga SoftwareSerial.
Obrigado

Tenta saber que timers essas bibliotecas usam! Cria um post no arduino.cc ou perguntam directamente a quem fez a newsoftserial, normalmente esse pessoal responde rápido :) Depois de se saber isso tenta-se arranjar um solução.

O ideal no entanto era fazeres uma maquina de estados do que queres fazer para que nos consigamos perceber também o que realmente queres fazer. Faz num papel e digitalizas ou utilizando algum software.


Offline Carlcox89

  • Mini Robot
  • *
  • Mensagens: 24
Re: Arduino + RFID
« Responder #12 em: 07 de Janeiro de 2011, 20:51 »
Citar

Tenta saber que timers essas bibliotecas usam! Cria um post no arduino.cc ou perguntam directamente a quem fez a newsoftserial, normalmente esse pessoal responde rápido :) Depois de se saber isso tenta-se arranjar um solução.

O ideal no entanto era fazeres uma maquina de estados do que queres fazer para que nos consigamos perceber também o que realmente queres fazer. Faz num papel e digitalizas ou utilizando algum software.



O problema é que já pus um topico lá e também ninguem me conseguiu ajudar por completo.
No entanto o que pretendo acho que é "simples" pelo menos na minha maneira de pensar.
Estado inicial: PORTA FECHADA
Tendo duas maneiras de abrir a porta: RFID READER (lado fora) + Pushbutton switch (lado dentro)

Ao passar o cartão a porta abre durante 9 segundos, fecha-se após isso.
Ao carregar no butão a porta abre durante 9 segundos e fecha-se após isso.

O grande problema está em conjugar as duas coisas, o código com NewSoftSerial está a funcionar, só não consigo encontrar sítio para lhe por o delay de 3 ou 4 segundos para que caso alguem esteja com um cartão à frente do RFID reader durante tipo 2 segundos ele ignore, ou seja lê o cartão (é rapido a ler <1 segundo, ja testei) e abre a porta e ignora que o utilizador ainda lá esteja com o cartão. Claro que depois da porta fechar, volta ao inicio do loop, volta a ler cartão e abre a porta. O código basicamente está todo feito, tudo funciona, só nao sei mesmo onde pôr o delay.

Se alguem entendido na matéria olhar para o código que pus feito com o SoftwareSerial (esse está totalmente funcional com delay) e conseguir adaptar só o delay para o novo código... agradeço imenso. É que no arduino.cc ninguem me conseguiu ajudar :/ . E  só me falta mesmo isto para concluir o projecto

Offline kast

  • Mini Robot
  • *
  • Mensagens: 868
Re: Arduino + RFID
« Responder #13 em: 07 de Janeiro de 2011, 22:43 »
Não percebi bem porque estás a utilizar essas bibliotecas.
Já fiz um projecto com rfid, tb precisava de um delay e não utilizava nenhuma dessas bibliotecas.
O unico problema é ter de desligar o módulo rfid quando quer fazer upload de algum sketch.

Assim de repente e sem ver o código que escreveste vejo 2 soluções:

1- Porque não ligar o botão a um pin analógico do arduino ... será que resolve ??? (provavelmente sim)
2- (provavelmente a solução menos elegante) Pões o arduino a contar que ele não se cansa :), se necessário utiliza mais que um for

Espero ter ajudado, se mesmo assim não conseguires diz que analiso o teu problema mais a fundo.
Os electrões são nossos amigos !!! :D

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Arduino + RFID
« Responder #14 em: 07 de Janeiro de 2011, 23:05 »
Não estou é a perceber o problema de alguem ter o cartão á frente do leitor 2 segundos.
A contar não é bem assim, o gcc se vir um loop que não faz nada optimiza esse mesmo loop para fora do código.

Mas se realmente queres essa funcionalidade, faz isto:
Estuda um bocadinho do código do blinky sem delay.
E fazes algo assim:
Código: [Seleccione]
if((milis() - lastMilis) > 2000){
 ler_cartao();
 lastMilis=milis();
}
Avr fanboy