//NOTA:
//com este não foi possível ver o número do cartão.
#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.
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: NewSoftSerial Library, for an extra serial port , 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...
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:
#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:
Isto deve funcionar melhor do que o que tens.
De onde tiraste esse código?