Offline
Newbie
Karma: 2
Posts: 11
|
 |
« on: January 25, 2013, 12:31:33 pm » |
Hola: Soy un aficionado a los trenes a escala, y al conocer la placa Arduino, he visto la enorme ayuda que ofrece para la maqueta que trato de construir. Una de ellas es el "rfid" que permitiría, si lo consigo, identificar los trenes, y en cada caso activar desvíos, encender luces o cualquiera de las múltiples posibilidades que ofrece una maqueta.
He comprado en Ebay a los chinos un RFID de 125 KHz de la marca JSXZLZ y buscando por la red he localizado el código que os detallo a continuación, con unas modificaciones añadidas por mí. Pero tengo un problema, y es que con el código que os indico, consigo que se indique el número de tarjeta en el monitor serial y se encienda un led al pasar cualquier tarjeta, y lo que yo pretendo es poder encender un led distinto para cada tarjeta.
Os ruego tengais a bien echarme una mano ya que mis conocimientos de informática son muy escasos.
saludos
// RFID reader for Arduino // Wiring version by BARRAGAN <http://people.interaction-ivrea.it/h.barragan> // Modified for Arudino by djmatic // Re-Modified for Arduino and 125Khz JsxzLz RFID Kit from Ebay by Biohazard
// RFID reader comes with 11 pins: D3 D2 D1 Rest Mcst Gnd L1 L2 PC TX VCC // We need these to be connected: // Rest to Arduino pin 2 // Gnd to Arduino GND // L1 and L2 to the antenna // TX to Arduino RX0 // VCC To Arduino 5V
int val = 0; char code[14]; // 2 digits manufacture code // 10 digits card code // 2 digits parity bits
int bytesread = 0; int led = 8;
void setup() {
Serial.begin(9600); // RFID reader TX pin, Baud rate: 9600, Data bits: 8, stop bit: 1. pinMode(2,OUTPUT); // Set digital pin 2 as OUTPUT to connect it to the RFID RESET pin pinMode(led,OUTPUT); digitalWrite(2, HIGH); // Activate the RFID reader }
void loop() {
if(Serial.available() > 0) { // if data available from reader if((val = Serial.read()) == 10) { // check for header bytesread = 0; while(bytesread < 14) { // read 14 digit code if( Serial.available() > 0) { val = Serial.read(); if((val == 10)||(val == 13)) { // if header or stop bytes before the 10 digit reading break; // stop reading } code[bytesread] = val; // add the digit bytesread++; // ready to read next digit } } if(bytesread == 14) { // if 14 digit read is complete Serial.print("TAG code is: "); // possibly a good TAG Serial.println(code); // print the TAG code digitalWrite(led, HIGH); } bytesread = 0; digitalWrite(2, LOW); // deactivate the RFID reader for a moment so it will not flood delay(1500); // wait for a bit digitalWrite(2, HIGH); // Activate the RFID reader digitalWrite(led, LOW); } } }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #1 on: January 27, 2013, 03:42:34 pm » |
Hola
cambia
Serial.print("TAG code is: "); // possibly a good TAG Serial.println(code); // print the TAG code digitalWrite(led, HIGH);
por algo como.....
Serial.print("TAG code is: "); // possibly a good TAG Serial.println(code); // print the TAG code
if (code=="ELCODIGODEUNADETUSTARJETARFIDDEUNTREN") { digitalWrite(led, HIGH); }
if (code=="ELCODIGODEOTRADETUSTARJETARFIDDEUNTREN") { digitalWrite(OTROPIN, HIGH); }
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 2
Posts: 11
|
 |
« Reply #2 on: January 28, 2013, 06:20:46 am » |
Gracias ricobos:
He hecho la prueba con los cambios que me indicas, el Monitor serial continua detallando los numeros de las tarjetas pero no se me enciende ninguno de los leds.
Te detallo el nuevo código utilizado:
[codeint 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 == "5200043602820E") { digitalWrite(ledrojo, HIGH); } if (code == "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); } } } ]
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #3 on: January 31, 2013, 01:33:23 pm » |
yo le añadiría un
if (code == "5200043602820E") { digitalWrite(ledrojo, HIGH); Serial.println("ha pasado el tren 1"); } if (code == "4B001085431305") { Serial.println("ha pasado el tren 2"); digitalWrite(ledverde, HIGH); }
y me cercioraría de que el compilador está pasando por alguna de éstas lineas de código,
si pasa por ellas ( se verá en el display ), el problema es de la activacion de las salidas ( leds ),
en caso contrario tienes algún problema con los códigos escritos en código.
|
|
|
|
|
Logged
|
|
|
|
|
Spain
Offline
God Member
Karma: 16
Posts: 817
Arduino rocks
|
 |
« Reply #4 on: February 01, 2013, 01:30:39 am » |
De ahi a disponer de un sistema ASFA son dos pasos.
Te va a quedar cantidad de realista esas maquetas...
Siento no poder ayudarte con el RFID porque aun no lo he usado.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 2
Posts: 11
|
 |
« Reply #5 on: February 01, 2013, 11:01:36 am » |
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.
No se que hacer.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 2
Posts: 11
|
 |
« Reply #6 on: February 01, 2013, 11:09:47 am » |
Hola Heke:
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.
|
|
|
|
|
Logged
|
|
|
|
|
NZ
Offline
Newbie
Karma: 0
Posts: 39
|
 |
« Reply #7 on: February 03, 2013, 06:34:43 am » |
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
|
|
|
|
« Last Edit: February 15, 2013, 08:11:57 am by f0raster0 »
|
Logged
|
keep calm & carry on
|
|
|
|
NZ
Offline
Newbie
Karma: 0
Posts: 39
|
 |
« Reply #8 on: February 03, 2013, 08:36:56 am » |
puedes probar esto.. 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); } } }
|
|
|
|
« Last Edit: February 03, 2013, 05:08:26 pm by f0raster0 »
|
Logged
|
keep calm & carry on
|
|
|
|
Offline
Newbie
Karma: 0
Posts: 18
|
 |
