INICIO FORO
Regresar   ForoCoches > Zona ForoCoches > Motos


  Corrector de velocimetro casero con Arduino Nano - Speedo Corrector  
Respuesta

 
Herramientas
Viejo 30-jun-2020, 23:02   #1
vtr25
ForoCoches: Miembro
 
Jul 2019 | 122 Mens.

Un germano-hipano, una britanica, una japo

Corrector de velocimetro casero con Arduino Nano - Speedo Corrector

Antes de nada perdon si esto no va en este subforo, pero creo que el invento se usa mas que nada en motos y es donde mas útil creo que puede ser.



Tras investigar un poco y encontrar muy poca información por la web voy a compartir este pequeño invento que he preparado para corregir el velocimetro, creo que de practicamente cualquier motocicleta (o coche).


La susodicha en cuestión es una WR250R por la que pregunte hace unos meses, (al final me he decidido y lleva ya unos dias connmigo en casa). Nada mas montarme ya vi que la velocidad no iba bien, marcaba 100 kmh cuando calculaba que iba a 70 - 80 kmh. Miré el desarrollo y efectivamente estaba cambiado por uno mas corto, ademas tras investigar por la web, sobre todo foros yankis, donde esta moto tiene buena acogida, veo que ademas de serie ya marca bastante mal incluso para ser una moto (que ya sabemos que marcan todas de más). Además la señal de valocidad la toma de la salida de la caja de cambios.

Un SpeedoHealer o SpeedoDRD sale por unos 60 u 80 €. No es mucho pero me apetecia cacharrear un poco ademas tenía ganas de tocar un poco un arduino que nunca lo habia hecho. Decir que mis conocimientos de programación soy muy básicos y aunque no comprendo bien como funciona el programa si me ha servido para hacer algunos retoques para que funcionase bien en la WR250R.


Para este proyecto usaremos un Arduino Nano (bueno una copia)





Me he basado básicamente en la Web de Tom M'Guinness.


https://members.rennlist.com/tom8695...r%20Page1.html


Podéis echar una vistazo, aunque hay algunas diferencias entre como lo ha hecho el amigo Tom y yo:


El ha usado uno metido en una placa con regulador de tensión y disparador Schmitt, también creo que usa un Arduino original, yo tengo una copia que me costo 7€ (un poco cara para ser copia, pero llego a casa en pocos días). Ojo que la copia no tiene porque ser peor ya que arduino es de codigo abierto y utiliza el mismo chip Atmel 328P y componentes que si no son iguales, son equivalentes, aunqe ya veremos la resistencia al paso del tiempo ademas va a tener una vida dura, con vibraviones resistencia y alguna posible inundación.
Yo en cambio he prescindido del regulador de tensión ya que la propia placa lleva uno, que igual no es tan bueno como el que lleva el amigo Tom pero a mi me funciona bien así. Tambien he prescindido del disparador Schmitt supongo porque el sensor de mi moto es de tipo Hall, si el sensor es electro magnético puede ser (casi seguro al 100%) que si sea necesario. Mas adelante vemos que probé con uno, provisional pero empeoraba la señal de entrada mas que otra cosa.


Básicamente la idea es interrumpir la entrada del hilo que lleva la señal de pulsos de la velocidad, tomar esta señal de entrada, aplicar un factor de correción y darla por la salida, entrada y salida son digitales. La alimentación la tomaremos de la misma que se usa para alimentar el sensor Hall y la masa lo mismo. (En este caso es así, puede ser que en tu moto no exista esta alimentación o que se caiga mucho la tension, entonces necesitas sacarla de otro sitio, de un positivo bajo llave mas un 7805 es buena solución). En esta moto (y creo que muchas Yamahas) el color de estos cables es el siguiente:


Tensión (5V): Azul - Negro
Masa: Negro
Señal: Blanco-Azul


