Shift Lights

Hola, 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 según la combinación deseada.

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 (recordar 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).

Recordar: el arbol del levas va al doble de velocidad que las revoluciones motor. A parte, en mi montaje, por cada vuelta hay 4 pulsos.

He eliminado el conector de alimentación externa del Arduino, y le he sacado directamente los cables soldando en su lugar. También he puesto un Varistor para proteger la etapa de alimentación.

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

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

http://www.youtube.com/watch?v=PxaYx8HX9Og

La secuencia es segun aumentan las rpm: primer led verde on, los dos primeros verdes on, los dos primeros leds verdes on y tercero en azul on y 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).

No puedo colgar el esquema de montaje, porque lo hice "a pelo"....

Salu2

Igor R.

Aquí el código totalmente en wiring… Hay mejores formas de programarlo, pero lo he hecho sencillo ya que el tiempo de proceso no es un problema…

//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<Primera_ON){
    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 <Segunda_ON)){
    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 <Tercera_ON)){
    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 <Todas_ON)){
    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 <OVERREV)){
    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);



  }
    
  
}