Go Down

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

clemenlg

Esta es la fuente:

Si conecto el led a otros pins de la placa RFID (v+ y v-) se enciende:

Y se puede ver como da voltaje:

El voltaje, evidentemente, es más bajo que el que da la fuente sin nada conectado:

Esta es la lectura del multimetro con AC seleccionado (es bajo el voltaje):

Yo también creo que algo pasa con la placa, de hecho ya lo hablamos, aunque siempre están dentro de una jaula de Faraday. De las 3 placas que tengo, sólo estaba usando una, cuando dudé de si el problema era la placa, abrí otra placa (la bolsa de Faraday donde estaba), y fue esta la que soldé al Nano, con idéntico resultado.
Pero es muy raro que 2 placas que he probado, las 2 tengan un problema. Aún me queda otra por abrir, pero preferiría dejarla así, hasta averiguar el problema.

surbyte

3.94 voltios en AC? Si eso que leo es asi, esa fuente es una porquería

No puedes tener casi 4 voltios en AC, apenas unos mV o como máximo 100mVAC

Asi que busca otra fuente porque tal vez tenga dañado un diodo del puente o mal filtrado.

clemenlg

#32
Jul 31, 2019, 09:28 am Last Edit: Jul 31, 2019, 02:40 pm by clemenlg
3.94 voltios en AC? Si eso que leo es asi, esa fuente es una porquería

No puedes tener casi 4 voltios en AC, apenas unos mV o como máximo 100mVAC

Asi que busca otra fuente porque tal vez tenga dañado un diodo del puente o mal filtrado.
Ya he conseguido una nueva fuente que no tiene salida de AC:


Con esta fuente el led conectado a L+ y L- siempre está encendido, pero en cambio, no parpadea al acercarle una etiqueta RFID, que es el comportamiento que debería tener según el fabricante.
El fabricante me contestó:
Code: [Select]
measure the voltage on the RX and TX line.  Make sure they do not go over +5V.
 
Measure the voltage at the regulator output here. where the arrow shows +5V.  Makes sure its a steady 5V
 
If you have a frequency meter check the frequency at point TP shown on the left of the image.
It should have a square wave output of about 134khz more or less. If not then the antenna is not connected correctly.
Sometimes clients solder onto the red enamal of the wire is is an insulation layer.
If you don't have a freequency meter then check the resistance of the coil across A+, A- (with unit switched off)
 
In its default state the voltage at L+ should be about 3.5V, is it?  L- will be close to 0V.
 
