lunes, 1 de abril de 2013

Proyecto 3: Efecto Fade

Hoy os traigo un proyecto muy facil de hacer y que podremos usar en cualquier proyecto que incluya indicadores LED y queramos darle un toque diferente. Vamos a conseguir el efecto fade, esto es el encendido y/o apagado progresivo de un led.

Material:

- Arduino UNO
- LED
- Resistencia 1k


Teoría:

La teoría es la misma que la del proyecto 2 donde controlábamos la cantidad de brillo que nos entregaba el led mediante un potenciómetro. Aqui la única teoría nueva será la de como conseguimos que tanto el apagado como el encendido sea progresivo sin necesidad de variar nosotros el brillo mediante un potenciómetro y que además sea un incremento/decremento a ritmo constante. Muy sencillo.

Como vimos en el proyecto 2, una salida PWM de arduino tiene un rango entre 0 y 255, asi que al igual que haciamos con el potenciómetro, lo que debemos hacer es que nuestra salida varíe entre este rango, siendo 0 apagado y 255 el máximo brillo.

Montaje:

Simple como siempre, la resistencia a la salida PWM que hayais puesto en el código, la patilla positiva del led (la más larga)  al otro lado de la resistencia, y la patilla negativa (la más corta) a cualquier toma GND de nuestro Arduino. Ojo con que la salida sea PWM, si no es asi, el montaje no funcionará.

  

 Código:

Aquí es donde está el grueso del montaje. Como ya se ha comentado, el efecto fade lo vamos a conseguir variando el valor de una salida PWM, la cual tiene un rango entre 0 y 255. Para esto, vamos a definir tres variables:

   - pinLed: Aquí definiremos el pin que utilizaremos para controlar el led. Debe ser PWM.
   - brillo: Aquí se irá guardando el valor actual de brillo del led. Será el valor de la salida PWM, osea, que siempre será un valor entre 0 y 255 (recordemos, 0 apagado, 255 máximo brillo).
   - fade: Aquí definiremos la cantidad en que variará cada salto el valor de brillo.

Ahora vamos a explicar un poco más a fondo todo esto:

La variable "brillo", que será el valor de salida, siempre irá entre 0 y 255 por lo que a la variable "fade", que es la cantidad de ese rango en el que "brillo" varía cada vez, debe ser coherente con el efecto que queremos conseguir. Esto es, si pusiésemos un valor a "fade" de por ejemplo, 128, que es la mitad del rango, nuestro led iría cambiando desde 0, hasta 127 (mitad de brillo) y 255 (máximo brillo), y luego hacia atrás, 127, 0, 127,255, etc... En definitiva, que no habría efecto fade. Asi que si hicieramos todo lo contrario, es decir, poner un valor muy pequeño, se conseguiría este efecto. No hace falta darle de valor 1 para que se vea este efecto, de hecho, cada uno sois libres de ir probando valores hasta que encontreis el que os de el efecto que más os guste.

La variación la conseguiremos sumandole en cada vuelta el valor de "fade" al valor anterior de "brillo". Es decir, si brillo empieza con el valor 0 (apagado) y "fade" con 5, la siguiente vuelta se hará "brillo" + "fade" y se guardará en "brillo", osea 0 + 5 = 5. La siguiente vez se hará lo mismo, pero "brillo" ahora valdrá 5, por lo que 5 + 5 = 10, la siguiente vez será 10 + 5 = 15, etc... 

He puesto un "if" donde se detecta cuando la variable "brillo" se ha pasado del máximo o del mínimo, para cambiar de signo la variable "fade" y así seguir sin problema (de 0 a 255 será +5 y de 255 a + será -5).

Por último incluyo un delay para que sea visible el efecto, ya que sino se haría tan rápidamente que casi no se apreciaría.

Sin más, el código:

int pinLed = 9;   // salida PWM donde conectaremos la resistencia
int brillo = 0;   // el valor del brillo (salida) en cada momento
int fade = 5;     // incremento de brillo en cada vuelta

void setup()  
  { 
  pinMode(pinLed, OUTPUT); // definimos el pin como salida
  } 

void loop() 
  { 
  analogWrite(pinLed, brillo); // cambiamos el valor de salida  
  brillo = brillo + fade;      // siguiente valor de brillo

  
  if (brillo <= 0 || brillo >= 255)// Control de rango
    {
    fade = -fade;      // incremento/decremento
    }     
    
  delay(30);           // delay para que el efecto sea visible
  }

Eso es todo, a probar!






 

No hay comentarios:

Publicar un comentario