Descripción:

Cuando se requiere de realizar múltiples acciones o tareas al mismo tiempo,en este proyecto se muestran tres posibles formas de trabajar múltiples tareas en un Arduino UNO, Cada una con ventajas y desventajas, todas proporcionan opciones para diversos casos de uso.


Contenido/Competencias:

  • Tareas programadas
  • Eventos por interrupciones
  • Tareas usando un Sistema Operativo

El Plan:

Para notar las diferencias de estos tres métodos, en los tres casos se realizan las mismas tareas. Las funciones para comparar son dos tareas básicas:

  • Encender y apagar un led a intervalos constantes de tiempo
  • Controlar el encendido y apagado con un botón

Hardware:

Descripción Cantidad Notas
Arduino UNO 1 Compatible
Cables Varios
Botón 1
LED 4

Software:

  • Arduino IDE o Editor de preferencia
  • Librerías FreeRTOS
  • Arduino UNO o Simulador (Proteus VSM, TinkerCAD)

Recursos:


Diagrama

Diagrama para pruebas

Desarrollo:

Tareas Programadas

La primer forma que se prueba es programando las tareas manualmente, acomodando los tiempos y la secuencia de eventos.

/\* Dr. Carlos Fco. Alvarez Salgado  
\* Programa para demostrar funcionamiento de un dispositivo sencillo  
\* en diferentes formas de programacion para multiples tareas  
\*  
\* Programacion Lineal y secuencial  
\*  
\*/  
const int pinBoton=2;  
const int salidaBoton=3;  
const int salida\_blink=4;  
const int tiempo=500;

void setup() {  
pinMode(salida\_blink,OUTPUT);  
pinMode(salidaBoton,OUTPUT);  
pinMode(pinBoton,INPUT\_PULLUP);  
}

void loop() {  
// Tareas en Multiprogramacion

// Tarea 1: Encender y Apagar led por tiempo  
digitalWrite(salida\_blink,HIGH);  
delay(tiempo);  
digitalWrite(salida\_blink,LOW);  
delay(tiempo);

// Tarea 2: controlar la entrada con el boton 0  
digitalWrite(salidaBoton,!digitalRead(pinBoton));  
}

Ventajas:

  • Sencillo para programar
  • recursos controlados y administrados por el programador
  • Tamaño de código pequeño

Desventajas:

  • El programador necesita administrar los tiempos de cada evento
  • Es difícilmente escalable en proyectos grandes
  • interacción con el usuario puede ser no muy amigable

Tareas y Eventos por interrupciones

La segunda forma que se prueba es programando el evento del botón en una interrupción mientras la tarea de encender y apagar trabaja en el plano principal.

/\* Dr. Carlos Fco. Alvarez Salgado  
\* Programa para demostrar funcionamiento de un dispositivo sencillo  
\* en diferentes formas de programacion para multiples tareas  
\*  
\* 02\_Interrupciones: Programacion Lineal y secuencial con interrupciones  
\*  
\*/  
const int pinBoton=2;  
const int salidaBoton=3;  
const int salida\_blink=4;  
const int tiempo=500;

void atencion\_de\_interrupcion(){  
// Tarea 2: controlar la entrada 3 con el boton 0  
digitalWrite(salidaBoton,!digitalRead(pinBoton));  
}

void setup() {  
pinMode(salidaBoton,OUTPUT);  
pinMode(salida\_blink,OUTPUT);  
pinMode(pinBoton,INPUT\_PULLUP);  
attachInterrupt(digitalPinToInterrupt(pinBoton), atencion\_de\_interrupcion, CHANGE);  
}

void loop() {  
// Tareas en Interrupciones de Hardware

// Tarea 1: Encender y Apagar led 4 por tiempo  
digitalWrite(salida\_blink,HIGH);  
delay(tiempo);  
digitalWrite(salida\_blink,LOW);  
delay(tiempo);  
}

Ventajas:

  • Sencillo para programar
  • recursos controlados y administrados por el programador
  • Tamaño de código pequeño

Desventajas:

  • El programador necesita administrar los tiempos de cada evento
  • Es moderadamente escalable en proyectos grandes
  • interacción con el usuario puede ser no muy amigable
  • Limita la cantidad de interrupciones por tareas

Tareas usando FreeRTOs

La ultima forma que se prueba es programando tareas en un sistema operativo, esta es una de las mejores opciones si se trata de tener varias tareas simultaneas.

/\* Dr. Carlos Fco. Alvarez Salgado  
\* Programa para demostrar funcionamiento de un dispositivo sencillo  
\* en diferentes formas de progrmacion para multiples tareas  
\*  
\* 03\_FreeRTOS\_Task: Programacion por tareas en FreeRTOS  
\*  
\*/

#include

// definir tareas  
void TaskBlink( void \*pvParameters );  
void TaskBotonLED( void \*pvParameters );

const int pinBoton=2;  
const int salidaBoton=3;  
const int salida\_blink=4;  
const int tiempo=(500/portTICK\_PERIOD\_MS);

void setup() {  
// Configura y corre tareas  
pinMode(salida\_blink,OUTPUT);  
pinMode(salidaBoton,OUTPUT);  
pinMode(pinBoton,INPUT\_PULLUP);

xTaskCreate(TaskBlink,"Blink",128,NULL,2,NULL); // Tarea 1  
xTaskCreate(TaskBotonLED,"BotonLED",128,NULL,2,NULL); //Tarea 2  
}

// Tareas  
void TaskBlink( void \*pvParameters ){  
for (;;)  
{  
digitalWrite(salida\_blink,HIGH);  
vTaskDelay( tiempo);  
digitalWrite(salida\_blink,LOW);  
vTaskDelay( tiempo);  
}  
}

void TaskBotonLED( void \*pvParameters ){  
for (;;)  
{  
digitalWrite(salidaBoton,!digitalRead(pinBoton));  
}  
}

void loop() {  
// Nada que hacer.  
}

Ventajas:

  • Sencillo para programar
  • recursos controlados y administrados por FreeRTOS
  • Código mas robusto

Desventajas:

  • Necesario aprender a programar con FreeRTOS
  • Mayor consumo de recursos

Conclusiones:

Existen diversas formas de trabajar con múltiples tareas con arduino, estas son algunas, dependiendo de la necesidad del proyecto podemos adaptar alguna o una combinación de estas formas de manejar múltiples tareas y eventos.