If you put your finger on the CPU (square chip (top middle) it should not be hot,  it should be cool, is it?

Puntos que marcó:

Me comentó que mirara la salida de RX y TX:

¿No debería ser de 3.3v par que Arduino la pueda leer bien?
El regulador de potencia da 5v en el punto en el que pide la lectura (no puedo adjuntar la imagen porque da error de seguridad la imagen -aunque cambie formato, ...-).
Con respecto a la soldadura de la antena, está soldada a la parte pre-estañada, no a la parte roja aislada:

La resistencia entre A+ y A- me da 0 (no sé si lo he medido bien):

Y el voltaje en el punto V+ es de 5.00, y en V- 0.00 (ya no puedo adjuntar más imágenes).
La placa continúa sin estar disponible (método available devuelve 0), pero en cuanto le pongo una etiqueta RFID, empieza a devolver valores.
Código dentro del loop (Arduino Nano):
Code: [Select]

  if (RFID.available() > 0){
    Serial.println("OK SD2");
    //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))0x0d
    delay(500);
  }
  else
    Serial.println("KO SD2");
  if (RFID.available() > 0){
    Serial.println("OK READ SD2");
    Serial.println(RFID.read());
    delay(500);
  }
  else
    Serial.println("KO READ SD2");
  if (RFID.available() > 0){
    Serial.println("OK LTG");
    //RFID.print(F("LTG"));
    RFID.write(0x4c);
    RFID.write(0x54);
    RFID.write(0x47);
    RFID.write(0x0d);//crn->carriage return (en decimal 13: RFID.write(13))
    delay(500);
  }
  else
    Serial.println("KO LTG");
  if (RFID.available() > 0){
    Serial.println("OK READ LTG");
    Serial.println(RFID.read());
    delay(500);
  }
  else
    Serial.println("KO READ LTG");
  if (RFID.available() > 0){
    Serial.println("OK RAT");
    //RFID.print("RAT");
    RFID.write(0x4d);
    RFID.write(0x4f);
    RFID.write(0x46);
    RFID.write(0x0d);
    delay(500);
  }
  else
    Serial.println("KO RAT");
  if (RFID.available() > 0){
    Serial.println("OK READ RAT");
   
    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
   
   
    /*RFID.write(0x4d);
    RFID.write(0x4f);
    RFID.write(0x46);
    //RFID.print("RAT");
    RFID.write(0x0d);
    setime = millis();
    while(millis() - setime < 1000){
      while (RFID.available()) {
        byte C = RFID.read();
        Serial.print(C);
      }
    }
    Serial.println("");*/

/*     char dataChar = RFID.read();
     Serial.println(dataChar);*/
  }
  else
    Serial.println("KO READ RAT");
  delay(1000);

Resultado mostrado por Serial:
Code: [Select]

KO SD2
KO READ SD2
KO LTG
KO READ LTG
KO RAT
KO READ RAT
KO SD2
KO READ SD2
KO LTG
KO READ LTG
KO RAT
KO READ RAT
OK SD2
OK READ SD2
54
OK LTG
OK READ LTG
52
OK RAT
OK READ RAT
519548564848484848525055535513
OK SD2
OK READ SD2
79
OK LTG
OK READ LTG
75
OK RAT
OK READ RAT
137975134951534648137975136349
OK SD2
OK READ SD2
13
OK LTG
OK READ LTG
49
OK RAT
OK READ RAT
515346481379751354525195485648
OK SD2
OK READ SD2
48
OK LTG
OK READ LTG
48
OK RAT
OK READ RAT
484852505553551379751349515346
OK SD2
OK READ SD2
49
OK LTG
OK READ LTG
13
OK RAT
OK READ RAT
797513797513495153464913797513
OK SD2
OK READ SD2
79
OK LTG
OK READ LTG
75
OK RAT

No tiene sentido, ya que siempre debería estar disponible, y debería devolver el código correspondiente en cada caso.
Sólo está disponible cuando le pongo una etiqueta cerca, y a partir de entonces, tenga o no etiqueta cerca, siempre está mostrando valores (entiendo que basura, ya que la etiqueta es 643080000042757).
Obtengo el mismo resultado usando HardwareSerial (Serial1) en Arduino Mega 2560.
Actualización:
El fabricante me ha respondido:
Code: [Select]

There's a RX,TX  on connector J1  which has 0-5V ttl level serial,,   and
there's a Rx and TX on connector J2 which has 3.3V level serial.

If your arduino is running from 5V supply then use the signals on J1.  If its
running on a 3.3V supply then use the signals on J2.


The antenna resistance looks odd.  Disconnect the antenna and measure it
directly.

You don't need a bigger supply as the reader draws less than 80mA.

Yo tengo el RX y TX en el J1. Había leído que en el TTL de Arduino las señales deben funcionar a 3.3V ¿Es correcto? Si es así, ese podría ser el problema.
Con respecto a la medición de la resistencia de la antena, midiendo otra antena que aún no tengo soldada, y poniendo el multímetro en 60M (Ω), me sigue dando 0.
Mi multímetro:

surbyte

Una antena es una bobina y cuando pruebas continuidad con todos desconectado deberias leer muy baja resistencia entre un punto y el otro. Medidos desde A+ y A- para asegurarte que esta todo bien.
Veo que eso has leido asi que asegurate que no tienes un corto y desconecta un terminal digamos en la antena que asegure que si estas midiendo el loop de la bobina.

No se porque hablas de 3.3V si tu Arduino es un NANO o un UNO y usan TTL a 5V. La parte de 3.3V dejala para otro tipo de Arduino que no sean NANO o UNO.

clemenlg

#34
Aug 15, 2019, 12:34 pm Last Edit: Aug 15, 2019, 02:10 pm by clemenlg
Después de 1 semana sin Internet, al llegar a casa me encontré con que ya me había llegado el conversor USB-TTL (CP2102).
Al probarlo, obtuve lo siguiente (sólo con acercarle la etiqueta):
Code: [Select]

clemenlg# cu -l /dev/ttyUSB0 -s 9600
Connected.
643_080000042757

La leyó sin problemas (me parece raro que la lea sin tener que pasarle ningún comando).
Usé la nueva placa que aún no había abierto, y le soldé los pins para prototipado, ya que con ella estero hacer más pruebas.
La alimentación la obtuve del CP2102, por lo que se alimenta con 5V perfectamente (ya que ha leído correctamente la etiqueta).
Código de prueba de Arduino:
Code: [Select]

void loop(){
  if (RFID.available() > 0){
    Serial.println("OK");
    Serial.println(RFID.read());
  }
  else
    Serial.println("KO");
  delay(1000);
}

Obtengo como resultado lo siguiente:
Code: [Select]

OK
54
OK
52
OK
51
OK
95
OK
48
OK
56
OK
48
OK
48
OK
48
OK
48
OK
48
OK
52
OK
50
OK
55
OK
53
OK
55
OK
13

Que es la etiqueta que he leído antes con cu desde el ordenador, pero cada carácter en hexadecimal.
Este es el mismo resultado tras hacer un casting a char (Serial.println((char)RFID.read());)
Code: [Select]

OK
6
OK
4
OK
3
OK
_
OK
0
OK
8
OK
0
OK
0
OK
0
OK
0
OK
0
OK
4
OK
2
OK
7
OK
5
OK
7
OK
KO

Una vez que ha leído la etiqueta devuelve toda la cadena, independientemente de si está o no disponible la etiqueta en la antena. El método available de SoftwareSerial sólo devuelve true cuando paso la etiqueta, no antes, por lo que no me puede servir esto para enviarle ningún comando, ya que siempre devolverá false hasta que le pase la etiqueta. :smiley-confuse:
Pero este comportamiento lo he probado en los otros montajes que tenía, y en todos funciona correctamente (nunca había probado a leer del SoftwareSerial sin enviar previamente algún comando).
El problema del envío de comandos sigue siendo el mismo, no puedo enviar ningún comando y que me lo acepte, por lo que no he avanzado nada en la comunicación con la placa, sólo he descubierto que es capaz de leer sin pasarle previamente ningún comando, en cambio, tanto con la aplicación del fabricante, como con el software que indicó para comunicarse por TTL la comunicación es correcta:

Con esto descarto los posibles problemas de hardware, así como confirmo que funciona tal y como la documentación indica. El problema es 100% de Arduino, o bien el cableado (creo que no, ya que es muy sencillo), o en el código.

surbyte

Quote
Pero este comportamiento lo he probado en los otros montajes que tenía, y en todos funciona correctamente (nunca había probado a leer del SoftwareSerial sin enviar previamente algún comando).
Y no te había dicho que asi debias hacerlo? mira para atras en el post#3 mi primer respuesta.

El manual dice que debes enviarle un comando para que el lector responda. Eso es previo a esperar la respuesta.
Ahora que por lo menos responde, se puede encontrar el camino adecuado para que todo fluya mejor.

Esa captura con Termite no la puedes repetir usando Arduino?

clemenlg

#36
Aug 15, 2019, 06:33 pm Last Edit: Aug 19, 2019, 06:44 pm by surbyte Reason: No repitas lo que se lee arriba
Sí, eso lo hicimos una vez que te conectaste, pero no funcionó esa vez.
Ahora soy capaz de enviarle algunos comandos, y que me responda, como "RAT" o "LTG":
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.begin(9600);    // start serial to RFID reader
}

void loop(){
  String temp="";
  int i = -1;
  if (RFID.available() > 0){
    Serial.println("Disponible");

    temp.concat((char)RFID.read());
    if (temp != "?" && temp != "O") //if is not a command response, is significant data
      i++;

    while (RFID.available() > 0){
      temp.concat((char)RFID.read());
      if (i < 0){
        Serial.print("Respuesta: ");
        Serial.println(temp);
        temp = "";
      }
      i++;      
    }
    Serial.println(temp);
    temp="";
  }
  else{
    Serial.println("No disponible");
    RFID.print(F("RAT"));
    RFID.write(13);
  }
  delay(1000);
}

Y devuelve:
Code: [Select]

No disponible
Disponible
Respuesta: ?1


Disponible
643_080000042758

No disponible
Disponible
643_080000042758_1_0_464F_000000

No disponible
Disponible
643_080000042758_1_0_464F_000000

No disponible
Disponible
Respuesta: ?1


No disponible
Disponible
Respuesta: ?1

Sí que lo lee, falta pulir el código, pero otros comandos, como WAT, no van, aunque siga al mismo ejemplo que en la documentación: RFID.print(F("WAT999_000000001007_1_0")).

clemenlg

#37
Aug 16, 2019, 09:52 am Last Edit: Aug 16, 2019, 10:09 am by clemenlg
He logrado escribir tanto con la aplicación del desarrollador:

