(Multitasking) Múltiples Tareas en Arduino sin usar la función delay()

Luis Miguel Báez
3 min readAug 6, 2019

--

(Multitasking) Múltiples Tareas en Arduino sin usar la función delay()

Los algoritmos multitarea son algoritmos que permite la ejecución de varios procesos que se ejecuten teóricamente al mismo tiempo usando uno o mas procesadores, generalmente estos algoritmos son usados en los Sistemas Operativos ya que en estos se necesita ejecutar muchos programas paralelamente.

En Arduino generalmente se es necesario implementar este tipo de algoritmos ya que esta placa no cuenta con ningún tipo de sistema operativo que controle dicho paralelismo y generalmente es obligatorio programarlo.

Este Tutorial tiene un enfoque practico y por tanto vamos a dar un ejemplo de la estructura del problema que vamos a solucionar:

En la funciónloop()se hace el llamado a 3 funciones las cuales cada una representa una tarea que el sistema debe ejecutar paralelamente, pero tenemos un pequeño problema y es que el compilador de Arduino ejecuta las funciones secuencialmente es decir (una después de la otra) y con esto no estamos logrando el paralelismo que queremos, ¿Entonces qué hacemos?

Una solución posible es usando una herramienta que tienen todos los procesadores de cualquier computadora o tarjeta programable, esta es el ciclo de CPU el cual es un pulso electromagnético que es generado por un oscilador (circuito eléctrico dentro del procesador) que está presente en cualquier procesador. Este oscilador es el que proporciona la velocidad del procesador y es el que define el ritmo de pulsos del reloj del procesador, este oscilador proporciona un ritmo constante y generalmente se utiliza para ir llevando la cuenta del tiempo (Hora del reloj).

Las señales de este oscilador la podemos obtener mediante una función nativa de Arduino llamada millis() la cual nos proporciona la hora en milisegundos y con esto podemos hacer que una tarea se ejecute durante un periodo determinado como se va a mostrar en un ejemplo a continuación.

En este bloque de código se especifica la estructura que nos va a brindar la multitarea, la variable period guarda un numero en milisegundos en el cual se va a ejecutar esa tarea en este caso 200 milisegundos entonces la tarea se ejecuta durante 200 milisegundos y descansa 200 milisegundos y así iterativamente, la variable previousMillis tiene una función de contador y se va incrementando hasta que dicho contador supere el valor de la variable period, esta variable solo se va incrementado siempre y cuando este en el estado en el que el periodo sea menor que la diferencia entre el tiempo actual (millis()) y previousMillis , que es el tiempo en el que se ejecuta la tarea. Ya habiendo explicado la estructura que nos permite el paralelismo vamos a resolver el problema propuesto al inicio y para esto el siguiente código:

Este código es la solución del problema planteado al inicio, en el cual hay tres funciones que representan cada uno una tarea y la cual la queremos ejecutar con periodos distintos y de forma paralela sin importar el orden en que se llamaron las funciones.

--

--

Luis Miguel Báez

Soy un entusiasta de la ciencia y la tecnologia, me gusta compartir contenido sobre ello. Estudiante de Ingenieria de Sistemas y Computación en la UNAL.