Mostrando entradas con la etiqueta led. Mostrar todas las entradas
Mostrando entradas con la etiqueta led. Mostrar todas las entradas

domingo, 18 de enero de 2015

Ajuste luminosidad de un LED con LDR

Hola a todos. En esta entrada vamos a seguir  trabajando con las LDR.

Hay un tipo de montaje muy común con fotorresistencias que  varía la luminosidad de un LED en función de la  luz que incide en el LDR. Es fácil encontrarlo pero vamos a desarrollarlo para introducir nuevos conceptos y como base para otras entradas posteriores.

El enunciado por tanto, de lo que queremos conseguir, es el siguiente. Queremos un circuito que varíe la luminosidad de un LED en función de la cantidad de luz incidente en el LDR.

A primera vista el planteamiento debería ser prácticamente un “copy-paste” de la entrada sobre PWM, (puedes consultarla aquí), pero cambiando el potenciómetro por el LDR. El esquema es el mismo expuesto en la entrada anterior:


Por lo tanto no variará el montaje, es éste:


La diferencia la tendremos en el rango dinámico que encontraremos en la entrada analógica. Con el potenciómetro, conectado como divisor de tensión, la entrada podía oscilar entre los 0 y los 5V, o en digital entre valores comprendidos entre 0 y 1023.

Con el circuito propuesto, la entrada nunca podrá alcanzar los 5V, pues con la mayor de las fuentes de luz incidiendo en el LDR, tendría una resistencia de más de 100Ω, por tanto la entrada del Arduino vería una tensión de:

I=V/(R+LDR)=5/10.100=0.495mA

VARD=R*I=10.000*0.000495=4,95V

Insisto en que este valor con una fuente de luz muy intensa y muy próxima al LDR.

Para calcular elvalor mínimo de tensión, a oscuras, debemos contemplar una resistencia del LDR de 0.5MΩ. Calculando ota vez la corriente que fluye por la malla:

I=V/(R+LDR)=5/510000=0.0098mA

VARD=R*I=10.000*0.0000098=0.098V

Estos serían valores comprendidos entre máximos y mínimos, que están muy lejos de condiciones reales de funcionamiento.

En condiciones normales yo he obtenido diferencias de unos 3 Voltios, lo que traducido al conversor AD del Arduino (entrega valores entre 0 y 1023), nos da una resolución de tan solo 600 puntos de los 1024 posibles.

Veamos primero como funcionaría una adaptación simple del sketch empleado en el ejemplo del potenciómetro.

int lightPin = 0;  //define el pin de la foto-resistencia
int ledPin=9;     //define el pin para el  LED
int valor;     //define una variable en la que haremos los cálculos

void setup()
{
    Serial.begin(9600);  //Inicializa la comunicación serie
    pinMode( ledPin, OUTPUT );
}

void loop()
{
    valor = analogRead(lightPin);
    analogWrite(ledPin, valor); 
    Serial.println(valor); 
    delay(1000); //pequeño retardo para darle
               // tiempo al LED a responder.
}


¿Qué sucede cuando lo cargamos en el Arduino? 
Antes de nada abrir el serial monitor, y probad a tapad y destapar el LDR y observar los valores obtenidos.  Os muestro los obtenidos en mi caso:





Si vemos los valores obtenidos en la entrada,podemos observar que están entre los 238 y los 774. Eso es debido a que como he comentado anteriormente, en condiciones normales nunca se alcanzan los valores extremos, 0 y 1023. Veamos como solucionar este apartado, para que trabaje solamente entre los valores “ de campo” y el LED pase por todos los estados posibles, incluido el apagado o máximo brillo.

Nota: estos valores son para mis componentes y en las condiciones de casa. Aunque para cada caso variará, no alcanzará los valores extremos.

Map y constrain


Necesitamos hacer proporcional la salida a los valores de entrada, convirtiendo el valor mínimo en la entrada del Arduino, en el "0" de la salida, y el valor máximo obtenido en la entrada en el "255", valor máximo en la salida.

Ya existe una función que rescala estos valores, es la función map. Esta función usa los siguientes argumentos:

map ( valor, fromLow, fromHigh, toLow, toHigh )

Una breve descripción de los parámetros sería:

valor:        número que queremos reescalar,
fromLow: límite inferior de la horquilla que queremos usar como valores de entrada,
fromHigh: este es el límite superior a usar en los valores de entrada,
toLow:      valor mínimo a obtener en la salida,
toHigh:     valor máximo  a obtener en la salida.


Los valores toLow y toHigh, serán los valores mínimo y máximo de la salida PWM, 0 y 255.

Los valores de entrada fromLow y fromHigh, en esta entrada los hallaremos de forma empírica.

Los pasos a seguir, serían los siguiente:

- Cargar el sketch,
- Lanzar el monitor serial,
- Someter el LDR a la fuente de luz mínima y máxima y anotar lo valores obtenidos,
- Modificar el sketch con los valores máximo y mínimos y volverlos a cargar

El sketch est aquí:


/* Ejemplo para reescalr los valores obtenidos en la entrada 
analogica del Arduino. En este caso usamos un LDR conectado a A0,
a traves de un divisor de tension con un a resistencia de 10.000ohmios*/

int lightPin = 0; // Pin LDR.
int ledPin = 9; // Pin LED.
int valor; // Variable para cálculos.
int ajuste;
int min = 0; // Valor minimo obtenido por A0.
int max = 1024; // Valor maximo obtenido por A0.

void setup(){

Serial.begin(9600); // Inicializa el puerto serie.
pinMode( ledPin, OUTPUT ); // ledPin como salida.
}

void loop()
{

valor = analogRead(lightPin); // Leemos el valor de A0.
Serial.print ("Valor de entrada: ");
Serial.println(valor); // Valor de entrada de A0.
valor = constrain(valor, min, max); // Normalizamos el valor.
valor = map(valor, min, max, 0, 255); // Re-mapeamos.
analogWrite(ledPin, valor); // Escribimos el valor.


delay(1000); 

}


Vale, casi se me olvidaba. Nos faltaba explicar la función constrain. Esta función restringe los valores de salida a los que queden dentro de la horquilla de valores que hayamos definido. La sintaxis es la siguiente:

constrain (x, a, b)

Siendo :

x: el dato que hemos obtenido,
a: el límite inferior,
b: límite superior,

¿ Cómo funciona?, esta función devuelve:
  • El mismo valor x a la entrada si a < x < b.
  • Si el valor x es menor que o igual a  a, devolverá a,
  • Si es mayor o igual que b, devolverá b.
Esto nos sirve para que el Arduino no tenga en cuenta los valores de fuera del rango que hemos definido en la función map. Los valores por encima o por debajo de los límites se ajustarán a los valores establecidos.

Un video explicativo del procedimiento a seguir.




Bibliografía:

En esta entrada se han usado ejemplos adaptados de la web http://arduino.cc, para explicar las funciones map y constrain.




domingo, 21 de diciembre de 2014

Programando un dimmer con un pulsador

Hola de nuevo. Espero que no hayáis desmontado el circuito del pulsador usado hasta ahora, porque le vamos a dar una vuelta de tuerca más.
Por si caso el montaje es este:


En el ejemplo de hoy vamos a programar un dimmer que regula la luminosidad de un led. Para ello vamos a aplicar lo que hemos aprendido hasta ahora sobre pulsadores y sobre PWM.
El funcionamiento exacto que queremos conseguir del dimmer es el siguiente:
  • Que una pulsación encienda el led.
  •  Una pulsación prolongada comience a incrementar la luminosidad mientras el pulsador esté pulsado. El incremento se detiene cuando se deja de pulsar.
  • Si se alcanza la máxima luminosidad y se continúa pulsando, la luminosidad se reinicia desde cero y continuaría incrementandose, en forma de bucle.
  • Una pulsación corta apaga el led.

De acuerdo, pues una vez definido el funcionamiento de nuestro circuito, vamos a explicar una de las funciones que nos hará falta para completar el ejercicio.

La función milis ()


Es una función que nos devuelve el tiempo que ha pasado desde que el sketch en curso ha comenzado. Se ha de usar una variable de tipo unsigned long para almacenarlo. El contador se resetea aproximadamente después de 50 días.
Para la aplicación que diseñaremos deberemos medir el  tiempo que ha pasado entre dos pulsaciones. Es decir, no nos interesa el acumulado desde el principio sino el tiempo pasado entre dos intervalos, en concreto, queremos medir lo que dura la pulsación.
Un ejemplo de aplicación:

 duracion = millis() – ultimavez; // Tiempo que ha pasado desde la última vez que se leyó

El algoritmo del programa sería:

- Esperar una pulsación ,
- Cuando recibimos esa pulsación medir el tiempo que permanece pulsado, 
  1. si es menor a 500 ms invertir la salida,
  2. si es mayor y el LED estaba en ON incrementar su luminosidad
- Repetir indefinidamente,

Fácil, ¿no? El programa sería casi un "copy-paste" de lo visto hasta ahora, con la inclusión de la función milis() para medir los intervalos.

Mi propuesta para resolver este ejercicio, es la siguiente:

// Ejemplo 1.7: Dimmer con un pulsador
// El LED se activa con una pulsación corta
// y se apaga con otra pulsación corta
// Si permanece pulsado se incrementa el brillo

const int LED = 9; // pin para el LED
const int PULSADOR = 2; // pin para el pulsador

int valor = 0; // variable para almacenar el pulsador
int old_valor = 0; // estado anterior del pulsador
boolean estado = false; // FLASE = LED apagado TRUE = LED encendido
int brillo = 128; // Variable para el brillo. Inicial a media carga
unsigned long inicio_pulso = 0; // medirá la duracion de la pulsación

void setup() {
pinMode(LED, OUTPUT); // LED es una salida
pinMode(PULSADOR, INPUT); // y PULSADOR es una salida
}
void loop() {
valor = digitalRead(PULSADOR); // Leemos el estado del pulsador
if ((valor == HIGH) && (old_valor == LOW)) // si hay una pulsación
{ 
estado = !estado; // cambiamos el estado del LED,
// ante cualquier pulsacion apagamos si estaba encendido o al reves
inicio_pulso = millis(); //esta funcion cuenta el tiempo pasado
// desde que se inició el sketch. Nos servirá para medir
//la duración de la pulsación
delay(10);// Este delay evita los rebotes del pulsador.
}


// Comprobemos ahora si el interruptor sigue pulsado
if ((valor == HIGH) && (old_valor == HIGH)) {
// Y ahora la condicion que esté pulsado más de 500 ms 
if (estado == 1 && (millis() - inicio_pulso) > 500) {
brillo++;  // esta función es equivalente a brillo=brillo + 1;
delay(10); // "entretenemos" al Arduino para que el brillo
// no se incremente demasiado rapido
if (brillo > 255) // 255 es el maximo de la salida PWM
{ 
brillo = 0; // y si la superamos lo reseteamos a 0
}
}
}
old_valor = valor; // machacamos el valor anterior con el nuevo
if (estado == true) {// Si estado TRUE, encendemos el LED
analogWrite(LED, brillo); // Enciende el LEDelse {
analogWrite(LED, 0); // Apaga el LED
}
}

El programa lo podéis descargar desde aquí.

