Buenas a todos.
Hace poco diseñé un cronómetro digital para utilizarlo en los circuitos de Slot. Básicamente consiste en un laser situado a un extremo de la pista y un receptor situado al extremo contrario. El coche, al interrumpir el láser, genera una interrupción. De esta forma controlo las vueltas y los tiempos y envío dicha información mediante puerto serie a una tabla Excel.
El problema es el siguiente: algunos coches (no sé si será porque interrumpen el láser varias veces al pasar) cuentan el tiempo al cruzar el láser. Y luego, un tiempo más tarde, sin que el coche atraviese el láser se marca otra vuelta de repente. Para evitar el problema de los coches con recovecos (que hacen que el láser pase y se corte varias veces mientras están pasando) puse un tiempo mínimo de 2 segundos en los que no se cuenta la vuelta. Con lo cual no sé qué puede ser el problema. Os dejo el código para que le echéis un vistazo
...
Hace poco diseñé un cronómetro digital para utilizarlo en los circuitos de Slot. Básicamente consiste en un laser situado a un extremo de la pista y un receptor situado al extremo contrario. El coche, al interrumpir el láser, genera una interrupción. De esta forma controlo las vueltas y los tiempos y envío dicha información mediante puerto serie a una tabla Excel.
El problema es el siguiente: algunos coches (no sé si será porque interrumpen el láser varias veces al pasar) cuentan el tiempo al cruzar el láser. Y luego, un tiempo más tarde, sin que el coche atraviese el láser se marca otra vuelta de repente. Para evitar el problema de los coches con recovecos (que hacen que el láser pase y se corte varias veces mientras están pasando) puse un tiempo mínimo de 2 segundos en los que no se cuenta la vuelta. Con lo cual no sé qué puede ser el problema. Os dejo el código para que le echéis un vistazo
Código:
#define PINLASER 4
#define PINRECEP 2
#define PINPULSA 6
#define PINALIM 8
#define PINGND 7
//Variables globales
bool primera = true;
unsigned long tAntiguo, tNuevo, tVuelta;
int trazado = 250; //Recorrido total del trazado en cm (actualizar por cada circuito)
byte vuelta = 1;
float velMedia;
int estadoBoton, estadoBotonAnterior; //Para implementar el antirrebote SW
//Reseteo del contador cuando se presiona el botón
void reset(){
Serial.print("DATA,DATE,"); //Imprime la fecha
Serial.print("TIME,"); //Imprime la hora
Serial.print(vuelta); //Imprime el nº de vuelta
Serial.print(",");
vuelta++;
Serial.print("VUELTA NULA"); //Indica vuelta nula
Serial.print(",");
Serial.println("N/A");
primera = true;
}
//ISR para pin del receptor #1
void calculaTiempo(){
if(primera){
tAntiguo = millis();
primera = false;
}
else{
if(millis() - tAntiguo > 2000){
tNuevo = millis();
//Calculo de tiempo de vuelta
tVuelta = (tNuevo - tAntiguo)/1000;
//Adaptacion a MM:SS
int minutos = tVuelta/60;
int segundos = tVuelta - (tVuelta/60) * 60;
int milesimas = (tNuevo - tAntiguo) - (tVuelta)*1000;
String cadenaTiempo;
//Impresión en archivo excel
if(segundos < 10)
cadenaTiempo = String(String(minutos) + String(":" + String(String("0" + String(segundos))))+String("." + String(milesimas)));
else
cadenaTiempo = String(String(minutos) + String(":" + String(segundos))+String("." + String(milesimas)));
Serial.print("DATA,DATE,"); //Imprime la fecha
Serial.print("TIME,"); //Imprime la hora
Serial.print(vuelta); //Imprime el nº de vuelta
Serial.print(",");
vuelta++;
Serial.print(cadenaTiempo); //Imprime el tiempo de vuelta
Serial.print(",");
Serial.print("=36*G1/");
Serial.println((tNuevo-tAntiguo));
tAntiguo = tNuevo;
}
}
}
void setup(){
//Abre la comunicación serial y etiqueta las columnas del archivo excel
Serial.begin(9600);
Serial.println("CLEARDATA"); //Para borrar la información que había antes
Serial.println("LABEL,Fecha,Hora,Vuelta,Tiempo,Vel. Media (km/h)"); //Imprime las etiquetas
//Pin del láser
pinMode(PINLASER, OUTPUT);
digitalWrite(PINLASER,HIGH);
//Pin para alimentar el botón
pinMode(PINALIM, OUTPUT);
digitalWrite(PINALIM, HIGH);
pinMode(PINGND, OUTPUT);
digitalWrite(PINGND, LOW);
//Pin para leer del botón
pinMode(PINPULSA, INPUT);
estadoBotonAnterior = digitalRead(PINPULSA);
//Activación de las interrupciones
attachInterrupt((PINRECEP -2),calculaTiempo,FALLING);
}
void loop(){
estadoBoton = digitalRead(PINPULSA);
if(estadoBoton != estadoBotonAnterior){
if(estadoBoton){
delay(100);
reset();
}
else delay(100);
}
estadoBotonAnterior = estadoBoton;
}