Como con el emulador de RS232:

Así que he copiado el comando, y también funciona la escritura:
Code: [Select]

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 9

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

String temp="";

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

void loop(){
  int i = -1;
  if (RFID.available() > 0){
    Serial.println("Disponible");

    temp.concat((char)RFID.read());
    if (temp != "?" && temp != "O") //if is not a command response, is significant data
      i++;

    while (RFID.available() > 0){
      temp.concat((char)RFID.read());
      if (i < 0){
        Serial.print("Respuesta: ");
        Serial.println(temp);
        temp = "";
      }
      i++;     
    }
    Serial.println(temp);
    temp="";
  }
  else{
    Serial.println("No disponible");
    //RFID.print(F("RAT"));
    RFID.print(F("WAT643_080000042750_1_000000_2"));
    RFID.write(13);
  }
  delay(1000);
}

Salida:
Code: [Select]

No disponible
Disponible
Respuesta: ?2

643_080000042759

No disponible
No disponible
Disponible
Respuesta: ?
?0

No disponible
Disponible
Respuesta: ?0

?2
643_080000042750

No disponible
Disponible
Respuesta: ?2


La respuesta ?2 que da es porque no ha podido escribir la etiqueta.

clemenlg

Bueno, doy por cerrado el hilo (por mi parte).
Este es el código final para una simple lectura:
Code: [Select]

#include <SoftwareSerial.h>

#define rxPin 8
#define txPin 9

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

String showRfidError(int nErr){
  switch (nErr){
    case 0:
      return "Command not understood";
    case 1:
      return "Tag not present";
    case 2:
      return "Tag failure to Read/Write";
    case 3:
      return "Access to Block 0 not allowed";
    case 4:
      return "Page address invalid for this tag";
    default:
      return "Unrecognized error";
  }
}

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

void loop(){
  String temp="";
  int i = -1;
  if (RFID.available() > 0){
    temp.concat((char)RFID.read());
    if (temp != "?" && temp != "O") //if is not a command response, is significant data
      i++;
    while (RFID.available() > 0){
      temp.concat((char)RFID.read());
      if (i < 0){
        if (temp.charAt(1) == 'K')
          Serial.println("Function Performed Successfully");
        else{
          Serial.println(showRfidError(temp.charAt(1)-'0'));
        }
        temp = "";
      }
      i++;
    }
    Serial.println(temp);
    temp="";
  }
  else{
    RFID.print(F("RAT"));
    //RFID.print(F("WAT643_080000042750_1_000000_2"));
    RFID.write(13);
  }
  delay(1000);
}

Las conexiones finalmente son:
Arduino Nano             RFIDRW-E-TTL
=======================
        8                            TX (J1)
        9                            RX (J1)
        5V                          V+ (J1)
        GND                        V- (J1)
                               Led entre L+ y L- con
                          una resistencia de 1k en serie

Muchas gracias a @surbyte por toda la ayuda prestada.

Go Up