Los cables de tensión y masa podemos pelarlos sin cortarlos si así lo deseamos ya que debemos seguir alimentado el Hall, el de señal hay que cortarlo si o si, el hilo que viene del sensor va a la palilla D3 del arduino, será la entrada (ojo, no se puede cambiar ya que el programa usa interrupciones. El hilo que va a la centralita se conecta a D7 que va a ser la salida, esta si se puede cambiar si hiciera falta por alguna razon.
El cable de tensión lo conectamos a Vin (ojo es mejor usar Vin que la patilla 5V ya que así conseguimos que la alimentacón pase por el regulador y llegue mas estabilizada, no he probado si por la patilla 5V funciona, supongo que si).
La masa la conectamos a GND o yo en mi caso la he soldado a la carcasa del USB por comodidad.


La forma de conectar fisicamente los cables pueden ser miles, desde un simple emplame torciendo los hilos (yo lo he usado para pruebas), una soldadura con termoretractil (solución definitiva en mi caso) o algunas fichas en empalme y demás hardware que hay para estos menesteres.





En mi caso Rojo -> Tensión, Negro -> Masa, Amarillo -> Señal de entrada (la parte del hilo cortada que va a sensor), Naranja -> Señal de salida (la parte del hilo cortada que va a la centralita).






Por el momento no tengo fotos de esto instalado en la moto, pero creo que os podeis hacer la idea de como va, si no en la web de Tom se puede consultar tambien.


Vamos con el código:

Código:
//1986 Porsche 944 Turbo Speedometer Calibrator

//Public Domain

//raw 944 transmission sensor signal must be processed by external schmitt trigger

//Schmitt trigger should bypass filer and pull-up resistor

//Use LM2940-10 with decoupling caps per datasheet to power Arduino in automotive setting

//Arduino Pin 7 supplies modified signal for speedometer

// Modificado por vtr25 para una yamaha WR250R


const int debounce = 600; // valor original estaba a 2500, pero no pasaba de 40 kmh. 
                          // Al bajar demasiado el valor, a velocidad constante vemos saltos en el indicador. 
                          // Pero al ser muy alta limitamos el tiempo entre pulso y por tanto la velocidad maxima.
                          // Este valor funciona bien para mi, si vemos que la velocidad está limitada debemos bajar el valor.
                          // Si vemos que a velocidad constante hay saltos debemos subirlo

const int speedometerPin = 7;           // Pin de salida (se puede cambira)         

const int sensorPin = 3;                // Pin de entrada (en principio no se puede cambiar).                   

int pulseState = HIGH;                                        

volatile unsigned long currentMicros = 0; 

volatile unsigned long previousMicros= 0;  

volatile unsigned long currentSpeed = 0;  

volatile unsigned long previousSpeed = 0;

volatile unsigned long interval = 0;                 

unsigned long modInterval = 0;                

float calFactor = .83;   // decrease to slow down speedometer                           
                         // calFactor of 1 makes no change to speedometer
                         

 

void setup()

{
delay (1200);           // Este retardo lo he introducido ya que al arrancar el velocimetro mostraba 199 kmh (velocidad máxima) durante unos segundos.
                        // No entiendo porqué exactamente, pero se me ocurrió introducir este retardo para ver que pasaba y se solucionó.
                        // Si por alguna razón se muesta velocidades al arrancar se puede ampliar el retardo mas, está a 1200 ms.
  
pinMode(speedometerPin, OUTPUT);                         

pinMode(sensorPin, INPUT);                 

digitalWrite (sensorPin, HIGH);             

attachInterrupt (1, iSr, FALLING);        

}

 


void loop()

{

  noInterrupts();                                                 

  modInterval=interval;                                    

  interrupts();                                                      

  currentMicros = micros();                             

  if (currentMicros-previousSpeed<1000000) 

  {

   if (currentMicros - previousMicros>((modInterval/2)/calFactor))          

       { previousMicros = currentMicros;                                                    

        if (pulseState == LOW) pulseState = HIGH; else pulseState = LOW;

        //digitalWrite(13, pulseState);         //to blink onboard LED. 
                                                // He desactivado el led de la placa  que parpadea a la vez que la señal para reducir el consumo.
                                                // Aunque activado tambien funcionaba OK.                                                 

        digitalWrite(speedometerPin, pulseState);

        }                                  

   }

}

 

void iSr()

{

  currentSpeed=micros();                   

  if (digitalRead(sensorPin)==LOW) 

     {

        if ((currentSpeed - previousSpeed) > debounce)    //Aquí vi que la limitación de velocidad venía dada por el valor "debounce"

           {

            interval = currentSpeed - previousSpeed;        

            previousSpeed=currentSpeed;                         

           }

      }

}
Os comento algunos problemas y soluciones aplicadas:


Al iniciar aparecía 199 Kmh (velocidad máxima del marcador durante un par de segundos, ademas que sumaba distancia al cuentakilometros. Intentando aislar el problema introduje un delay de 10 segundos, ya no se mostraba ni al inicio ni a los 10 segundos. Luego ajusté el tiempo a 1,2 segundos (menos me mostraba el 199 aunque durante menos tiempo y mas pues era demasiado, con valores alrededor de 800 mostraba el 199 u otras velocidades altas de forma puntual.


La velocidad no pasaba de unos 40 o 42 y al subir está bajaba y subía de forma herrática: este problema es el que mas dolor de cabeza me ha dado. Primero pensaba que era poque la señal no llegaba limpia por eliminar el disparador Schmitt, como no tenía nigun integrado disparador Schmitt monté uno con transistores como el de esta web.


https://howtomechatronics.com/how-it...hmitt-trigger/


Pero seguiamos en las mismas. Luego sospeche que la señal de salida no fuera buena por alguna razón, hice un par de programas para sacar una señal cuadrada de distintas frecuencias, probé para que mostrara altas velocidades en el cuadro (+- 160 kmh) y sin problema. Entonces el problema estaba en la señal de entrada aún o en el código. Pensaba que la histeresis del disparador que he montado no era suficiente y he encargado disparadores ya en circuitos integrados (que ya creo que no voy a necesitar, pero se queda para futuros proyectos).


Mientras pasé a analizar el código, entiendo lo que hace cada función, lo que no entiendo es el algoritmo que usa, si alguien lo entiende le agradecería que lo explicara. Analizando ví que el valor "debounce" se usa para evitar que el valor "intervale" haga cambios demasiado rápidos que puedan venir de interferencias. Hago una regla de tres, si para 2500 me limita a 40 para que me limite a 200, necesito 500. Pruebo con 500 y bingo. Luego veo que a velocidad constante se mueve algo el velocimetro (nada grave +- 2kmh), probé con 600 y mucho mejor. La oscilación si la hay es inperceptible. con el "debounce" a 600 me da para un máximo de 166, mas que de sobra con el desarrollo actual llega 130 raspados.
Supongo que el codigo de venía con debounce a 2500 y le funcionará así, porque su sensor dará menos pulsos por vuelta de rueda que la WR.



Vi también que a partir de 100 parecía que no subía de forma lineal comparado con el GPS (subía mas lento), retiré en disparador Schmitt que había improvisado y mucho mejor.


Ya por ultimo queda salir a la calle y comparar con un GPS, primero con el "caclFactor" a 1, que no hace cambios, luego hacemos una regla de 3 y vemos el valor vamos necesitando, en mi caso con el "calcFactor" a 0.8 exacto clava la velocidad del GPS, lo he dejado en 0.83 para que marque un poco mas por si acaso, así no me paso en los radares. Tal como lo dejé a 85 Kmh de marcador son unos 82 Kmh reales. Cada vez que cambiamos hay que compilar y subir al arduino (menos de 10 segundos con "Arduino IDE").



Resumiendo: Si no te quieres complicar mucho con un Arduino Nano conectando donde indico y con el programa que dejo, solo hay que tocar el parámetro "calcFactor" para calibrar. Puede ser que encuentres algun problema por el camino, dejo reflejado lo que me pasó a mi. Si lo intentaís y teneis que cambiar alguna cosa comentad y lo subo al OP.


PD.: Si alguien puede ver el algoritmo le agradecería que lo explicara.

Última edición por vtr25 fecha: 30-jun-2020 a las 23:13.
vtr25 está desconectado   Responder Con Cita


Viejo 01-jul-2020, 00:37   #2
Valdetremus
ForoCoches: Miembro
 
Avatar de Valdetremus
 
Mar 2018 | 523 Mens.
Lugar: el fin del mundo

Lada Niva

me encanta, gran curro y felicidades por solucionar el tema! Lo cuentas sencillo, pero sé que tiene mucha tela!

Valdetremus está desconectado   Responder Con Cita
Viejo 01-jul-2020, 10:42   #3
vtr25
ForoCoches: Miembro
 
Jul 2019 | 122 Mens.

Un germano-hipano, una britanica, una japo

Cita:
Originalmente Escrito por Valdetremus Ver Mensaje
me encanta, gran curro y felicidades por solucionar el tema! Lo cuentas sencillo, pero sé que tiene mucha tela!
Muchas gracias, esto es sencillo, en un par de tardes se quedó listo con todas ellas investigaciones y todo, claro que hay que tener algo de base y gnas de investigar cosas nuevas, la vida si es complicada
vtr25 está desconectado   Responder Con Cita
Viejo 01-jul-2020, 12:20   #4
Schwarzenalex
Rugbier
 
Avatar de Schwarzenalex
 
May 2011 | 10.184 Mens.
Lugar: Barcelona

Coche:TaliVag Moto:TaliHonda

oigan y las fotos????


Schwarzenalex está desconectado   Responder Con Cita


Respuesta

Regresar   Inicio | ForoCoches > Zona ForoCoches > Motos
Herramientas


 [ VERSIÓN MÓVIL ]
Info Legal | Privacidad | Cookies | Notificaciones | Normas de uso | Publicidad | Updates | Stats | Ayuda | Invitaciones | Contacto