Go Down

Topic: Problema con velocimetro (Read 3 times) previous topic - next topic

afcabanas

Hola
estoy preparando un velocímetro para la moto utilizando un fotointerruptor. El caso es que no consigo que marque la velocidad correctamente en el lcd, empiezan a fluctuar números incorrectos a toda velocidad. Pego el código a continuación, por si alguien sabe que ocurre y puede hecharme una mano. No sé si es problema de variables, de la función o que le pasa.
Gracias y un saludo a todos.

Code: [Select]

#include <LiquidCrystal.h>
static float odometro=0.0; // Km totales
static float km_parc=0.0; // Km parciales
int tinicial=0; //instante en el que se recibe un pulso (bajo) de velocidad (inicio vuelta de rueda)
int tfinal=0; // instante en el que se recibe el siguiente pulso (bajo) de velocidad (tfinal-tinicial=1 vuelta completa)
int tparado=0; // variable que si supera cierto valor pone la velocidad del cuadro a 0
int varVel=0; // variable para contar una vuelta de rueda en la funcion velocidad

int vel=0; // variable que almacena la velocidad
int velMax=0; // variable que almacena la velocidad maxima alcanzada
int perimetro=1805; // perimetro de la rueda en mm (para calculos de velocidad y distancias)

void setup(){
  Wire.begin();
  Serial.begin(9600);
  lcd.begin(16, 2);
}

void loop(){

attachInterrupt(0, velocidad, LOW);

// Velocidad en pantalla principal
  lcd.setCursor(0,0);
   if(vel<100)
    {
      lcd.print(" ");
      if(vel<10)
        {
        lcd.print(" ");
        }
    }
  lcd.print(vel,DEC);
  lcd.setCursor(4,0);
  lcd.print("Kmh");

// Km parciales en pantalla principal   
lcd.setCursor(6,1);
        if(km_parc<1000)
        {
          lcd.print(" ");
          if(km_parc<100)
          {
            lcd.print(" ");
            if(km_parc<10)
            {
              lcd.print(" ");
            }
          }
        }
      lcd.print(km_parc,0); // muestra los km parciales
      lcd.print("Km");
}
 
/* CALCULO DE LA VELOCIDAD
a esta fulcion se entra cada vez que el sensor detecte un nivel bajo, es decir al
iniciar la vuelta de la rueda y al finalizarla (dos veces por vuelta) */
void velocidad ()
    {
      if(varVel==0) //entra si es el inicio de la vuelta y toma el tiempo actual
      {
        tinicial=millis();
        varVel=1;
      }
      else if (varVel==1) //si es el final de la vuelta resta el tiempo actual al inicial
      // para calcular el tiempo transcurrido entre los 2 pulsos (1 vuelta completa)
      {
        tfinal=millis()-tinicial;                       
        varVel=0;                                       
        vel=perimetro/tfinal;
        vel=vel*3.6;
       
        km_parc=km_parc+(perimetro/100000.0);   
        if(km_parc>1200)
          km_parc=0;   
        odometro=odometro+(perimetro/100000.0);   
        if(odometro>100000)
          odometro=0;
        revision=revision-(perimetro/100000.0); // a esta interrupcion entra 1 vez por vuelta,
        // por lo que le restamos el perimetro de la rueda
      }
    }


mvaldebenitorojas

afcabanas:
Estas seguro que el perimetro es 1805mm?, eso da casi 2 metros no?

Sergegsx

podrias poner que numeros son los que registra, cabe la posibilidad de que el sensor falle en algunas lecturas, por lo que el tiempo seria el doble o el triple y al calcular la velocidad pues parece que fluctue.

puedes usar algun tipo de logica respecto al tiempo leido, algo como que el tiempo leido tiene que estar entre un porcentaje del tiempo anterior o algo asi. o puedes tomar 5 valores y calcular la media.

vamos que creo que lo que falla es que el sensor a veces no registra la lectura.
* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

afcabanas

mvaldebenitorojas
Si, date cuenta que hablamos del perímetro, no del diámetro

Sergegsx
parece buena cosa la de tomar varias lecturas por vuelta y calcular la media. De todas forma, ahora me conformo con que registre la velocidad, aunque esta no sea exacta. El sensor si da todas las lecturas, lo he comprobado mediante un led que se enciende al cortar la señal. Por ejemplo, si no se produce ninguna interrupción, el display debería indicar 0, sin embargo indica el último valor mostrado.

Voy a ver el tema de los tipos de variables, tal vez attachInterrup no admita ciertos tipos o no conserve los valores al salir de la funcion.
Gracias por las sugerencias, seguiremos probando

nayma

lo tienes conectadoal pin 2?

Go Up