Implementar FreeRTOS con Arduino IDE en ESP32

Implementar FreeRTOS con Arduino IDE en ESP32

marzo 22, 2022

Demos-FreeRTOS-with-Arduino-IDE-on-ESP32
En este tiempo, implementaremos FreeRTOS con Arduino IDE en la pantalla táctil TFT ESP32. Aprenderá 2 demostraciones simples de FreeRTOS.

Un sistema operativo en tiempo real (RTOS) está destinado a cumplir con los requisitos de las aplicaciones en tiempo real. Procesa los datos a medida que llegan, generalmente sin retrasos en el almacenamiento en búfer. Hay muchos RTOS famosos como el LynxOS, RTLinux, VxWorks, FreeRTOS, OSE, QNX, Windows CE, que pretenden diferentes aplicaciones. De estos RTOS,FreeRTOSestá especialmente diseñado para microcontroladores, porque los microcontroladores vienen con recursos limitados, por lo tanto, necesitamos un sistema operativo según los recursos disponibles de los microcontroladores. FreeRTOS es un kernel de código abierto que significa que puede descargarse de forma gratuita y usarse en aplicaciones basadas en RTOS.

Suerte que el ESP32 y el IDE de Arduino soportan bien el FreeROTS. Cuando escribimos software embebido de pequeño tamaño para Arduino no necesitamos ningún ROTS, pero cuando su complejidad y tamaño aumenta FreeRTOS siempre es beneficioso, al usar FreeRTOS, podemos asegurarnos de que cada tarea de Arduino tenga un patrón de ejecución determinista y cada tarea cumpla con su plazo de ejecución. En otras palabras, es un programador que asigna recursos de CPU Arduino a cada tarea de acuerdo con un algoritmo de programación.

En este artículo, usaremos Arduino IDE para programarPantalla TFT Makerfabs ESP32 de 3,5 pulgadascon FreeRTOS, er, un comienzo simple y fácil para los estudiantes, y también para mí. Este módulo se basa en la pantalla ESP32 3.5 "SPI con Touch, con un montón de ruptura GPIO para uso externo, por lo que es muy adecuado para este aprendizaje.

ESP32-TFT-Touch-Screen-MakerfabsESP32-TFT-Touch-Screen-Makerfabs-1

IDE de Arduino:

● Descargue e instale el IDE de Arduino 1.8.19;
● Instale la biblioteca ESP32 enRellenar -->Preferencias-->URL adicionales del administrador de tableros://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Instalar la biblioteca ESP32

● Luego en elHerramientas--> Gerente de la Junta, busque el ESP32 e instale:
Gerente de la Junta

● Debería tomar unos minutos instalarlo, después de la instalación, debería poder encontrar el "módulo de desarrollo ESP32" enHerramientas->ESP32 Arduino, y también los puertos enHerramientas: puertos >.
Demo1-Arduino

● Y finalmente, descargue e instale la biblioteca de pantallas Makerfabs de 3.5 "pulgadasLovyanGFXenHerramientas: > Administrador de bibliotecas.
Biblioteca-Gerente

FreeRTOS Demo_1

El control de LED es principalmente la tarea más fácil para un controlador, que controlamos el LED On / Off pordigitalWrite()yretraso()para controlar su tiempo de encendido / apagado cuando comenzamos a aprender a programar. Pero comoretraso()suspendido el controlador, en trabajos reales, para el control de múltiples LED, usamos temporizadores / interrupciones para controlar su tiempo de encendido / apagado. Cuando hay varios LED con diferentes modos de control, esto podría ser complejo y hacer que todo el código no sea legible.

Con FreeRTOS, podemos dejarlo claro. En este ejemplo, controlaremos 4 canales LED (A / B / C / D), el A / B actúa como un LED de respiración con diferentes frecuencias y C / D actúa como un LED simple, con diferentes modos. Además, la pantalla de 3,5 pulgadas actúa como un temporizador, con control táctil.

1. En la configuración, se utilizó xTaskCreatePinnedToCore() para crear una tarea:

FreeRTOS-Demo1-Create-a-Task
void setup()
{
    Serial.begin(115200);

pinMode(LCD_CS, SALIDA);

SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);

