Salidas digitales II

Antes de ver otras partes de nuestro Arduino, los invito a que veamos en más detalles el Sketch que vimos en la entrega anterior y aprendamos un poco más de programación. Copiaré el Sketch para tenerlo de referencia:

/*
 * ArduinoHobby.com
 * Codigo de ejemplo mostrando salidas digitales con 5 leds
 */

#define PIN_LED_1 6
#define PIN_LED_2 5
#define PIN_LED_3 4
#define PIN_LED_4 3
#define PIN_LED_5 2

#define TIEMPO_LED_ENCENDIDO 500
#define TIEMPO_LED_APAGADO 50

#define REPETICIONES_RUTINAS 5
 
void setup() {
  // En el inicio probamos que todos los leds estan bien conectados y funcionan
  pinMode(PIN_LED_1, OUTPUT);
  pinMode(PIN_LED_2, OUTPUT);
  pinMode(PIN_LED_3, OUTPUT);
  pinMode(PIN_LED_4, OUTPUT);
  pinMode(PIN_LED_5, OUTPUT);

  // Encendemos todos los leds
  digitalWrite(PIN_LED_1, HIGH);
  digitalWrite(PIN_LED_2, HIGH);
  digitalWrite(PIN_LED_3, HIGH);
  digitalWrite(PIN_LED_4, HIGH);
  digitalWrite(PIN_LED_5, HIGH);

  // Pausa de 3 segundos
  delay(3000);

  // Finalizamos apagando todos los leds
  digitalWrite(PIN_LED_1, LOW);
  digitalWrite(PIN_LED_2, LOW);
  digitalWrite(PIN_LED_3, LOW);
  digitalWrite(PIN_LED_4, LOW);
  digitalWrite(PIN_LED_5, LOW);

  // Pausa de 1 segundo antes de comenzar la rutina de repeticion
  delay(1000);
}

void loop() {
  // Repetimos la rutina 5 veces
  for (int x=0; x<REPETICIONES_RUTINAS; x++) {
    // La siguiente rutina enciende los leds 1 a 1 de izquierda a derecha
    digitalWrite(PIN_LED_1, HIGH);
    delay(TIEMPO_LED_ENCENDIDO);
    digitalWrite(PIN_LED_1, LOW);
    delay(TIEMPO_LED_APAGADO);

    digitalWrite(PIN_LED_2, HIGH);
    delay(TIEMPO_LED_ENCENDIDO);
    digitalWrite(PIN_LED_2, LOW);
    delay(TIEMPO_LED_APAGADO);

    digitalWrite(PIN_LED_3, HIGH);
    delay(TIEMPO_LED_ENCENDIDO);
    digitalWrite(PIN_LED_3, LOW);
    delay(TIEMPO_LED_APAGADO);

    digitalWrite(PIN_LED_4, HIGH);
    delay(TIEMPO_LED_ENCENDIDO);
    digitalWrite(PIN_LED_4, LOW);
    delay(TIEMPO_LED_APAGADO);

    digitalWrite(PIN_LED_5, HIGH);
    delay(TIEMPO_LED_ENCENDIDO);
    digitalWrite(PIN_LED_5, LOW);
    delay(TIEMPO_LED_APAGADO);

    // Y sigue encendiendolos de derecha a izquierda (volviendo)
    digitalWrite(PIN_LED_4, HIGH);
    delay(TIEMPO_LED_ENCENDIDO);
    digitalWrite(PIN_LED_4, LOW);
    delay(TIEMPO_LED_APAGADO);

    digitalWrite(PIN_LED_3, HIGH);
    delay(TIEMPO_LED_ENCENDIDO);
    digitalWrite(PIN_LED_3, LOW);
    delay(TIEMPO_LED_APAGADO);

    digitalWrite(PIN_LED_2, HIGH);
    delay(TIEMPO_LED_ENCENDIDO);
    digitalWrite(PIN_LED_2, LOW);
    delay(TIEMPO_LED_APAGADO);
  }

  // Pausa de 3 segundos
  delay(3000);
}

Constantes

Si repasamos de arriba hacia abajo el Sketch, lo primero que no reconoceremos es el operador en las líneas que se ven así:

#define PIN_LED_1 6
#define PIN_LED_2 5
#define PIN_LED_3 4
#define PIN_LED_4 3
#define PIN_LED_5 2

#define TIEMPO_LED_ENCENDIDO 500
#define TIEMPO_LED_APAGADO 50

#define REPETICIONES_RUTINAS 5

Y es interesante ver que tenemos varias líneas similares o al menos que empiezan de la misma manera. A este tipo de instrucciones las denominamos constantes o definición de constantes (define en Inglés). Las constantes son especialmente útiles para manejar datos que deben especificarse literalmente (como el pin que usaremos) y que son más fáciles de leer. Por ejemplo, una constante PIN_LED_1 explica con el mismo nombre que nos referimos al PIN del led 1 de nuestro proyecto, independientemente del pin al que dicho led esté conectado.

