FreeRTOS en Arduino
En este tutorial sobre FreeRTOS en Arduino, crearemos tres tareas mediante la función xTaskCreate, asignadas con diferentes prioridades para controlar 2 LEDs y leer el valor de un Potenciómetro: el primer led conectado al pin D4 parpadeará cada 500 ms, el segundo led conectado al pin D5 parpadeará cada 1000 ms, se leerá el canal analógico A0 y estos datos serán enviados por el puerto serial.
FreeRTOS (Free Real-Time Operating System) es un sistema operativo de tiempo real de código abierto que se utiliza en microcontroladores y microprocesadores para programación multitarea y gestión de recursos.
En Arduino, se puede usar FreeRTOS para programar de manera eficiente tareas en segundo plano mientras se ejecutan otras tareas en primer plano. FreeRTOS se puede integrar en el IDE de Arduino a través de una biblioteca y una placa compatible con FreeRTOS.
Para usar FreeRTOS en Arduino, se deben seguir los siguientes pasos:
- Instalar la biblioteca de FreeRTOS en el IDE de Arduino.
- Crear un archivo de configuración de FreeRTOS para definir las tareas y los recursos necesarios para ejecutarlas.
- Crear las tareas necesarias en el programa principal de Arduino.
- Compilar y cargar el programa en la placa de Arduino compatible con FreeRTOS.
Una vez que se han creado las tareas y se han definido los recursos necesarios para ejecutarlas, FreeRTOS se encarga de gestionar el tiempo y los recursos para asegurarse de que las tareas se ejecuten de manera eficiente y sin conflictos.
Materiales
- 1x Placa Arduino (Nano o Uno).
- 2x Diodo emisor de luz (Led).
- 1x Potenciómetro 10 Kohm.
- 2x Resistor 330 Ohm.
- 1x Protoboard.
- Cables de conexión.
Circuito
Sketch Arduino IDE
Recuerda que debes instalar la librería, la cual puedes encontrarla como FreeRTOS en el Gestor de Librerías del IDE Arduino ó puedes descargarla dando clic aquí.
#include <Arduino_FreeRTOS.h> // Definir las tareas para Blink y AnalogRead void TaskBlink1(void *pvParameters); void TaskBlink2(void *pvParameters); void TaskAnalogRead1(void *pvParameters); void setup() { Serial.begin(9600); // Configuracion de las tareas para que se ejecuten de forma independiente. // xTaskCreate(Tarea, "Nombre", TamanioDePila, NULL, Prioridad3max0min, NULL); xTaskCreate(TaskBlink1, "Blink1", 128, NULL, 2, NULL ); xTaskCreate(TaskBlink2, "Blink2", 128, NULL, 2, NULL ); xTaskCreate(TaskAnalogRead1, "AnalogRead1", 128, NULL, 1, NULL ); } void TaskBlink1(void *pvParameters) { (void) pvParameters; pinMode(4, OUTPUT); for (;;) { // Una tarea nunca regresará ni saldrá. digitalWrite(4, HIGH); vTaskDelay(500 / portTICK_PERIOD_MS); digitalWrite(4, LOW); vTaskDelay(500 / portTICK_PERIOD_MS); } } void TaskBlink2(void *pvParameters) { (void) pvParameters; pinMode(5, OUTPUT); for (;;) { digitalWrite(5, HIGH); vTaskDelay(1000 / portTICK_PERIOD_MS); digitalWrite(5, LOW); vTaskDelay(1000 / portTICK_PERIOD_MS); } } void TaskAnalogRead1(void *pvParameters) { (void) pvParameters; for (;;) { int ValorPotenciometro = analogRead(A0); Serial.println(ValorPotenciometro); vTaskDelay(1); } } void loop() { }
¿Cómo funciona el Sketch?
En este ejemplo, TaskBlink1 y TaskBlink2 tienen la prioridad más alta y TaskAnalogRead1 tiene la prioridad más baja. Por lo tanto, TaskBlink1 y TaskBlink2 se ejecutarán primero cuando la placa Arduino es encendida por primera vez. Por el contrario, TaskAnalogRead1 que es la tarea de menor prioridad se ejecutará al ultimo o cuando no exista otra tarea disponible para ejecutarse. Para la demostración, mire el siguiente video:
Enlaces de Descarga
Puedes descargar la Librería FreeRTOS dando clic aquí.