xTaskCreatePinnedToCore(Task_TFT, "Task_TFT", 4096, NULL, 3, NULL, ARDUINO_RUNNING_CORE);
    xTaskCreatePinnedToCore(Task_Count, "Task_Count", 2048, NULL, 1, NULL, ARDUINO_RUNNING_CORE);
    xTaskCreatePinnedToCore(Task_GPIO_1, "Task_GPIO_1", 2048, NULL, 2, NULL, ARDUINO_RUNNING_CORE);
    xTaskCreatePinnedToCore(Task_GPIO_2, "Task_GPIO_2", 2048, NULL, 2, NULL, ARDUINO_RUNNING_CORE);
    xTaskCreatePinnedToCore(Task_GPIO_3, "Task_GPIO_3", 2048, NULL, 2, NULL, ARDUINO_RUNNING_CORE);
    xTaskCreatePinnedToCore(Task_GPIO_4, "Task_GPIO_4", 2048, NULL, 2, NULL, ARDUINO_RUNNING_CORE);
}

xTaskCreatePinnedToCore(TaskFunction_t pvTaskCode, const char *constpcName, const uint32_t usStackDepth, void *constpvParameters, UBaseType_t uxPriority, TaskHandle_t *constpvCreatedTask, const BaseType_t xCoreID):

Parámetros:
pvTaskCode:Puntero a la función de entrada de tareas.
pcName:Un nombre descriptivo para la tarea, utilizado principalmente para facilitar la depuración.
usStackDepth:El tamaño de la pila de tareas se especifica como el número de bytes.
pvParámetros:Puntero que se utilizará como parámetro para la tarea que se está creando.
uxPrioridad:La prioridad con la que debe ejecutarse la tarea.
pvCreatedTask:Se utiliza para devolver un identificador mediante el cual se puede hacer referencia a la tarea creada.
xCoreID:Los valores 0 o 1 indican el número de índice de la CPU a la que se debe anclar la tarea, ESP32 tiene 2 núcleos. Utilice ARDUINO_RUNNING_CORE de forma predeterminada.


Devolución:
pdPASS si la tarea se creó correctamente y se agregó a una lista lista, de lo contrario se define un código de error en el archivo projdefs.h

En nuestros códigos, se crearon un total de 6 tareas:
Task_TFT:para la pantalla & Touch;
Task_Count:para contar;
Task_GPIO_1(2/3/4):para 4 LEDs de control;

2. Y en la definición de la tarea, definimos la tarea detallada:
void Task_GPIO_1(void *pvParameters)
{
    (void)pvParameters;

ledcAttachPin(PIN_A, 0); asignar pines LED RGB a los canales
    ledcSetup(0, 1000, 8);   PWM de 1 kHz, resolución de 8 bits

mientras que (1) // Una Tarea nunca volverá ni saldrá.
    {
        for (int i = 0; i = 0; i -= 16)
        {
            ledcWrite(0, i);
            vTaskDelay(LED_FRESH_TIME);
        }
    }
}
En este código, se utilizó vTaskDelay():
void vTaskDelay(const TickType_t xTicksToDelay):
Retrasar una tarea para un número determinado de ticks. El tiempo real que la tarea permanece bloqueada depende de la tasa de ticks. En comparación con Arduino Delay(), no suspende el controlador, sino que simplemente retrasa la tarea. Por lo tanto, el controlador no se detiene allí ni espera, solo va a otras tareas, y a medida que avanza el tiempo establecido, el controlador regresa para continuar con esta tarea.

Para obtener el código completo, consulte//github.com/Makerfabs/ESP32-RTOS.

Conecte 4 LED (con resistencia, como 100 ohmios) en serie conectados a los pines de conexión de pantalla ESP32 de 3.5 "5/18/19/21, y descargue el boceto a la placa de visualización Makerfabs ESP32 de 3.5 ":

ESP32-TFT-Touch-Screen-4-LEDs

Verá que los LED parpadean y la pantalla cuenta con el toque de parada / inicio. Con un osciloscopio, también puede verificar que la señal esté limpia y a tiempo;
FreeRTOS-Demo1-con-ESP32-TFT-Touch-Screen