La particularidas de este sketch respecto al ejercicio con PWM, radica en la parte que mide la longitud de la pulsación. Es esta:

     if ((valor == HIGH) && (old_valor == HIGH)) {

En esta línea le decimos que evalue si estamos todavía pulsando el pulsador,  es decir si el valor anterior y el actual sique siendo 1, estamos todavía pulsando.

if (estado == 1 && (millis() - inicio_pulso) > 500)


Aquí medimos la duración de la pulsación. Si es superior a medio segundo (500ms), comenzamos a subir la luminosidad incrementando la variable que usamos para la señal PWM, Es esta línea,
brillo++;  // esta función es equivalente a brillo=brillo + 1;
Después de esto, simplemente machacamos el valor anterior del pulsador, escribimos la salida, y comenzamos de nuevo el bucle.
Un par de apuntes más sobre el funcionamiento:
  • En condiciones iniciales, la primera vez que se enciende el LED lo hará a mitad de brillo. (brillo 128). Si queremos variar este valor recordad que como máximo puede ser de 255.
  • Mientras no se desconecte el Arduino de la tensión, recordará el último valor que tenía antes de apagar el LED la próxima vez que lo encienda.
  • Si os fijáis en los últimos segundos del video, incluso con el retraso para evitar rebotes, el Arduino recibe una falsa señal y cambia sus estado. En aplicaciones críticas es muy recomendable colocar un condensador en la resistencia de pull-down, tal y como vimos en su día. Podéis repasarlo aquí.
Os dejo el enlace con una muestra del funcionamiento. Nos vemos.

lunes, 8 de diciembre de 2014

Modulación por ancho de pulsos. PWM en Arduino

Hola de nuevo,

Bueno una semana sin ordenador, así que una semana casi en blanco. Vamos al lío.

Hoy vamos a explicar un nuevo concepto. Para realizar esta entrada necesitaremos:

- 1 x arduino UNO o compatible,
- 1  x Resistencia de 220ohms, si empezáis podéis comprar un lote de varios valores, por ejemplo como este lote de 400 resistencias, por poco más de 2 €
- 1 x Led, del color que más os guste. Os recomiendo un kit de varios colores si todavía estáis empezando,
- 1 x Protoboard, o placa de prototipos, para realizar los montajes de forma sencilla y sin soldaduras.

PWM, (pulse-width modulación), o modulación por ancho de pulsos.

Esta técnica modifica el ciclo de trabajo de una señal periódica, es decir la relación entre el tiempo que está en su parte positiva y el que está en su parte negativa. La fórmula que lo rige:

Donde:


D = \frac{\tau}{T}



D es el ciclo de trabajo
\tau es el tiempo en que la función es positiva (ancho del pulso)
T es el período de la función

Un gráfico de ejemplo:


¿Qué usos se le da a este tipo de señales? Algunos de ellos son:

- Generar señales de audio.
- Variar la velocidad de los motores
- Generar una señal analógica , si se filtra la salida digital
- Generar una señal modulada, para por ejemplo pilotar un LED infrarrojo de un control remoto,
- Variar la luminosidad de un led,

Hay muchas aplicaciones que se puede dar a este tipo de modulación de señales.

Para nuestro ejemplo vamos a diseñar un "dimmer" muy sencillo que ilumine el led al 10%, variando el ciclo de carga de la señal que haremos llegar al led. Lo que hará nuestro algoritmo es encender y apagar el LED, pero con una frecuencia tan alta, que nuestro ojo no percibe el parpadeo, sino una menor luminosidad. Variando el ancho del pulso incrementaríamos el ciclo de carga, pasaría mayor tiempo encendido y por tanto dará la sensación de mayor luminosidad.

El hardware del ejemplo, será nuestro archiconocido LED rojo, conectado al Arduino en su pin 9 a través de una resistencia de 220Ω. Por si hay alguna duda, algo como esto:


El algoritmo de lo que queremos hacer sería:

- programar el led 9 como salida
- Encender el led, ponerlo a "1"
- Esperar durante 100  μs,
- Apagar el led,
- Esperar durante 900 μs,
- Repetir indefinidamente,

Una propuesta para nuestro programa sería esta:


void setup()
{
  pinMode(9, OUTPUT); // Definimos el pin 9 como salida
}
void loop() {
  digitalWrite(9, HIGH); // Ponemos el pin a 1
  delayMicroseconds(100);// Aprox un ciclo de carga del 10% para un 1KHz
  digitalWrite(9, LOW);
  delayMicroseconds(900);
}


Puedes descargarlo aquí.

Ejemplo 1_4 dimmer con delays

El programa es muy sencillo, y podemos realizar pruebas con la luminosidad final del led, tan solo variando los tiempos de delay.


Así si queremos una luminosidad del 50%, generaríamos una onda cuadrada con un ciclo de carga del 50%, es decir colocando 500 y 500 en cada delay.  Para un 25%, 250 y 750 respectivamente , y así para cualquier combinación que queramos. Recuerda volver a cargar el programa después de cada cambio para hacerlo efectivo.

Pros y contras

Dejando de lado la incomodidad de cambiar el ciclo a mano y volver a cargar el programa, esta manera de trabajar generando la onda de esta manera, tiene varios inconvenientes:

- El ciclo de trabajo está calculado aproximadamente  y se vería afectado por cualquier interrupción en el programa, a no ser que las anulemos, y si las deshabitamos...

- El Arduino no podrá hacer otra cosa mientras se ocupe del tren de impulsos, por lo que no resulta excesivamente práctico.

Algo positivo que se me ocurre de esta manera de proceder, es que podemos implementarlo en cualquier salida digital del Arduino.

Veamos entonces otra forma de implementarlo.

analogWrite()

Esta función tiene la siguiente sintaxis:

analogWrite (pin,valor)

Donde los parámetros son:

pin: el pin que usaremos,
valor: ciclo de carga, entre 0 y 255. (0 siempre apagado, 255 siempre encendido, 127 al 50%, etc...)

Esta función genera en el pin especificado una señal cuadrada cuyo ciclo de carga variará entre entre 0 y el 100% (valores entre 0 y 255). En el Arduino UNO los pins que pueden ejecutar esta función son los pins 3, 5, 6, 9, 10 y 11. 

La frecuencia de la señal cuadrada es de aproximadamente 490 Hz, excepto en los pies 5 y 6 que será de aproximadamente 980 Hz.  

Como quedaría el programa entonces:

const int ledPin = 9;
const int DutyCicle = 255;/* Usaremos un valor de 25 para un 10%, 
67 para un 25%, 127 para un 50% y 255 para un 100% */

void setup()
{   
  pinMode(ledPin, OUTPUT); // Definimos el pin 9 como salida 
}
void loop()
{
  analogWrite(ledPin,DutyCicle);//asignamos pin 9 un ciclo carga del 10% aprox
                    //el valor de un 10% estaría entre un valor de 25
}


Puedes descargarlo aquí:

Ejemplo 1_4b dimmer con analogWrite

Ahora podemos variar nuestra luminosidad (ciclo de carga o duty cicle), tan solo variando un parámetro. Prueba los siguientes valores:

- 0, siempre apagado,
- 63, un 25% de luminosidad,
- 127, un 50%
- 255, un 100% siempre encendido,

Recuerda volver a cargar el programa tras el cambio de valor.

Un apunte más, este tipo de control sobre la luminosidad de un LED, (o cualquier tipo de carga) es mucho más eficiente que hacerlo intercalando un potenciómetro, puesto que aquí no hay perdida de potencia en forma de disipación de calor que si se daría en un potenciómetro o carga resistiva.

Un video de ejemplo:








lunes, 1 de diciembre de 2014

Trabajando con pulsadores. Uso de If ..

Hola de nuevo.

Ahora que sabemos como funciona el hardware necesario para implementar un pulsador, vamos a ver un ejemplo de programación sencillo para leer el estado de un pulsador.

En este punto necesitaremos introducir una nueva referencia del lenguaje de programación de Arduino .El condicional if.

Esta sentencia siempre va acompañada de unos comparadores, que son los que verifican que la condición expuesta se cumpla. Un ejemplo:



if (x == 10)                // condición que debe comprobar
{ 
digitalWrite(pin1, HIGH);
} // Entre estos corchetes introducimos todas las acciones que queremos que se ejecuten si se cumple la condición



Este sencillo ejemplo verifica si la variable X es igual a 10. En caso de que se cumpla, pondrá a "1" el pin 1. Si la condición se cumple el programa ejecutará la parte de programa que se encuentra       entre { }.

¿Qué clase de comparaciones podemos realizar? Las siguientes:

x = = y , (x es igual que y)
x ! = y,   (x no es igual que y )
x > y ,    (x es mayor que y)
x < y,     (x es menos que y)
x >= y,   (x es igual o mayor que y)
x <=y,    (x es igual o menor que y)

Es importante no confundir x=y, con x==y. En el primer caso , no es tamos comparando x con y, sino dando directamente a x el calor de y. Con lo que si estuviésemos dentro de la comparación ,ésta siempre se cumpliría.

Un ejemplo completo, que active una salida durante dos segundos cuando pulsamos el pulsador.



//Ejemplo 1.3a Ejemplo para programar una entrada de Arduino que obedece a un 
//pulsador
//La salida permanecera activa durante 2 segundos despues de cada pulsacion

int pulsador = 2; //entrada de arduino a la que conectaremos nuestro pulsador
int led = 8; // salida de Arduino en la que conectaremos el led

void setup()
{
  pinMode(pulsador,INPUT); //Definimos el pulsador como entrada. Esta conectado                               //a resistencia pull-down  
  pinMode(led,OUTPUT);     //Definimos el led como salida
}

void loop()
{
if ( digitalRead(pulsador) == HIGH )
{

digitalWrite(led,HIGH);
delay (2000);               // lo mantenemos encendido 2 segundos
digitalWrite(led,LOW);
}
}


El esquema eléctrico del ejemplo es el siguiente:




Un ejemplo de disposición en la protoboard podría ser:


El sketch verificado lo puedes descargar de:

Ejemplo 1.3a Pulsador simple


Ahora, sí ha quedado claro el ejemplo podríamos darle una vuelta más al ejemplo de "la ola", y hacer que se iniciase con la pulsación del pulsador. Intentadlo antes de copiar el ejemplo. Mi propuesta para conseguirlo sería esta:


//Ejemplo1.3b Modificacion del ejemplo de la ola//para conseguir que la activacion responda a la pulsacion
int d=200; // variable de tipo integer, que define el tiempo de delay
int pulsador = 2; //entrada de arduino a la que conectaremos nuestro pulsador
int led = 8; // salida de Arduino en la que conectaremos el led

void setup()
{
  pinMode(pulsador,INPUT); //Definimos el pulsador como entrada. Esta conectado                               //a resistencia pull-down  

  pinMode(led,OUTPUT);     //Definimos el led como salida  
  pinMode(2,OUTPUT);       //Pin 2 conectado al led 1, definido como salida  
  pinMode(3,OUTPUT);       //Pin 3 conectado al led 2, definido como salida  
  pinMode(4,OUTPUT);       //Pin 4 conectado al led 3, definido como salida  
  pinMode(5,OUTPUT);       //etc...
}
void loop()
{
  if ( digitalRead(pulsador) == HIGH )
    {
     for ( int a = 2; a < 6; a++ )
      {
      digitalWrite(a,HIGH);
      delay (d);
      digitalWrite(a,LOW);
      delay (d);
      }
    }
delay(10);
}


Lo podeis descargar verificado del siguiente enlace:

Ejemplo 1.3b Pulsador en ejemplo de "La ola"

Podéis observar que en este ejemplo la sangría de cada bucle o parte de programa es diferente.          Es solo una norma de estilo, pero ayuda a entender donde acaba cada sentencia. Es importante también contar los corchetes,e ir cerrándolos, sino nos dará error a la hora de compilar el programa.


Un apunte para aquellos que hayan trabajado con autómatas tipos Siemens,Omron, etc. El trabajo con un Arduino difiere un poco ya que el autómata reacciona al cambio de estado de sus entradas ejecutando el proceso que hayas programado. Es decir, están constantemente "monitorizadas".

En un Arduino sin embargo, has de hacer una lectura constante de éstas, y ejecutar el código cuando detectas que ha cambiado de estado.

Os dejo con un video para ver el funcionamiento de los proyectos, y observéis la realización del conexionado.



sábado, 22 de noviembre de 2014

Uso de bucles. La instrucción for

Ejemplo 1_2

En esta entrada quiero explicar un tipo de bucle muy típico en programación. Se trata del bucle
for.
Este tipo de recurso se usa cuando queremos repetir n  número de veces un evento dentro del programa. Repetirlo a base de copiar el mismo código n veces cómo el día anterior tiene varios inconvenientes:
-        Es muy pesado, efectivamente, y aunque uses el clásico copiar y pegar,
-        También es ineficiente desde un punto de vista de programación, puesto que hace el código más largo, y la memoria de nuestro Arduino está muy limitada.
¿Cómo quedaría la secuencia de encendido, nuestro  void loop, con este recurso? Primero un vistazo al código anterior:


void loop()
{
  digitalWrite(2,HIGH);
  delay(d);
  digitalWrite(2,LOW);
  digitalWrite(3,HIGH);
  delay(d);
  digitalWrite(3,LOW);
  digitalWrite(4,HIGH);
  delay(d);
  digitalWrite(4,LOW);
  digitalWrite(5,HIGH);
  delay(d);
  digitalWrite(5,LOW);
}


Y ahora usando el for,  el ejemplo completo:




//Ejemplo1.2 versión para explicar el uso del for para realizar procesos repetitivos
//sobre el ejemplo anterior de "la ola ". La declaración de entradas y salidas es la misma
//el cambio será a la hora de encenderlas que lo haremos usando la instrucción for

int d=1000; // constante de tipo integer, que define el tiempo de delay

void setup()

{
  pinMode(2,OUTPUT); //Pin 2 conectado al led 1, definido como salida
  pinMode(3,OUTPUT); //Pin 3 conectado al led 2, definido como salida
  pinMode(4,OUTPUT); //Pin 4 conectado al led 5, definido como salida
  pinMode(5,OUTPUT); //etc...
}

Void loop()
{
For ( int a = 2;  a < 6; a++)
{
digitalWrite(a,HIGH);
delay (d);
digitalWrite(a,LOW);
delay (d);
}
}
                 
Analicemos el bucle:
for ( int a = 2; a < 6 ; a++ )
   {
digitalWrite(a, HIGH);
delay(d);
digitalWrite(a, LOW);
delay(d);
   }
}



