Site icon AranaCorp

Programmer un ESP32 avec VSCode et ESP-IDF

Dans ce tutoriel, nous allons voir comment programmer un ESP32 à l’aide de l’environnement ESP-IDF avec VSCode. ESP-IDF ou Espressif IoT Development Framework, est l’environnement officiel de programmation des ESP32 et permet la programmation d’application de qualité en C et C++.

ESP-IDF vs ESP Arduino Core

Nous avons vu dans un précédent article comment programmer un NodeMCU ESP32 avec Arduino IDE. L’environnement ESP Arduino a été développé pour simplifier la programmation des ESP32. Elle permet aux débutants et amateurs, déjà utilisateurs des Arduino, d’utiliser les mêmes outils pour le développement de projets basés sur des ESP32. Toutefois, il faut rappeler que l’Arduino IDE utilise une version simplifiée et incomplète du langage C/C++ ce qui peut limiter les fonctionnalités et performances du code développé à l’aide de cet outil.

L’environnement ESP-IDF, quant à lui, est totalement compatible avec les standards C/C++ et propose un ensemble de librairies et de fonctionnalités spécifiques pour le développement d’objets connectés avec ESP32.

ESP-IDF propose également une compatibilité avec toutes les versions de microcontrôleur ESP32.

Installation et configuration de VSCode

Téléchargez et installez VSCode

Rechercher et installer l’extension ESP-IDF pour VSCode qui contient des librairies et configuration de base pour la programmation d’ESP32

Une fois l’extension installée, vous pouvez la configurer avec la palette de commande. Dans le menu, View>Command Palette…, cherchez « ESP-IDF Configure ». Sélectionner la version d’ESP-IDF à installer. La configuration installera les modules suivants:

Configurer un projet pour ESP32

Pour charger votre premier code, vous pouvez utiliser l’exemple Blink

Sélectionnez View -> Command Palette… et entrez ESP-IDF: Show Examples Projects. Sur la page qui s’ouvre, trouvez et appuyez sur le bouton Show Examples. Il vous sera alors demandé de sélectionner le framework installé précédemment.

Dans la liste des exemples, vous pouvez ensuite sélectionner Blink et appuyer sur le bouton « Create project using example Blink »

Vous pouvez également créer un nouveau projet. ESP-IDF: New Project . Sélectionner ensuite Extensions>template-app pour un projet vierge. Le fichier main se trouve sous myproject/main/main.c

N.B.: avec le templae arduino-as-a-component, vous pouvez écrire avec le langage Arduino dans le framework ESP-IDF

Voici un exemple Hello world, pour tester la configuration du projet.

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"

static const char *TAG = "myproject example";

void app_main(void)
{

    while (1) {
        ESP_LOGI(TAG, "Hello World!");
 
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }

}

Lorsque les fichiers du projet sont édités, vous pouvez suivre les étapes suivantes pour configurer le projet

Pour sélectionner le type et la carte utilisée. Dans Command Palette, entrez Set Espressif device target. Dans notre cas, ESP32-WROOM-32, esp32 puis ESP32 chip (via ESP USB bridge).

N.B.: une fois la carte sélectionnée, vous pourrez utiliser les librairies de base

Sélectionner le port série à l’aide de la commande ESP-IDF: Select port to use (COM, tty, usbserial)

Compiler, téléverser le code sur un ESP32

Une fois le projet configuré et le code créé, nous allons suivre un certain nombres d’étapes pour pouvoir téléverser le code sur la carte ESP32:

Il est possible de combiner les 3 dernières commandes avec ESP-IDF: Build, Flash and start a Monitor on your device

Maintenant que l’environnement de programmation est prêt, vous pouvez compiler le programme. Dans Command Palette, rechercher ESP-IDF: Build your project.

Pour flasher le programme sur la carte, vérifier le port série sélectionné puis flasher le code ESP-IDF: Flash your project. Dans notre cas, la programmation se fait par le port USB, nous utilisons donc le mode UART.

Une fois le code téléverser, vous pouvez observer les sorties sur le port série à l’aide du moniteur ESP-IDF: Monitor your device

Ajouter des librairies à votre code

Certaines librairies existent dans le framework ESP-IDF, pour trouver les composants disponibles vous pouvez entrer ESP-IDF: Show Component Registry dans Command Palette

Une fois votre composant trouvé, vous pouvez l’ajouter à votre projet en utilisant le bouton « install » ou la ligne de commande

idf.py add-dependency "espressif/button^3.2.0"

N.B.: une fois le composant installé, vous pouvez accéder à un exemple dans managed_components>espressif_button> examples

Vous pouvez alors développer votre propre code à partir de la librairie

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "iot_button.h"

#define BOOT_BUTTON_NUM         0 // boot button attached to GPIO0
#define BUTTON_ACTIVE_LEVEL     0

