domingo, 1 de mayo de 2016

Efecto auto fantástico con interrupción para cambio de velocidad

Buenas mis queridos lectores, para los que se inician en este apasionante mundo de Arduino vamos a documentar una serie de proyectos sencillos con la tarjeta Arduino Mega 2560.

Resultado al que debemos llegar: 




Materiales necesarios:
  • Tarjeta Arduino Mega 2560
  • 17 resistencias de 1/4  watt de 220 ohmnios
  •  1 resistencia de 1/4 watt de 10 K. omnhios
  • 1 pulsador Normalmente Abierto
  • Múltiples cables de conexión
Funcionamiento del programa:

El programa iniciará encendiendo los leds de uno en uno por cada uno de los dos grupos de 8 leds y al llegar al final se devolverá realizando el  efecto de auto fantástico. Si se presiona el pulsador la velocidad del efecto se reducirá y asi sucesivamente hasta volver al estado original, para lograr esto habrá que oprimir el pulsador unas 20 veces aproximadamente.

Conexión de la tarjeta Arduino:
  •  8 leds rojos conectados a los pines  5, 6, 7,8,9,10,11,12 
  •  8 leds verdes conectados a los pines 22,23,24,25,26,27,28,29
  •  1 pulsador conectado al pin 2
 Programa Arduino:

 /* El auto fantástico*/ 

int BotonIncremento=2;   //botón de incremento
int timeAntirebote=20;  //un valor entre 10 y 15 nos da una lectura correcta del estado del botón.
int EstadoBotonIncremento;
int EstadoBotonAnteriorIncremento;

int pinArray1[] = {5, 6, 7,8,9,10,11,12};      //primer grupo de pines
int pinArray2[] = {22,23,24,25,26,27,28,29};   //segundo grupo de pines
int count = 0;
int count2 = 0;
int timer = 5; //timer marca como queremos que vaya de rápido la ráfaga de encendido-apagado de los LEDS  
int estado = 0;

//Función Antirebote
boolean antirebote(int pin){  //esta función nos va a devolver un valor booleano.
  int contador=0;
  boolean estado; //guarda el estado del botón
  boolean estadoAnterior;//guarda el último estado del botón

 do {
   estado=digitalRead(pin);
   if (estado != estadoAnterior){
     contador=0;
     estadoAnterior = estado;
   }
  else{
    contador = contador + 1;
  }
  delay(1);
 }
 while(contador < timeAntirebote);
 return estado;
}


void setup(){
  pinMode(BotonIncremento,INPUT);   //los pines los declaramos como entradas
  Serial.begin(9600);
  attachInterrupt( 0, ServicioBoton, RISING);  //declaramos interrupción de paso bajo a paso alto
 
  for (count=0;count<8;count++) {
  pinMode(pinArray1[count], OUTPUT);
  }
 
  for (count=0;count<8;count++) {
  pinMode(pinArray2[count], OUTPUT);
  }  
  }

void loop() {  
  for (count=0;count<7;count++) {
    digitalWrite(pinArray1[count], HIGH);  
    digitalWrite(pinArray2[count], HIGH);   
    delay(timer);
    digitalWrite(pinArray1[count + 1], HIGH);
    digitalWrite(pinArray2[count + 1], HIGH);     
    delay(timer);
    digitalWrite(pinArray1[count], LOW);
    digitalWrite(pinArray2[count], LOW);
    delay(timer*2);}  
    for (count=7;count>0;count--) {
    digitalWrite(pinArray1[count], HIGH);
    digitalWrite(pinArray2[count], HIGH);
    delay(timer);
    digitalWrite(pinArray1[count - 1], HIGH);
    digitalWrite(pinArray2[count - 1], HIGH);
    delay(timer);  
    digitalWrite(pinArray1[count], LOW);
    digitalWrite(pinArray2[count], LOW);
    delay(timer*2);}   
}
   

  void ServicioBoton() {          
   EstadoBotonIncremento=digitalRead(BotonIncremento);//leemos el botón
   if((EstadoBotonIncremento !=EstadoBotonAnteriorIncremento) &&(antirebote(BotonIncremento))){   //preguntamos si hay cambio respecto al estado anterior y vemos si esta presionado
        timer=timer + 5;   //aumentamos la cuenta      
   }
   EstadoBotonAnteriorIncremento = EstadoBotonIncremento;//guardamos el estado del botón  
    if (timer >= 200) { 
    timer=5;
   }   
  } 






No hay comentarios:

Publicar un comentario