Otra ventaja es que si usamos una constante para referirnos al pin que usamos y luego queremos cambiar el pin, solo deberíamos cambiar el número al que hace referencia la constante. En nuestro caso, las primeras 5 líneas definen los pines de los 5 leds que conectamos. El led 1 al pin 6, el 2 al pin 5 y así sucesivamente. Si desean hacer la prueba de cambiar algún led de pin (o todos) pueden intentarlo y cambiar el Sketch para que concuerde. Nada debería cambiar en cuanto al resultado final.

Finalmente, también definimos constantes para el tiempo en que los leds estarán encendidos (es el mismo para todos los leds) que es de 0,5 segundos. Y el tiempo que los leds estarán apagados (también el mismo para todos los leds) que es de 50 milisegundos. Y por último cuántas veces repetimos la rutina que armamos. Ustedes también pueden cambiar estos valores para probar distintas combinaciones.

Estructuras de control: for

Las estructuras de control nos permiten decirle a nuestro Arduino que tome ciertas decisiones o que realice acciones bajo ciertas condiciones. En nuestro código tenemos una primera estructura de control del grupo “bucles”, y es lo que ven en la línea:

for (int x=0; x<REPETICIONES_RUTINAS; x++) {

El for() (como lo denominaremos de ahora en adelante) es un tipo de instrucción de control que nos permite repetir una o varias instrucciones bajo ciertas condiciones. Debido a que su función primaria es repetir acciones, es el porque se la incluye en el grupo “bucles”. Las posibilidades de la instrucción for() son muchísimas pero limitaremos por ahora su explicación a la repetición de acciones.

Si observan cuidadosamente, verán que al final de la instrucción incluimos una llave abierta. Todas las instrucciones que estén luego de esta llave abierta y antes de la llave de cierre (que si o si deberemos tener) serán las que se repetirán. En nuestro caso se repetirán 5 veces ya que la constante REPETICIONES_RUTINAS es igual a 5.

Para completar nuestra explicación de hoy sobre for() diremos que dentro de los paréntesis (luego de la palabra for) van 3 parámetros separados por punto y coma ‘ ; ‘. El primero se ejecuta una sola vez antes de que comiencen las repeticiones (inicialización). El segundo es una expresión lógica (es decir, una expresión que se evaluará por verdadero o falso) que nos indicará si debemos ejecutar o no lo que se encuentra dentro de las llaves. El tercero es una acción que se ejecutará con cada ejecución (iteración de ahora en más) y que ocurrirá al finalizar la ejecución de las instrucciones dentro de las llaves.

Nuestra instrucción for() evaluada paso a paso

Veamos nuestro ejemplo paso a paso.

  1. int x=0 – Inicializa una variable con el valor 0 (cero). Una variable es similar a una constante en el sentido en que representa un valor, pero a diferencia de la constante el valor de una variable puede cambiar durante la ejecución. En este caso, el nombre de la variable es x. Por tanto lo que ocurrirá antes de que se ejecuten las instrucciones dentro del for() (dentro de las llaves), es que se creará esa variable y se la inicializará con el valor 0.
  2. x<REPETICIONES_RUTINAS – Como vimos REPETICIONES_RUTINAS es una constante y su valor es 5. Por lo tanto la expresión anterior es equivalente a x<5. Lo que significa x menor que 5. Y como vimos antes, el resultado de la expresión nos dirá si las instrucciones dentro de las llaves deben ejecutarse o no. El resultado de x<5 que es equivalente en esta primera instancia a 0<5 (ya que x es igual a 0), es verdadero, y por lo tanto las instrucciones dentro de las llaves se ejecutan.
  3. x++ – Luego de la ejecución inicial de las instrucciones dentro de las llaves, se ejecuta el tercer parámetro que es x++ y que es una expresión matemática que significa incrementar el valor de x en 1. Como x era igual a 0, luego de incrementarlo en 1 será igual a 1.
  4. Lo que sigue es repetir el punto 2 y 3, pero ahora con x = 1.
  5. Luego de haber repetido los puntos 2 y 3 5 veces, x = 5 y al volver al punto 2 ya x<5 no se cumple porque quedará 5<5 y eso es falso.

El resto del programa

El resto del programa que no evaluamos es simplemente el uso de instrucciones que ya aprendimos en instructivos anteriores. Si no recuerda qué hacen recomendamos repasar los mismos. Como tarea para fijar los conocimientos adquiridos les dejamos una tarea:

Tarea: Modifique el Sketch original para que los leds se prendan de afuera hacia el centro y luego hacia afuera nuevamente. Es decir, 1 y 5 primero, 2 y 4 después, luego solo 3, luego 2 y 4 nuevamente. Haga que la rutina se repita 3 veces (en lugar de 5). Finalice haciendo una pausa de 5 segundos (en lugar de 3)

¿Qué sigue?

Una vez que domine las salidas digitales podremos pasar a ver las entradas digitales. Les dejo enlace al siguiente instructivo: http://www.arduinohobby.com/entradas-digitales/

Deja un comentario