Go Down

Topic: Problema con lector RFID (FDX-B) de Priority 1 Design (Read 1 time) previous topic - next topic

surbyte

has probado lo que yo te sugerí antes, usar el Arduino como una interfaz entre una terminal de la PC y el módulo RFID?

clemenlg

Sí, se me olvidó comentarlo. Mismo resultado que la prueba anterior. :(

clemenlg

#17
Jul 26, 2019, 10:07 am Last Edit: Jul 26, 2019, 01:52 pm by clemenlg
Me acaba de llegar el arduino uno que compré, para probar, pero el resultado es el mismo.
No me lee por TTL, de hecho, con el hardware en el que uso cables de protoboard conectado al UNO, el método available no me devuelve nunca un valor positivo. Lo he probado alimentando de 5v del UNO, así como haciéndolo desde una fuente externa.
¿Tan torpe seré que todos lo consiguen fácilmente y yo no puedo? :smiley-confuse: No parece difícil el código de quien sí lo ha logrado hacer funcionar, de hecho, otros le dan las gracias porque con ese código les lee la etiqueta.
Este es el código que les funciona (a parte, muestra el código en una pantalla LCD):
Code: [Select]

// include the library code:
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
#define WHITE 0x7 //set the backlight colour
SoftwareSerial RFID(2, 3); //pin2 Rx, pin3 Tx

int CMD[64];
int comlen = 0;
int out_flag = 0;

void setup()
{
  Serial.begin(9600);
  lcd.begin(16, 2); // set up the LCD's number of columns and rows:
  RFID.listen();
  Serial.println("Tag number will be displayed here if detected by the module:\n");
  lcd.print("Your tag No is:");
  lcd.setCursor(0, 1); //place cursor on 2nd row for tag number
 
  RFID.begin(9600); // set the data rate for the RFID reader
  delay(10);

}
void loop()

{

  while (Serial.available())
  {
    int a = SerialReadHexDigit();
    if (a >= 0) {
      CMD[comlen] = a;
      comlen++;
    }
    delay(10);
  }

  for (int i = 0; i < comlen; i += 2) {
    int c = RFID.write( CMD[i] * 16 + CMD[i + 1]);
  }
  comlen = 0;

  while (RFID.available()) {
    byte C = RFID.read();
    //if (C<16) Serial.print("0"); //Future use for tags with less numbers
    Serial.write(C);  //Display tag number on serial bus in human form
       
    lcd.write(C);     //Display tag number on LCD
   
    //Serial.print(" "); //Puts space between each digit on Serial Monitor
    out_flag = 1;
  }
  if (out_flag > 0) {
    Serial.println();
    out_flag = 0;
    lcd.setCursor(0, 1);
  }
}
int SerialReadHexDigit()
{
  byte c = (byte) Serial.read();
  if (c >= '0' && c <= '9') {
    return c - '0';
  } else if (c >= 'a' && c <= 'f') {
    return c - 'a' + 10;
  } else if (c >= 'A' && c <= 'F') {
    return c - 'A' + 10;
  } else {
    return -1;   // getting here is bad: it means the character was invalid
  }
}

Sólo me queda por pensar que ellos no estén leyendo chips de animales (FDX-B), aunque me parece raro, ya que es la principal diferencia de este lector.

surbyte

Hola Clemente. He leído el manual de la placa y no encontré nada que se nos pasara.
Lo único que voy a decirte aunque suene a locura, es que inviertas los pines RX y TX ya que en ningún momento has leído algo como respuesta de la placa es raro que esto suceda. Siempre se lee algo.
Lo unico que recibes es 00000 que para colmo no esta documentado o no he visto que significa.

Se me ocurren dos cosas: 1 que busques una interfaz TTL a USB para probarlo con el programa de Priority1 y te sacas la duda si funciona o no y la 2da es que los consultes a ellos para iniciar una guia de cómo resolver el problema.

Esto funciona asi?
Quote
Additionally the peripheral control outputs allow a duel color led, and buzzer to be used to give audio and visual PASS indications when a transponder comes within reading range.

clemenlg

#19
Jul 27, 2019, 10:34 am Last Edit: Jul 27, 2019, 10:39 am by clemenlg
Hola Clemente. He leído el manual de la placa y no encontré nada que se nos pasara.
Lo único que voy a decirte aunque suene a locura, es que inviertas los pines RX y TX ya que en ningún momento has leído algo como respuesta de la placa es raro que esto suceda. Siempre se lee algo.
Lo unico que recibes es 00000 que para colmo no esta documentado o no he visto que significa.

Se me ocurren dos cosas: 1 que busques una interfaz TTL a USB para probarlo con el programa de Priority1 y te sacas la duda si funciona o no y la 2da es que los consultes a ellos para iniciar una guia de cómo resolver el problema.

Esto funciona asi?
Lo de intercambiar RX y TX ya lo hice hace tiempo, y no funciona.
Se me ha ocurrido hacer un programa simple, el cual sólo con Arduino (quitando el RFID), y conectando RX y TX al mismo pin, intente escribir y leer de él. Es algo muy sencillo, sólo pruebo la comunicación TTL escribiendo y leyendo del mismo pin, para comprobar si soy capaz de mantener una comunicación por TTL.
El código sería así:
Code: [Select]

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 8

SoftwareSerial RFID = SoftwareSerial(rxPin, txPin); //RX, TX

void setup(){
  Serial.begin(9600);  // start serial to PC
  RFID.listen();
  RFID.begin(9600);    // start serial to RFID reader
  delay(10);
}

void loop(){
  if(RFID.available()) {
    Serial.println("OK->RAT");
    RFID.print(F("RAT"));
  }
  else
    Serial.println("KO->RAT");
  delay(500);
  if(RFID.available()) {
    Serial.println("OK->read");
    Serial.println(RFID.read());
  }
  else
    Serial.println("KO->read");
  delay(1000);
}

En Arduino no debería tener nada conectado, y debería poder mandar el texto y luego mostrarlo por el serial, ¿no?
Pues si lo anterior es correcto, algo tengo mal, porque nunca me da un valor positivo en el available(). El resultado de la ejecución es:
Code: [Select]

KO->RAT
KO->read
KO->RAT
KO->read
KO->RAT
KO->read
KO->RAT
KO->read
KO->RAT
KO->read

Si simplifico el código mucho más, eliminando las comprobaciones de available del loop, es decir, dejando en el loop sólo:
Code: [Select]

  RFID.print("RAT");
  Serial.println(RFID.read());

El resultado siempre es -1 (lógico, no comprueba si está disponible o no el TTL).
Si todo lo comentado anteriormente es correcto, algo hago muy mal, pero sigo sin saber qué.

surbyte

Ya que tienes varios NANOs porque no usas el código en el que uno envia y el otro recibe y comuncas dos NANOs y te sacas la duda bien no con lo que has probado que no se hasta que punto esta bien.

Dos NANOs con GND compartido, RX a TX del otro y lo mismo con los otros cables.

Abres dos IDEs y con los dos monitores Serie cuando envies algo debería recibirlo el otro y viceverza.
Eso SI O SI debe funcionar, y si no lo hace, algo puede estar mal en alguna librería o en tu IDE pero es muy raro.

clemenlg

#21
Jul 27, 2019, 11:34 pm Last Edit: Jul 28, 2019, 12:00 am by clemenlg
Ya que tienes varios NANOs porque no usas el código en el que uno envia y el otro recibe y comuncas dos NANOs y te sacas la duda bien no con lo que has probado que no se hasta que punto esta bien.

Dos NANOs con GND compartido, RX a TX del otro y lo mismo con los otros cables.

Abres dos IDEs y con los dos monitores Serie cuando envies algo debería recibirlo el otro y viceverza.
Eso SI O SI debe funcionar, y si no lo hace, algo puede estar mal en alguna librería o en tu IDE pero es muy raro.
Bueno, pues he hecho la prueba, y salvo fallo mío con el montaje o con el código, debo tener algún problema con los IDE, pero es raro, porque otros montajes me funcionan correctamente (como sensores de UVB, ...).
He conectado dos Arduinos, un Nano y un Uno.
Código del Arduino Uno:
Code: [Select]

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

SoftwareSerial RFID = SoftwareSerial(rxPin, txPin); //RX, TX

void setup(){
  Serial.begin(9600);  // start serial to PC
  RFID.listen();
  RFID.begin(9600);    // start serial to RFID reader
  delay(10);
}

void loop(){
  if(RFID.available()) {
    Serial.println("Enviando desde Uno");
    RFID.print("Hola desde Uno");
  }
  else
    Serial.println("KO hola Uno");
  delay(500);
  if(RFID.available()) {
    Serial.println("Recibiendo desde Nano");
    Serial.println(RFID.read());
  }
  else
    Serial.println("KO recibiendo desde Nano ");
  delay(1000);
}

Código del Arduino Nano:
Code: [Select]

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 9

SoftwareSerial RFID = SoftwareSerial(rxPin, txPin); //RX, TX

void setup(){
  Serial.begin(9600);  // start serial to PC
  RFID.listen();
  RFID.begin(9600);    // start serial to RFID reader
  delay(10);
}

void loop(){
  if(RFID.available()) {
    Serial.println("Enviando desde Nano");
    RFID.print("Hola desde Nano");
  }
  else
    Serial.println("KO hola Nano");
  delay(500);
  if(RFID.available()) {
    Serial.println("Recibiendo desde Uno");
    Serial.println(RFID.read());
  }
  else
    Serial.println("KO recibiendo desde Uno");
  delay(1000);
}

No puedo tener los 2 monitores serie a la vez en dos IDE distintos, porque al cambiar el puerto en uno me lo cambia también en el otro, no obstante, debería ser capaz de recoger los datos enviados desde el otro Arduino.
Las conexiones son GND con GND y RX de uno con TX de otro y viceversa.
Adjunto foto:

Si el montaje y el código están bien, ¿el problema sería del IDE? :smiley-confuse:
Uso el IDE de Arduino 1.8.2 sobre GNU/Linux (Ubuntu), aun así, he arrancado un portátil con Windows 7 y he instalado el último IDE (1.8.9), he subido los códigos, y el resultado es el mismo. :smiley-eek-blue:

clemenlg

#22
Jul 28, 2019, 10:13 am Last Edit: Jul 28, 2019, 10:18 am by clemenlg
He vuelto a probar lo mismo, pero esta vez desde el Arduino Nano al Arduino Mega 2560, con el mismo código.
Comparto GND entre ambos, y el RX de uno va al TX del otro y viceversa.

Código:
Code: [Select]

#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3

SoftwareSerial RFID = SoftwareSerial(rxPin, txPin); //RX, TX

void setup(){
  Serial.begin(9600);  // start serial to PC
  RFID.listen();
  RFID.begin(9600);    // start serial to RFID reader
  delay(10);
}

void loop(){
  if(RFID.available()) {
    Serial.println("Enviando desde Uno");
    RFID.print("Hola desde Uno");
  }
  else
    Serial.println("KO hola Uno");
  delay(500);
  if(RFID.available()) {
    Serial.println("Recibiendo desde Nano");
    Serial.println(RFID.read());
  }
  else
    Serial.println("KO recibiendo desde Nano ");
  delay(1000);
}

Resultado:
Code: [Select]

KO hola Uno
KO recibiendo desde Nano
KO hola Uno
KO recibiendo desde Nano
KO hola Uno
KO recibiendo desde Nano
KO hola Uno
KO recibiendo desde Nano
KO hola Uno
KO recibiendo desde Nano
KO hola Uno
KO recibiendo desde Nano
...

Es decir, no da available nunca.
He hecho esta prueba porque quería descartar problemas de usar un arduino chino (el nano), usando 2 Arduinos originales y nuevos.
También he de descartar problema de IDE, así como de SO, ya que lo he probado en dos equipos nuevos, y con dos IDES distintos (incluso distintas versiones). También he eliminado de la ecuación la protoboard, conectando directamente los Arduino, por si fuera problema de mala conexión de la misma, e incluso los cables de prototipado.

surbyte

Lo mas importante es que esto

Code: [Select]
SoftwareSerial RFID = SoftwareSerial(rxPin, txPin); //RX, TX

esta mal definido, debe ser asi

Code: [Select]
SoftwareSerial RFID(rxPin, txPin); //RX, TX

clemenlg

Sí, era una prueba. Definido correctamente tampoco funciona.

clemenlg

#25
Jul 29, 2019, 10:02 am Last Edit: Jul 29, 2019, 01:44 pm by clemenlg
Bueno, cambiando los puertos, he logrado comunicarme desde Arduino Uno a Arduino Mega y viceversa.
Código de Uno:
Code: [Select]

//Para Arduino Uno
#include <SoftwareSerial.h>

/*
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 Not all pins on the Nano support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI)
 */

#define rxPin 10
#define txPin 11

SoftwareSerial RFID(rxPin, txPin); //RX, TX

void setup(){
  Serial.begin(9600);  // start serial to PC
  //RFID.listen(); // No existe en Hardware
  RFID.begin(9600);    // start serial to RFID reader
  Serial.println("Empezando en el Uno.");
  RFID.println("Empezando en el Uno.");
  delay(10);
}

void loop(){
 
  if(RFID.available()) {
    Serial.println("Enviando desde Uno");
    RFID.write("Hola desde Uno");
  }
  else
    Serial.println("KO hola Uno");
  delay(500);
  if(RFID.available()) {
    Serial.println("Recibiendo desde Mega");
    Serial.println(RFID.read());
  }
  else
    Serial.println("KO recibiendo desde Mega ");
  delay(1000);
}

Código de Mega (el mismo pero con otros prints):
Code: [Select]

#include <SoftwareSerial.h>
//Para Arduino Mega 2560

/*
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 Not all pins on the Nano support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI)
 */

#define rxPin 10
#define txPin 11

SoftwareSerial RFID(rxPin, txPin); //RX, TX

void setup(){
  Serial.begin(9600);  // start serial to PC
  //RFID.listen(); // No existe en Hardware
  RFID.begin(9600);    // start serial to RFID reader
  Serial.println("Empezando en el Mega.");
  RFID.println("Empezando en el Mega.");
  delay(10);
}

void loop(){
  if(RFID.available()) {
    Serial.println("Enviando desde Mega");
    RFID.write("Hola desde Mega");
  }
  else
    Serial.println("KO hola desde Mega");
  delay(500);
  if(RFID.available()) {
    Serial.println("Recibiendo desde Uno");
    Serial.println(RFID.read());
  }
  else
    Serial.println("KO recibiendo desde Uno");
  delay(1000);
}

Y la salida de uno de los dos (en este caso el Uno):
Code: [Select]

Enviando desde Uno
Recibiendo desde Mega
72
Enviando desde Uno
Recibiendo desde Mega
72
Enviando desde Uno
Recibiendo desde Mega
72
Enviando desde Uno
Recibiendo desde Mega
72

No sé muy bien que es 72, supongo que será la cadena "Hola desde Mega" con otra codificación.
Una vez probado este código, si lo adapto para la placa RFID, sigue sin funcionar... :(

surbyte

Y porque sigues usando SofwareSerial en el MEGA teniendo 4 puertos?

En el MEGA no uses SoftwareSerial. Usa cualquiera de los puertos Hardware disponibles Serial1, Serial2 y/o Serial3.

Es mas yo limitaría las pruebas a solo el MEGA con la placa, usando Serial para ver en el Monitor y Serial1 para comunicarme con la placa.
Ya se que diras que no funciona pero ese es otro tema.

Yo intentaría pedir ayuda al soporte de Priority1 porque hay algo que no vemos.

clemenlg

Hola,
uso SoftwareSerial porque mi objetivo es que este proyecto funcione en un Arduino Nano, y como el Nano no tiene HardwareSerial, emulo un serial por software, para que así el proyecto sea lo más parecido posible a mi objetivo final.
Con Serial1 también lo he probado, y el resultado es el mismo.
Ya les he pedido ayuda a los de Priority 1, estoy a la espera de que me contesten.
Código que he usado para probar con HardwareSerial en Arduino Mega 2560 (he comprobado la disponibilidad del Serie1 antes de cada acomunicación):
Code: [Select]

int newtag[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int data1 = 0;
unsigned long setime;

void setup(){
  Serial.begin(9600);  // start serial to PC
  Serial1.begin(9600);    // start serial to Serial1 reader
  delay(10);
}

void loop(){
  if (Serial1.available() > 0){
    Serial.println("OK SD2");
    //Serial1.print(F("SD2"));
    Serial1.write(0x53);
    Serial1.write(0x44);
    Serial1.write(0x32);
    Serial1.write(0x0d);//crn->carriage return (en decimal 13: Serial1.write(13))0x0d
    delay(500);
  }
  else
    Serial.println("KO SD2");
  if (Serial1.available() > 0){
    Serial.println("OK READ SD2");
    Serial.println(Serial1.read());
    delay(500);
  }
  else
    Serial.println("KO READ SD2");
  if (Serial1.available() > 0){
    Serial.println("OK LTG");
    //Serial1.print(F("LTG"));
    Serial1.write(0x4c);
    Serial1.write(0x54);
    Serial1.write(0x47);
    Serial1.write(0x0d);//crn->carriage return (en decimal 13: Serial1.write(13))
    delay(500);
  }
  else
    Serial.println("KO LTG");
  if (Serial1.available() > 0){
    Serial.println("OK READ LTG");
    Serial.println(Serial1.read());
    delay(500);
  }
  else
    Serial.println("KO READ LTG");
  if (Serial1.available() > 0){
    Serial.println("OK RAT");
    //Serial1.print("RAT");
    Serial1.write(0x4d);
    Serial1.write(0x4f);
    Serial1.write(0x46);
    Serial1.write(0x0d);
    delay(500);
  }
  else
    Serial.println("KO RAT");
  if (Serial1.available() > 0){
    Serial.println("OK READ RAT");
   
    for (int z = 0 ; z < 15 ; z++) // read the rest of the tag
    {
      data1 = Serial1.read();
      newtag[z] = data1;
      Serial.print(data1);
    }
    Serial.println("");
    Serial1.flush(); // stops multiple reads
  }
  else
    Serial.println("KO READ RAT");
  delay(1000);
}

Y me da el error de comando no entendido:
Code: [Select]

OK SD2
OK READ SD2
0
OK LTG
OK READ LTG
0
OK RAT
OK READ RAT
000000000000000

Lo único que se me ocurre probar mientras estoy a la espera de respuesta del fabricante, es alimentar el Arduino Mega 2560 con la misma fuente que la placa (transformador de 6v), por el pin VIN (creo que este es el de entrada), pero no sé si tendré algún conflicto al estar alimentado también por USB (para ver el monitor serie). En teoría esto no afecta para nada, pero no sé...

clemenlg

#28
Jul 30, 2019, 10:23 am Last Edit: Jul 30, 2019, 10:24 am by clemenlg
El fabricante ya me ha contestado, y me ha dicho:
Code: [Select]

Hello,
 
I don't really write Arduino code so I can't analyse it for you.
 
The first thing to do is make sure the reader is reading.  Disconnect the arduino from the reader, and connect a led to the L+, L- terminals (vith a 1k resistor in series), then scan a FDXB/HDX animal tag. The LED should flash once when the tag comes close to the antenna.  MAke sure this is happening.
 
Then use a TTL to USB cable to connect up to a PC and use a dumb terminal program like TERMITE to send commands and see responses.  A carriage return sent should responde with ?0.
 
Do this first to make sure the reader is operating correctly. Then get back to me.
 
Regards,

He probado con el led, y no se enciende (si lo conecto a V+ y V- sí que va), por lo que no está leyendo las etiquetas. Lo he probado en 2 lectores de RFID distintos (uno de ellos lo abrí hace unos días).
Estoy a la espera de que el fabricante me diga algo.

surbyte

Por eso al comienzo te dije una posibilidad era conseguir un adapator USB a TTL de los que se usan para programar Arduinos o Nodemcu (ESP8266) y usar el programa de Priority1 para ver si funciona.
Evidentemente algo pasa con la placa o las placas.

Perdona la pregunta tal vez tonta.. Has mirado la salida de la fuente DC? Dijiste que eran como 10V pero prueba ponerla en AC a ver si mide algo. Lo correcto es que no mida nada o valores de AC muy bajos. Solo para descartar.

Go Up