Go Down

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

clemenlg

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.

Code: [Select]

#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

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?

clemenlg

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...
Code: [Select]

    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

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?

clemenlg

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.

surbyte

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

clemenlg

#6
Jul 18, 2019, 11:15 pm Last Edit: Aug 15, 2019, 04:01 pm by surbyte Reason: Agregado de etiqueta de enlaces
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

clemenlg

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:

Code: [Select]

#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:
Code: [Select]

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... :smiley-confuse:

surbyte

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

Code: [Select]
#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.

clemenlg

Pongo el código corregido para usar Arduino como el conversor usb-ttl:
Code: [Select]

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

clemenlg

#10
Jul 22, 2019, 09:37 am Last Edit: Jul 22, 2019, 10:58 am by clemenlg
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:


surbyte

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.

clemenlg

#12
Jul 23, 2019, 12:01 pm Last Edit: Jul 23, 2019, 12:58 pm by clemenlg
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.

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.

clemenlg

#14
Jul 24, 2019, 10:47 am Last Edit: Jul 24, 2019, 12:28 pm by clemenlg
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.
Code: [Select]

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

Go Up