Problema con lector RFID (FDX-B) de Priority 1 Design

Hola,
tengo un problema con un lector de chips RFID FDX-B (los chips que llevan las mascotas).


Estoy usando un sensor de Priority 1 Design (RFIDRW-E-TTL), con el cual me puedo comunicar por TTL.
Tengo un documento pdf con la especificación de la placa, pero lo máximo que he llegado es a comunicarme con ella.
Llevo más de 1 año peleándome con ella, retomando el proyecto y abandonándolo varias veces por desesperación.
Uso SoftwareSerial para comunicarme, y llego a hacerlo porque el método available() me devuelve un valor, pero no logro leer ningún chip.
El problema es mío, que no tengo los conocimientos de electrónica, y me estoy liando con lo que voy leyendo, así que al final he decidido a abrir un hilo para ver si alguien me echa una mano.
Uso una placa Arduino nano, por lo que los pins RX y TX que admiten interrupciones de cambio son: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI). Yo uso el 8 y 9 (tal y como se ha comentado en otro hilo).

Según los comandos que puedo usar, el comando RAT debería leer una etiqueta FDX-B (uso el método visto en otros hilos similares), pero le ponga o no el chip cerca de la antena, me devuelve basura todo el rato.

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 9

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

void setup(){
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  RFID.begin(9600);    // start serial to RFID reader
  Serial.begin(9600);  // start serial to PC
}