static const char *TAG = "myproject example";
int8_t btn_status=0;

const char *button_event_table[] = {
    "BUTTON_PRESS_DOWN",
    "BUTTON_PRESS_UP",
    "BUTTON_PRESS_REPEAT",
    "BUTTON_PRESS_REPEAT_DONE",
    "BUTTON_SINGLE_CLICK",
    "BUTTON_DOUBLE_CLICK",
    "BUTTON_MULTIPLE_CLICK",
    "BUTTON_LONG_PRESS_START",
    "BUTTON_LONG_PRESS_HOLD",
    "BUTTON_LONG_PRESS_UP",
};

static void button_event_cb(void *arg, void *data)
{
    ESP_LOGI(TAG, "Button event %s (%d)", button_event_table[(button_event_t)data],(button_event_t)data);
    switch ((button_event_t)data){
        case 4:
            ESP_LOGI(TAG, "Execute code if single click");
            break;
        case 5:
            ESP_LOGI(TAG, "Execute code if double click");
            break;
        default:
            //nothing
    }
}

void button_init(uint32_t button_num)
{
    button_config_t btn_cfg = {
        .type = BUTTON_TYPE_GPIO,
        //.long_press_time = CONFIG_BUTTON_LONG_PRESS_TIME_MS,
        //.short_press_time = CONFIG_BUTTON_SHORT_PRESS_TIME_MS,
        .gpio_button_config = {
            .gpio_num = button_num,
            .active_level = BUTTON_ACTIVE_LEVEL,
#if CONFIG_GPIO_BUTTON_SUPPORT_POWER_SAVE
            .enable_power_save = true,
#endif
        },
    };
    button_handle_t btn = iot_button_create(&btn_cfg);
    assert(btn);
    esp_err_t err = iot_button_register_cb(btn, BUTTON_PRESS_DOWN, button_event_cb, (void *)BUTTON_PRESS_DOWN);
    err |= iot_button_register_cb(btn, BUTTON_PRESS_UP, button_event_cb, (void *)BUTTON_PRESS_UP);
    err |= iot_button_register_cb(btn, BUTTON_PRESS_REPEAT, button_event_cb, (void *)BUTTON_PRESS_REPEAT);
    err |= iot_button_register_cb(btn, BUTTON_PRESS_REPEAT_DONE, button_event_cb, (void *)BUTTON_PRESS_REPEAT_DONE);
    err |= iot_button_register_cb(btn, BUTTON_SINGLE_CLICK, button_event_cb, (void *)BUTTON_SINGLE_CLICK);
    err |= iot_button_register_cb(btn, BUTTON_DOUBLE_CLICK, button_event_cb, (void *)BUTTON_DOUBLE_CLICK);
    err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_START, button_event_cb, (void *)BUTTON_LONG_PRESS_START);
    err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_HOLD, button_event_cb, (void *)BUTTON_LONG_PRESS_HOLD);
    err |= iot_button_register_cb(btn, BUTTON_LONG_PRESS_UP, button_event_cb, (void *)BUTTON_LONG_PRESS_UP);
    ESP_ERROR_CHECK(err);
}

void app_main(void)
{
    button_init(BOOT_BUTTON_NUM);

}

Lors de l’exécution du code, si vous appuyez une ou deux fois sur le bouton boot pour voir le code spécifique s’afficher

I (341) main_task: Returned from app_main()
I (3611) myproject example: Button event BUTTON_PRESS_DOWN (0)
I (3821) myproject example: Button event BUTTON_PRESS_UP (1)
I (4011) myproject example: Button event BUTTON_SINGLE_CLICK (4)
I (4011) myproject example: Execute code if single click
I (4011) myproject example: Button event BUTTON_PRESS_REPEAT_DONE (3)
I (12231) myproject example: Button event BUTTON_PRESS_DOWN (0)
I (12371) myproject example: Button event BUTTON_PRESS_UP (1)
I (12461) myproject example: Button event BUTTON_PRESS_DOWN (0)
I (12461) myproject example: Button event BUTTON_PRESS_REPEAT (2)
I (12601) myproject example: Button event BUTTON_PRESS_UP (1)
I (12781) myproject example: Button event BUTTON_DOUBLE_CLICK (5)
I (12781) myproject example: Execute code if double click
I (12781) myproject example: Button event BUTTON_PRESS_REPEAT_DONE (3)
I (14051) myproject example: Button event BUTTON_PRESS_DOWN (0)
I (14171) myproject example: Button event BUTTON_PRESS_UP (1)
I (14261) myproject example: Button event BUTTON_PRESS_DOWN (0)

Vous pouvez créer vos propres librairies en utilisant la commande ESP-IDF: Create New ESP-IDF component. Ceci va créer un dossier components/mycomponent dans lequel vous pourrez éditer les fichiers .h et .c.

Sources

Quitter la version mobile