FreeRTOS Demo_2

MakerfabsExpansión del ambiente interiorestá dedicado al monitoreo de CO2 / TVOC / temperatura, se puede conectar directamente a los pines de conexión de pantalla ESP32 3.5 ".
FreeRTOS-Demo2

Lo mismo que el Demo_1, ensetup(), allí creamos 4 tareas:
*La librería Adafruit SGP30 y la biblioteca de sensores DHT deben instalarse con antelación*

ibrary-Manager-SGP30
 
DHT-Sensor-Library
 
void setup()
{
    Serial.begin(115200);

pinMode(LCD_CS, SALIDA);

SPI.begin(SPI_SCK, SPI_MISO, SPI_MOSI);
    Wire.begin(I2C_SDA, I2C_SCL);

xTaskCreatePinnedToCore(Task_TFT, "Task_TFT", 4096, NULL, 3, NULL, ARDUINO_RUNNING_CORE);
    xTaskCreatePinnedToCore(Task_DHT11, "Task_DHT11", 2048, NULL, 2, NULL, ARDUINO_RUNNING_CORE);
    xTaskCreatePinnedToCore(Task_SGP30, "Task_SGP30", 2048, NULL, 1, NULL, ARDUINO_RUNNING_CORE);
    xTaskCreatePinnedToCore(Task_BUZZ, "Task_BUZZ", 2048, NULL, 1, NULL, ARDUINO_RUNNING_CORE);
}

FreeRTOS-Demo2-Task

4 valores globales definidos:
int humidity_value = 0;
int temperature_value = 0;
int tvoc_value = 0;
int co2_value = 0;
Y luego Task_TFT/ Task_DHT11/ Task_SGP30/ Task_BUZZ iniciado.
...
xTaskCreatePinnedToCore(Task_SGP30, "Task_SGP30", 2048, NULL, 1, NULL, ARDUINO_RUNNING_CORE);...
...
En la definición de la tarea, allí el SGP30/DHT11 se comunica con ESP32, y el resultado se calculó, y luego se estableció en el parámetro de globo, para su visualización. Y el zumbido se controla por separado:
...
xTaskCreatePinnedToCore(Task_SGP30, "Task_SGP30", 2048, NULL, 1, NULL, ARDUINO_RUNNING_CORE);...
...
En la definición de la tarea, allí el SGP30/DHT11 se comunica con ESP32, y el resultado se calculó, y luego se estableció en el parámetro de globo, para su visualización. Y el zumbido se controla por separado:
void Task_SGP30(void *pvParameters)
{
    (void)pvParameters;

if (!sgp.begin())
    {
        mientras que (1)
        {
            Serial.println("SGP30 no encontrado.");
            vTaskDelay(5000);
        }
    }

mientras que (1)
    {
        int humedad = humidity_value;
        int temperatura = temperature_value;

sgp.setHumidity(getAbsoluteHumidity(temperatura, humedad));

Si (!sgp. IAQmeasure())
        {
            Serial.println("Error de medición");
            continuar;
        }
        Serial.print("TVOC ");
        Serial.print(tvoc_value = sgp. TVOC);
        Serial.print(" ppb\t");
        Serial.print("eCO2 ");
        Serial.print(co2_value = sgp.eCO2);
        Serial.println(" ppm");

vTaskDelay(500);
    }
}
El código completo disponible en://github.com/Makerfabs/ESP32-RTOS
FreeRTOS-Demo2-on-ESP32-Screen

Con FreeRTOC, la lógica de Arduino se vuelve más clara y ordenada, especialmente cuando los proyectos se vuelven complejos. Por supuesto, la multitarea es solo el primer paso de FreeRTOS, hay muchas otras especificaciones, como el búfer de buzón / anillo, que facilitarían la programación del ESP32 con el IDE de Arduino. Un buen lugar para aprender más en://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/freertos.html

Si tiene más preguntas sobre Implementar FreeRTOS con Arduino IDE en pantalla TFT ESP32, o necesita algunasSoluciones PCBA llave en mano, póngase en contacto conservice@makerfabs.com.corazón

Contáctenos