Go Down

Topic: Não consigo visualizar o numero da etiqueta (Read 793 times) previous topic - next topic

denfox

Viva,
Tenho o seguinte código:

// RFID reader for Arduino
// Wiring version by BARRAGAN <http://people.interaction-ivrea.it/h.barragan>
// Modified for Arudino by djmatic
// And pieces from Arduino Playground <http://www.arduino.cc/playground/Learning/PRFID>
// And then modified again by thekidd
// 12.04.2008 - Added interrupt to ensure program does not hang on RFID reader.

//NOTA:
//com este não foi possível ver o número do cartão.

Code: [Select]

#include <avr/interrupt.h>
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

// set up a soft serial port
SoftwareSerial mySerial(rxPin, txPin);

int  val = 0;
char code[10];
int bytesread = 0;

void setup() {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);    // Set rxPin as INPUT to accept SOUT from RFID pin
  pinMode(txPin, OUTPUT);   // Set txPin as OUTPUT to connect it to the RFID /ENABLE pin
  pinMode(ledPin, OUTPUT);  // Let the user know whats up

  // set the data rate for the serial ports
  mySerial.begin(2400);    // RFID reader SOUT pin connected to Serial RX pin at 2400bps
  Serial.begin(9600);      // Serial feedback for debugging in Wiring

  // say something
  Serial.println("Hello World!");
 
  attachInterrupt(0, readRFID, CHANGE); // Setup interrupt for SOUT on RFID reader
  digitalWrite(txPin, LOW);           // Activate the RFID reader
}

void loop() {
  // Do Something
}

void readRFID() {
  digitalWrite(ledPin, LOW);          // Turn off debug LED - Event triggered!
  if((val = mySerial.read()) == 10) { // check for header
   
    bytesread = 0;
   
    while(bytesread<10) {             // read 10 digit code
      val = mySerial.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 10 digit read is complete
      digitalWrite(txPin, HIGH);      // deactivate RFID reader
      digitalWrite(ledPin, HIGH);     // activate LED to show an RFID card was read
      Serial.print("TAG code is: ");  // possibly a good TAG
      Serial.println(code);      // print the TAG code
      }
   
    bytesread = 0;
    digitalWrite(txPin, LOW);           // Activate the RFID reader
  }
}



O código acima lê um cartão/etiqueta e apresenta-o no monitor.
O meu problema é que aparece "YYYYYYYYYYY" no lugar de apresentar o número da etiqueta.
O que acham que está a correr mal?

Muito obrigado,
Qualquer dica será muito apreciada.

denfox

Já verifiquei se estava a ler na banda certa (que o fabricante indica). Se definir fora da banda 2400 não funciona. Logo não poderá ser por ai...

denfox

Viva, tudo o forum.
Ainda sem sucesso...
O que fiz: meti o osciloscópio e vi que o leitor parallax RFID estava a ler a etiqueta/cartão, verifiquei isso pondo a ponta do osciloscópio entre o leitor RFID e o arduino, verificando que a sequência de bis estava a chegar (ao arduino)... verifiquei ainda que a sequência era diferente consoante passava as diferentes etiquetas, sendo assim concluindo que os dados estavam a chegar ao arduino. Continuando, inicialmente estava a dar YYYYYYYYYY com 2 pontinhos por cima dos Y, isso devesse ao facto de não ser reconhecido, ou seja estava fora da tabela hex.
Escrevendo directamente com o código: Serial.println(mySerial.read());
Vi que estava a aparecer o -1
através do site: http://www.pjrc.com/teensy/td_libs_NewSoftSerial.html , quer dizer que não estava a receber nada depois da biblioteca...
É verdade que a minha biblioteca é SoftwareSerial, e a deles é NewSoftSerial ondem explicam que recebendo -1 corresponde a "receber nada".

Acredito que tenha a ver com a biblioteca, mas se não alterei a biblioteca como pode não dar?
Hardware danificado? -> se chega o código à entrada do arduino... Não me parece também que seja do arduino...
Apenas estou a ver um problema, software...

Qualquer dica será muito apreciada.
Cump.
Denfox

bubulindo

Eu nunca usei essa softSerial... mas há aí algo de muito suspeito...

Senão repara...

O teu loop está vazio.
Tens imenso código na read_RFID().

A read_RFID  é uma interrupção.
A read_RFID está configurada para ser chamada sempre que o pino da recepção muda.

Agora à parte técnica...

Sempre que o pino do Rx mudar de estado tu vais correr essa read_RFID... e nessa altura tentas ler um caracter da porta série. Achas que faz sentido? Sempre que um bit aparecer na porta, tu leres um caracter?
Isso, digo eu, vai lixar-te o esquema todo.

Não será algo tipo:

Code: [Select]

#include <avr/interrupt.h>
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

// set up a soft serial port
SoftwareSerial mySerial(rxPin, txPin);

int  val = 0;
char code[11];
int bytesread = 0;

void setup() {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);    // Set rxPin as INPUT to accept SOUT from RFID pin
  pinMode(txPin, OUTPUT);   // Set txPin as OUTPUT to connect it to the RFID /ENABLE pin
  pinMode(ledPin, OUTPUT);  // Let the user know whats up

  // set the data rate for the serial ports
  mySerial.begin(2400);    // RFID reader SOUT pin connected to Serial RX pin at 2400bps
  Serial.begin(9600);      // Serial feedback for debugging in Wiring

  // say something
  Serial.println("Hello World!");
 
  //attachInterrupt(0, readRFID, CHANGE); // É mesmo preciso?
  digitalWrite(txPin, LOW);           // Activate the RFID reader
}

void loop() {
  if (mySerial.available() >=10) { //tu queres ler 10.
     for (int i = 0; i < 10; i ++) {
         code[i] = mySerial.read();
     }
  digitalWrite(txPin, HIGH);      // deactivate RFID reader
  code[10] = '\0'; //end string
  Serial.print(code);
  }//end if

}

eu nunca usei nenhuma destas... mas a julgar pela documentação aqui:

http://www.arduino.cc/en/Reference/SoftwareSerialExample

Isto deve funcionar melhor do que o que tens.
De onde tiraste esse código?

This... is a hobby.

Go Up