cursos de arduino barcelona y mexico

Arduino y las esperas

Curso de Arduino y sus shields en Barcelona
Curso de Arduino y sus shields en Barcelona

Uno de los recursos de programación más utilizados en el mundo de habla hispana ( México, España, Colombia, Perú, Chile, Argentina ) es la implementación de esperas. Gracias a su uso, podemos gestionar interruptores, LEDs indicadores y un sinfin de aplicaciones. Arduino, nos facilita éste recurso de una forma sencilla e inteligible mediante el comando delay(ms), siendo ms la espera en milisegundos que deseamos implementar. Por ejemplo, la ejecución de la instrucción delay(1000) detiene el flujo del programa durante 1 segundo. Fácil no?

Sin embargo, éste tipo de espera tiene grandes inconvenientes:

  1. Consume tiempo de CPU sin realizar ninguna operación
  2. Dificulta la implementación de procesos concurrentes debido al bloqueo del flujo del programa
  3. Impide la atención de eventos asíncronos
  4. Incrementa el tiempo del bucle principal o función loop()

El nombre técnico para definir a éste tipo de espera es 'Activa' (o Busy Waiting) y, desde mi punto de vista, el mayor
inconveniente en el desarrollo con Arduino es el bloqueo de eventos asíncronos.

Por ejemplo, el tomemos el siguiente código del ejemplo básico de parpadeo de un LED:

void loop() {
   digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
   delay(1000);               // wait for a second
   digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
   delay(1000);               // wait for a second
}

Está claro, el LED estará encendido durante un segundo, se apagará durante otro segundo, y así sucesivamente...


Ahora, imaginemos que queramos interrumpir el parpadeo mediante un evento externo (por ejemplo, mediante un pulsador
conectado al pin 2 del Arduino Uno). Entonces podemos escribir la siguiente rutina:

void loop() {
   // read the state of the pushbutton value:
   BlinkOn = digitalRead(buttonPin);
  
   if(BlinkOn){
      digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(1000);               // wait for a second
      digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
      delay(1000);               // wait for a second
   }
}

El código anterior hará un parpadeo (Blink) si no se realiza ninguna pulsación. De modo contrario, si realizamos una pulsación, deberíamos
ver que el LED no se enciende ni se apaga ya que BlinkOn es igual a 0. La pregunta es, cuándo podemos realizar la pulsación? Pues cuando queramos (evento asíncrono). Pero qué pasa si pulsamos durante la ejecución de los delays? Como se trata de una espera bloqueante, simplemente no hará caso de la pulsación y esperará hasta la finalización de la espera. En el peor de los casos tendremos que esperar 2 segundos hasta que el bucle vuelva a pasar por la lectura del pulsador!! Esto empeora si el tiempo de los delays se incrementa.

La solución pasa por implementar un sistema de eventos por interrupciones de Timer. Para ello Arduino ofrece una librería que
podemos descargar en éste enlace. Una vez la hayamos instalada, podremos realizar varios ejemplos disponibles para verificar su correcto funcionamiento y evitar el bloqueo de las esperas activas.

 

Share your thoughts