« Reply #9 on: February 04, 2013, 02:27:24 am » |
Hola de nuevo,
Efectivamente, como te indica forastero, da la impresión de que el código que escribes no coincide con el código que envía el lector.
Prueba el código que te ha facilitado, que seguro debe funcionar, y, a partir de ahí busca porque no coinciden los códigos escritos.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Newbie
Karma: 2
Posts: 11
|
 |
« Reply #10 on: February 04, 2013, 08:11:37 am » |
Hola a todos:
Gracias f0raster0.
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.
Saludos y perdonad mi inexperiencia.
|
|
|
|
|
Logged
|
|
|
|
|
NZ
Offline
Newbie
Karma: 0
Posts: 39
|
 |
« Reply #11 on: February 05, 2013, 02:16:58 am » |
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 
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); //} } }
|
|
|
|
« Last Edit: February 05, 2013, 06:55:22 pm by f0raster0 »
|
Logged
|
keep calm & carry on
|
|
|
|
Offline
Newbie
Karma: 2
Posts: 11
|
 |
« Reply #12 on: February 06, 2013, 09:38:12 am » |
Hola f0raster0:
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.
Saludos
|
|
|
|
|
Logged
|
|
|
|
|
NZ
Offline
Newbie
Karma: 0
Posts: 39
|
 |
« Reply #13 on: February 06, 2013, 02:54:35 pm » |
ups..¡¡ c  yo lo he probado con un lector RFID y un Arduino UNO y funciona bien  dime que te muestra en el Monitor serial??? el circuito que debes armar es simple I know  pero puedes mostrarnos un dibujo por favor..
|
|
|
|
« Last Edit: February 06, 2013, 02:57:53 pm by f0raster0 »
|
Logged
|
keep calm & carry on
|
|
|
|
Offline
Newbie
Karma: 2
Posts: 11
|
 |
« Reply #14 on: February 07, 2013, 08:34:21 am » |
Hola f0raster0:
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.
|
|
|
|
|
Logged
|
|
|
|
|
|