void loop(){
  if (RFID.available() > 0){
    RFID.print("RAT");
    RFID.write(13);
    setime = millis();
    while(millis() - setime < 1000){
      while (RFID.available()) {
        byte C = RFID.read();
        Serial.println(C);
      }
    }
  }

¿Alguien me echa una mano?
Gracias

Hola @clemenlg empiezo a leer el pdf y me encuentro con la posibilidad de usar uart 5V o 3.3V.
Creo que por decir que usas el TTL hablas de 5V, no es cierto?

surbyte:
Hola @clemenlg empiezo a leer el pdf y me encuentro con la posibilidad de usar uart 5V o 3.3V.
Creo que por decir que usas el TTL hablas de 5V, no es cierto?

Hola @surbyte,
sí, cierto, se me olvidó comentarlo. El V+ lo tengo conectado a 5V, y el V- a GND.
Por cierto, he intentado seleccionar el tipo de etiqueta (FDX-B) con el comando ST2, y luego intentar leerlo con RAT, y sigo leyendo basura sin sentido...

    RFID.print("ST2");
    delay(100);
    RFID.print("RAT");
    delay(100);

    for (int z = 0 ; z < 15 ; z++) // son 15 números
      Serial.print(RFID.read());
    Serial.println("");
    RFID.flush();

Muchas gracias por tu tiempo.
Saludos

Dame un momento que entienda como es el proceso de arranque del lector pero en principio no estoy de acuerdo con la forma en que has planteado el codigo en el loop. Seria el mismo pero con otra disposicion.
Ej: envias el RAT y luego escuchas la respuesta del lector.

Describe las conrxiones entre arduino y lector.

8 a que esta conectado
9 idem
Que mas?

surbyte:
Dame un momento que entienda como es el proceso de arranque del lector pero en principio no estoy de acuerdo con la forma en que has planteado el codigo en el loop. Seria el mismo pero con otra disposicion.
Ej: envias el RAT y luego escuchas la respuesta del lector.

Describe las conrxiones entre arduino y lector.

8 a que esta conectado
9 idem
Que mas?

Las conexiones de la placa que uso (y la relación con mi arduino nano) son:
RX ->9
TX ->8
V+ ->5V
V- ->GND
A+ ->Antena
A- ->Antena

Primero hago un "ST2" para decirle que voy a leer una etiqueta FDX-B, y luego con "RAT" le digo que lea una etiqueta.
Sólo debería hacer una vez ST2, lo podría hacer en el setup, pero como estoy haciendo pruebas, lo he dejado en el loop, para forzar así ese modo en cada interacción del bucle.
Gracias de nuevo.

Intenta con esta aplicacion que es para PC. Programa el arduino como interfaz rs232 a serial TTL. Si todo funciona correctamente vemos que ocurre.

Hola,
Soy muy novato en Arduino, ¿Necesito un conversor usb a ttl para hacer lo que comentas? Como esto: https://satkit.com/cp2102-conversor-usb-serial-ttl-arduino
Saludos

Creo que el problema es que no soy capaz de enviar correctamente los comandos al lector.
Al enviar comandos me devuelve 0, que según la tabla de errores es que no ha entendido el comando:

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 9

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

void setup(){
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  RFID.begin(9600);
  Serial.begin(9600);
}

void loop(){

  if (RFID.available() > 0){
    Serial.println("OK");
    //RFID.print(F("SD2")); Envío el comando SD2 para indicar que por defecto son chips FDX-B, lo envío en hexadecimal para asegurarme
    RFID.write(0x53);
    RFID.write(0x44);
    RFID.write(0x32);
    delay(500);
    Serial.println(RFID.read());
    //RFID.print(F("LTG")); Envío el comando LTG para saber si hay una etiqueta presente en el lector, lo envío en hexadecimal para asegurarme
    RFID.write(0x4c);
    RFID.write(0x54);
    RFID.write(0x47);
    delay(500);
    Serial.println(RFID.read());
    RFID.print(F("RAT")); //; Envío el comando RAT para leer un chip FDX-B
    
    for (int z = 0 ; z < 15 ; z++) // lee los 15 caracteres
    {
      data1 = RFID.read();
      newtag[z] = data1;
      Serial.print(data1);
    }
    Serial.println("");
    RFID.flush(); // vacía
  }
  else
    Serial.println("KO");
  delay(1000);

Y este es el resultado de la ejecución del código anterior:

OK
0 <- Comando no entendido
255 <- ¿?
002550025500000000255 <- ¿basura?
OK
0 <- Comando no entendido
0 <- Comando no entendido
24002540000025500002550 <- ¿basura?
OK
0 <- Comando no entendido
0 <- Comando no entendido
00025500025300024802550 <- ¿basura?
OK
0 <- Comando no entendido
0 <- Comando no entendido
200002552550001000252 <- ¿basura?
OK
0 <- Comando no entendido
0 <- Comando no entendido
255025500000002540000 <- ¿basura?
OK
0 <- Comando no entendido
0 <- Comando no entendido
00-1-1-1-1-1-1-1-1-1-1-1-1-1 <- ¿basura?
KO

Comando SDx:


Comando LTG:

No entiendo el problema, y no pueden ser los baudios porque lo tengo a 9600, tal y como se indica: Serial protocol description:The protocol for the Serial Input and Output lines is 9600 Baud, 8 data bits, 1 stop bit, no parity..
¿Hay algún problema con que tanto Serial como el lector usen 9600 baudios? Ya no sé qué puede ser... :confused:

No te respondo acerca de lo que has mostrado porque parece que la placa no esta respondiendo debidamente.
Me cuesta escribir codigos con la tablet

#include <SoftwareSerial.h>

SoftwareSerial mySerial ( 8 , 9) ; // RX, TX 

void setup ( ) { 
  // Abra las comunicaciones serie y espere a que se abra el puerto: 
  Serie . comenzar ( 9600 ) ; 
  while ( ! Serial ) { 
    ; // espera a que el puerto serial se conecte. Necesario solo para puerto USB nativo 
  } 


  Serial.println ( "Conversor de serial!" ) ; 

  // establecer la velocidad de datos para el puerto de SoftwareSerial
  mySerial. beguin ( 9600 ) ; 
  mySerial. println ( "comando" ) ; 
} 

void loop ( ) { // se ejecuta una y otra vez 
  if ( mySerial. available ( ) ) { 
    Serial.write ( mySerial.read( ) ) ; 
  } 
  if (Serial .available ( ) ) {
    mySerial.write ( Serial.read( ) ) ; 
  } 
}

Este codigo usa al arduino como ese conversor que encontraste. Pero ahora puedes probar diferentes velocidades.

Pongo el código corregido para usar Arduino como el conversor usb-ttl:

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 9

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

void setup(){ 
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  Serial.begin(9600);  // start serial to PC
  while (!Serial){
    ; // espera a que el puerto serial se conecte. Necesario solo para puerto USB nativo
  }
  RFID.begin(9600);    // start serial to RFID reader
} 

void loop(){ // se ejecuta una y otra vez 
  if(RFID.available()) {
    Serial.write(RFID.read());
  }
  if(Serial.available()) {
    RFID.write(Serial.read());
  }
}

Si uso esta aplicación, me da un error: "Check reader connection and power".
He montado otro arduino nano con otra placa RFIDRW-E-TTL, esta vez, soldando todo, y nada, el resultado es el mismo. Con una hardware totalmente nuevo, descarto problemas de hardware.
Estoy pensando si el problema es de alimentación, ya que yo alimento la placa con el puerto 5V de Arduino nano, y el Arduino nano lo alimento con el USB conectado al pc. Viendo la documentación de la placa, debería funcionar, aunque pone: "+5.5 to 15V DC"


¿Puede ser esto? Ya no sé qué más mirar...

En el hardware que tengo todo soldado RFID.available() siempre me devuelve 0, es decir, nunca está disponible el dispositivo TTL.
En el que tengo con cables de prototipado pinchados a la protoboard, algunas veces me devuelve 0, pero entiendo porque hay algún tipo de mala conexión (por eso decidí soldar otro arduino nano a otra placa de RFID). Lo que no tiene ningún sentido es que en esta versión soldada nunca esté disponible la placa RFID por TTL.
También he probado con un arduino mega 2560 que tengo, usando los cables de prototipado, y el resultado es el mismo, me aparece como no disponible el TTL.
Estoy haciendo algo MUY mal, pero aún no he detectado el qué.
He visto el montaje de otros usuarios, y no difiere del mío, pero no entiendo el error:


Por lo visto estas alimentando mal la placa RFID.

Si dice 5.5 a 15 pues busca una funte de al menos 6 a 12V, comparte GND con el Arduino y repite las pruebas.

Sí, eso pensaba, que estaba falta de potencia, pero si miras los hilos que he enlazado, lo usan cogiendo los 5v de Arduino, y funciona, por lo que no entiendo porqué ellos sí lo logran hacer funcionar (y yo no).
Buscaré una fuente de 6v para probar, pero me surge una duda, como lo alimentaré con esta fuente, ya no podré alimentar Arduino con el usb, sino que tendré que hacerlo con esta fuente, para así compartir gnd también. ¿Podré seguir conectando el usb para ver la salida serial? O ¿Alimento Arduino por usb y esta placa por la fuente externa y comparto gnd (el de la fuente o el de Arduino) para ambos?
Como veis, soy bastante novato con esto de la electrónica...

The Arduino Nano can be powered via the Mini-B USB connection, 6-20V unregulated external power supply (pin 30), or 5V regulated external power supply (pin 27). The power source is automatically selected to the highest voltage source.

The FTDI FT232RL chip on the Nano is only powered if the board is being powered over USB. As a result, when running on external (non-USB) power, the 3.3V output (which is supplied by the FTDI chip) is not available and the RX and TX LEDs will flicker if digital pins 0 or 1 are high.

Alimentas laplaca con una fuente externa y arduino por USB, no pasa nada, solo compartes GND con la placa y las lineas del puerto serie que trabajan a la tensión adecuada.
Tranquilo que todo es correcto.

surbyte:
Alimentas laplaca con una fuente externa y arduino por USB, no pasa nada, solo compartes GND con la placa y las lineas del puerto serie que trabajan a la tensión adecuada.
Tranquilo que todo es correcto.

Usando una fuente de alimentación externa de 6v y 500mAh, conectando el positivo a la entrada V+ de la placa RFID, y el negativo al V- de la placa RFID y al GND del Arduino, ya me devuelve siempre un valor positivo el método available del SoftwareSerial, es decir, ya reconoce siempre que hay "algo" por TTL, pero en cambio, todos los comandos me devuelven 0 ("Command not understood").
Todas las pruebas las hago ahora con el hardware soldado, evitando así problemas de malos contactos.

En teoría está claro un simple comando:


Le envío SD2, y luego un salto de línea, y debería devolver un OK, pero devuelve un 0:

Por lo que me estoy comunicando correctamente con la placa, pero en cambio, sigue sin entender mis comandos.

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 9

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

int newtag[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; // used for read comparisons
int data1 = 0;

void setup(){
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  Serial.begin(9600);  // start serial to PC
  while (!Serial){
    ; // espera a que el puerto serial se conecte. Necesario solo para puerto USB nativo
  }
  RFID.begin(9600);    // start serial to RFID reader
}

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

Si en vez de enviar el comando como cadena (convertida haciendo casting), lo envío en hexadecimal, el resultado es el mismo (código comentado).
Y si en vez de enviar el salto de línea en decimal, lo envío en hexadecimal, el resultado sigue siendo el mismo (código comentado).
Tabla ASCII:


Se me acaban las ideas, no entiendo ya el problema que puede pasar...
Así es como lo tengo, las partes fijas soldadas, y la fuente conectada de manera "temporal":

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?

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

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? :confused: 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):

// 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.

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?

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.

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?

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í:

#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:

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:

  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é.