Shift Lights con Arduino

.

 



Un amigo me pidió que le hiciera unas "Shift Lights" para su coche de competición. Son luces de cambio, es decir, según las revoluciones motor, se van encendiendo progresivamente.

Es un coche antiguo y he sacado la señal del distribuidor. Disponía de un sensor Hall (conmuta con masa para dar la chispa. Está en serie con la bobina). La entrada al pin 2 (int 0) la he protegido con una resistencia en serie de gran valor y un zener de 5V1 (recordad que está en serie con una bobina). A parte, las entradas del ATMega 168 vienen protegidos con "clamp diodes" (como máximo permiten 1 mA).

Recordad: el arbol del levas va a la mitad de velocidad que las revoluciones motor. Además, en mi montaje, por cada vuelta hay 4 pulsos.

He eliminado el conector de alimentación externa del Arduino, y he soldado unos cables para la alimentación en su lugar. También he puesto un Varistor para proteger de sobretensiones la etapa de alimentación.

He usado diodos leds tricolores (los puedes encontrar en Bricogeek ó Sparkfun).


Es un montaje muy rápido preparar y de programar.Pongo un video del resultado:

 


La secuencia según aumentan las rpm:
1) primer led verde on
2) dos primeros verdes on
3) los dos primeros leds verdes on y el tercero en azul on
4) en el momento de cambio=> los 3 leds on en rojo.

Para avisar de overrevs, se le ponen todas en azul (viene bien sobre todo cuando se baja de marcha si no quieres que sufran válvulas y sus muelles, etc).

En el video, parece que los leds iluminan mucho, pero está bien. Es un problema de la calidad (grabado con un móvil). Tampoco es la ubicación definitiva y se podría hacer más pequeño.... al gusto del consumidor...  ;)



//SHIFT LIGHTS
//By Igor Real
//13-09-09



#define Primera_ON       5500
#define Segunda_ON       6000
#define Tercera_ON       6500
#define Todas_ON         7000
#define OVERREV          8000



//----------------------------
#define Third_Red        13              
#define Third_Blue       12
#define Third_Green      11
//----------------------------
#define Second_Red       10              
#define Second_Blue      9
#define Second_Green     8
//----------------------------
#define First_Red        5              
#define First_Blue       6
#define First_Green      7


volatile unsigned long cont_rpm;

void setup()                    
{
  pinMode(Third_Red, OUTPUT);      
  pinMode(Third_Green, OUTPUT);      
  pinMode(Third_Blue, OUTPUT);      
  pinMode(Second_Red, OUTPUT);      
  pinMode(Second_Green, OUTPUT);      
  pinMode(Second_Blue, OUTPUT);
  pinMode(First_Red, OUTPUT);      
  pinMode(First_Green, OUTPUT);      
  pinMode(First_Blue, OUTPUT);
  //-----------------------------------------
  digitalWrite(Third_Red,LOW);
  digitalWrite(Third_Green,LOW);
  digitalWrite(Third_Blue,LOW);
  digitalWrite(Second_Red,LOW);
  digitalWrite(Second_Green,LOW);
  digitalWrite(Second_Blue,LOW);
  digitalWrite(First_Red,LOW);
  digitalWrite(First_Green,LOW);
  digitalWrite(First_Blue,LOW);  
  //-----------------------------------------
  pinMode(2,INPUT);  
  attachInterrupt(0, rpm, RISING);
  Serial.begin(9600);
}

void rpm()
{
  cont_rpm++;

}

void loop()                    
{
  static unsigned long rpm_ant;
  static unsigned long t_anterior;
  static float rpm_actuales;
  
  rpm_ant=cont_rpm;
  t_anterior=millis();

  delay(100);  

  rpm_actuales=(cont_rpm-rpm_ant)/(2.0*(millis()-t_anterior)/60000);
  Serial.println(rpm_actuales);
  
  if (rpm_actuales
    digitalWrite(Third_Red,LOW);
    digitalWrite(Third_Green,LOW);
    digitalWrite(Third_Blue,LOW);
    digitalWrite(Second_Red,LOW);
    digitalWrite(Second_Green,LOW);
    digitalWrite(Second_Blue,LOW);
    digitalWrite(First_Red,LOW);
    digitalWrite(First_Green,LOW);
    digitalWrite(First_Blue,LOW);        
  }else if((rpm_actuales>=Primera_ON) && (rpm_actuales 
    digitalWrite(First_Green,HIGH);
    
    digitalWrite(Third_Red,LOW);
    digitalWrite(Third_Green,LOW);
    digitalWrite(Third_Blue,LOW);
    digitalWrite(Second_Red,LOW);
    digitalWrite(Second_Green,LOW);
    digitalWrite(Second_Blue,LOW);
    digitalWrite(First_Red,LOW);
    digitalWrite(First_Blue,LOW);
  }else if ((rpm_actuales>=Segunda_ON) && (rpm_actuales 
    digitalWrite(Second_Green,HIGH);
    digitalWrite(First_Green,HIGH);
    
    digitalWrite(Third_Red,LOW);
    digitalWrite(Third_Green,LOW);
    digitalWrite(Third_Blue,LOW);
    digitalWrite(Second_Red,LOW);
    digitalWrite(Second_Blue,LOW);
    digitalWrite(First_Red,LOW);
    digitalWrite(First_Blue,LOW);
  }else if ((rpm_actuales>=Tercera_ON) && (rpm_actuales 
    digitalWrite(Third_Blue,HIGH);  
    digitalWrite(First_Green,HIGH);
    digitalWrite(Second_Green,HIGH);

    digitalWrite(Third_Red,LOW);
    digitalWrite(Third_Green,LOW);
    digitalWrite(Second_Red,LOW);
    digitalWrite(Second_Blue,LOW);
    digitalWrite(First_Red,LOW);
    digitalWrite(First_Blue,LOW);  
  }else if ((rpm_actuales>=Todas_ON) && (rpm_actuales 
    digitalWrite(Third_Red,HIGH);    
    digitalWrite(Second_Red,HIGH);
    digitalWrite(First_Red,HIGH);    
    

    digitalWrite(Third_Green,LOW);
    digitalWrite(Third_Blue,LOW);
    digitalWrite(Second_Green,LOW);
    digitalWrite(Second_Blue,LOW);
    digitalWrite(First_Green,LOW);
    digitalWrite(First_Blue,LOW);  
  }else if (rpm_actuales>=OVERREV){
    digitalWrite(Third_Red,LOW);
    digitalWrite(Third_Green,LOW);
    digitalWrite(Second_Red,LOW);
    digitalWrite(Second_Green,LOW);
    digitalWrite(First_Red,LOW);
    digitalWrite(First_Green,LOW);
        
    
    digitalWrite(Third_Blue,HIGH);    
    digitalWrite(Second_Blue,HIGH);    
    digitalWrite(First_Blue,HIGH);    
    
    delay(1000);



  }
    
  
}

.
.
.Saludos!!
.
.
.
Igor R.
.
.
.

4 comentarios:

  1. Hola, bueno el post, pero te digo que el árbol de levas va es a la MITAD de la velocidad de las revoluciones motor.

    ResponderEliminar
  2. Gazapo.... corregido!!! Gracias!

    ResponderEliminar
  3. estoy muy interesado en tu proyecto y agradecería k facilitaras esquemas sobre el conexionado al arduino

    ResponderEliminar
  4. Muy buen post Igor.

    Me encuentro haciendo algo muy similar, pero no tengo muy claro como obtener el valor necesario para Serial.begin.

    Como lo hiciste tu?
    Mil gracias

    ResponderEliminar