Detrás de la instrucción for, entre paréntesis expresamos las condiciones del bucle.
Primero definimos una variable, a, y le asignamos un valor inicial.  Seguidamente le decimos cual es la condición que debe cumplir esa variable para salir del bucle, que sea más pequeña que 6, y cuanto tiene que incrementar en cada repetición, en este caso contar de 1 en 1, a++.
Después entre corchetes se encuentra las acciones que se realizarán todas las veces que se ejecute el bucle. Cómo tenemos los leds conectados entre los pines 2 y 6 lo que hacemos es dar una variable, el valor inicial de 2 e ir incrementándolo hasta llegar al último. Este código es equivalente al anterior, pero se aprecia rápidamente que incrementar el nº de leds es muchísimo más sencillo. También observamos que incrementar el número de salidas no incrementa la longitud del código.

El ejemplo para descarga, lo tienes en el enlace. Como siempre, intenta teclearlo tú:

Ejercicio 1.2 de arduino práctico

Los bucles también se pueden definir para realizar una cuenta regresiva. En ese caso utilizaremos el valor a--. En nuestro ejemplo, el bucle podría quedar de la siguiente manera:


for ( int a = 6; a <  2 ; a-- )
   {
digitalWrite(a, HIGH);
delay(d);
digitalWrite(a, LOW);
delay(d);
   }
}

Esta versión la tienes disponible en el siguiente enlace:

Ejercicio 1.2b de Arduino práctico

En este caso, los leds describirían la secuencia en sentido inverso, y con la sentencia a— en cada paso restaremos 1, hasta llegar a 2.

Pincha en el video para apreciar la diferencia: