Hola rlcobos:
Muchas gracias por tu interés en ayudarme.
He seguido tus indicaciones de incluir un mensaje para que lo recoja el compilador y aparezca escrito en el Monitor serial. Pero no lo escribe. He revisado los códigos escritos y están bien.
Efectivamente mi objetivo al incluir el RFID en la maqueta era conseguir algo parecido al sistema ASFA. He visto en la red videos que han realizado usuarios de Arduino en los que han conseguido hacer lo que pretendo, pero no publican el código. De momento me he atascado probablemente por mi falta de conocimientos del tema, pero gracias a Dios estoy encontrando ayuda.
hey.. quizás comenzar con algo más pequeño..una vez que funcione con un caracter o bien con un tag, ya se podrá agregar nuevos tag
tomaré mi ID20 y el Arduino.. para ver en que puedo ayudar
const int ledPin = 13;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(9600);
}
void loop() {
int a = 0;
char value[12];
if(Serial.available() > 0)
Serial.println("ID RFID");
{
for (int a=0; a<12; a++)
{
Serial.print(value[2], HEX);
if (value[2]=='5') //No estoy seguro :-( la idea es, si el valor de la
//segunda posisción 2 del string del tag sea 5 apage el led
//x5200043602820E
{
digitalWrite(13, LOW);
delay(1000);
}
else
{
digitalWrite(ledPin, HIGH);
}
}
}
He probado el código que me ha enviado f0raster0 y no me funciona. Después de cargarlo en Arduino y antes de realizar ninguna conexión, el led que va incorporado a Arduino y conectado al pin 13 comenzó a parpadear muy rápidamente y en el Monitor serial aparecieron una serie de números (como en un bucle) que no tenían ninguna relación con las tarjetas. Después conecté el detector RFID y no detectaba nada. El detector no está estropeado.
hey.. he probado este firmware y hace lo siguiente
1- cuando detecta el tag que tiene "B" enciende y deja encendido el led en el pin 13 y muestra la "B" en el serial monitor
2- pero cuando lee otra tarjeta enciende y apaga el led, hasta dejarlo apagado, mismo pin 13, no tengo más led =( aquí muestra en serial monitor el valor que está en la posición 13 del string de la tarjeta.
Si tomas el código y lo cargas sin hacer cambios el punto 2 se cumplirá si o si
cuentanos que va resultando 8)
lo que sí aun no entiendo porque debo pasar dos veces la tarjeta :~ para lograr hacer lo que indique arriba
int val = 0;
char code[14];
// 2 dígitos del código de fabricación
// 10 dígitos del código de tarjeta
// 2 dígitos bits de paridad
int bytesread = 0;
int ledrojo = 8;
int ledverde = 13;
int Rest = 2;
void setup() {
Serial.begin(9600); // RFID lector TX pin, Velocidad de transmisión: 9600, Bits de datos: 8, bit de parada: 1.
pinMode(Rest,OUTPUT); // Set 2 pin digital como OUTPUT para conectar con el pin RESET RFID
pinMode(ledrojo,OUTPUT);
pinMode(ledverde,OUTPUT);
// digitalWrite(Rest, HIGH); // Activar el lector RFID
}
void loop() {
if(Serial.available() > 0) { // Si se dispone de datos de lector
if((val = Serial.read()) == 10) { // comprobar cabecera
bytesread = 0;
while(bytesread < 14) { // leer 14 dígitos del código de
if( Serial.available() > 0) {
val = Serial.read();
if((val == 10)||(val == 13)) { // si el encabezado o dejar de bytes antes de la lectura de 10 dígitos
break; // dejar de leer
}
code[bytesread] = val; // añadir el dígito
bytesread++; // listo para leer siguiente dígito
}
}
// if(bytesread == 14) { // si tiene 14 dígitos de lectura se ha completado
// Serial.print("TAG code is: "); // TAG posiblemente un buen
//Serial.println(code[13]); // imprimir el código de la etiqueta
// Serial.println(code); // imprimir el código de la etiqueta
if (code[13] == 'B') //mi tag es: x2400CC392AFBxxx y el otro tag que tengo es x2400CC572897xxx
{
Serial.println(code[13]);
digitalWrite(13, HIGH);
}
else
{
Serial.println(code[13]);
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000);
digitalWrite(13, HIGH); // set the LED on
delay(1000); // wait for a second
digitalWrite(13, LOW); // set the LED off
delay(1000);
}
}
bytesread = 0;
// digitalWrite(Rest, LOW); // desactivar el lector de RFID por un momento para que no se inunde
// delay(1500); // esperar un poco
// digitalWrite(Rest, HIGH); // Activar el lector RFID
//digitalWrite(ledrojo, LOW);
//digitalWrite(ledverde, LOW);
//}
}
}
He probado el código que me envías y no reconoce las tarjetas. Lo he intentado tal como me lo envías, cambiando el Rest al pin 13, y haciendo todas las combinaciones posibles por si hubiera un pequeño error al transcribir el código. Pero no he tenido éxito.
El Monitor serial no muestra nada. Ni el Arduino muestra el parpadeo clásico de cuando detecta una tarjeta.
No sé como incluir un dibujo de las conexiones , no obstante , como tu dice es muy sencillo, he seguido las instrucciones de conexión que indica el creador del código BARRAGAN y que están detalladas en mi primer post, al que he añadido la conexión de un led con el ánodo al PIN 13 y cátodo a GND . Con este mismo circuito utilizando el código que te menciono, sí me funciona el RFID, pero me encuentro igual que al principio de iniciar el post.
if (code == "5200043602820E")
Code solo trae 10 digitos que son el valor de la tarjeta, los 2 primero y 2 ultimos son datos adicionales que cambian segun su fabricante y el control de paridad
Lo dice en el ejemplo.
// 2 dígitos del código de fabricación
// 10 dígitos del código de tarjeta
// 2 dígitos bits de paridad
El problema no era de conexiones, simplemente me confundí al escribir el code[] a identificar, poniéndolo entre " " cuando debía hacerlo entre ' '.
Muchas gracias a todos por vuestra ayuda.
Adjunto el código con el cual he solucionado la identificación y respuesta idividual a cada tarjeta.
int val = 0;
char code[14];
// 2 dígitos del código de fabricación
// 10 dígitos del código de tarjeta
// 2 dígitos bits de paridad
int bytesread = 0;
int ledrojo = 8;
int ledverde = 9;
int Rest = 2;
void setup() {
Serial.begin(9600); // RFID lector TX pin, Velocidad de transmisión: 9600, Bits de datos: 8, bit de parada: 1.
pinMode(Rest,OUTPUT); // Set 2 pin digital como OUTPUT para conectar con el pin RESET RFID
pinMode(ledrojo,OUTPUT);
pinMode(ledverde,OUTPUT);
digitalWrite(Rest, HIGH); // Activar el lector RFID
}
void loop() {
if(Serial.available() > 0) { // Si se dispone de datos de lector
if((val = Serial.read()) == 10) { // comprobar cabecera
bytesread = 0;
while(bytesread < 14) { // leer 14 dígitos del código de
if( Serial.available() > 0) {
val = Serial.read();
if((val == 10)||(val == 13)) { // si el encabezado o dejar de bytes antes de la lectura de 10 dígitos
break; // dejar de leer
}
code[bytesread] = val; // añadir el dígito
bytesread++; // listo para leer siguiente dígito
}
}
if(bytesread == 14) { // si tiene 14 dígitos de lectura se ha completado
Serial.print("TAG code is: "); // TAG posiblemente un buen
Serial.println(code); // imprimir el código de la etiqueta
if (code[5]== '4') { // 4 es el código 5 de una de mis tarjetas 5200043602820E
digitalWrite(ledrojo, HIGH);
}
if (code[5]== '0') { // 0 es el código 5 de otra de mis tarjetas 4B001085431305
digitalWrite(ledverde, HIGH);
}
}
bytesread = 0;
digitalWrite(Rest, LOW); // desactivar el lector de RFID por un momento para que no se inunde
delay(1500); // esperar un poco
digitalWrite(Rest, HIGH); // Activar el lector RFID
digitalWrite(ledrojo, LOW);
digitalWrite(ledverde, LOW);
}
}
}
En el código anterior hay que suprimir lo siguiente:
if(bytesread == 14) { // si tiene 14 dígitos de lectura se ha completado
Serial.print("TAG code is: "); // TAG posiblemente un buen
Serial.println(code); // imprimir el código de la etiqueta
pero solo preguntas por un solo digito de la tarjeta? Yo compre varias del mismo lote y tienen valores consecutivos, deberias comparar todos los digitos
eso es suficiente solo por ahora, debido a que si algún día sumas más y mas trenes llegará el momento en que tu comparación no funcionará correctamente..
y como dice maxid, debes identificar el string completo, cuando comienza y cuando termina, esa información la puedes obtener desde el serial monitor, que te muestre por ejemplo:
Serial.println(code[1]) te mostrara el primero
Serial.println(code[2]) te mostrara el segundo
o bien y claro que es mucho mejor, si encuentras la hoja de datos tanto del lector como de las tarjetas..
sé que no es la mejor forma de hacer la comparación pero esto te servira para comparar todo el código
voy a tomar la tarjeta, tag: 5200043602820E, debes agregar: