Наиболее фундаментальным процессом в любой разработке встроенных систем является использование выводов GPIO (универсальных входов/выходов). В этом руководстве мы изучим выводы GPIO ESP32 и как запрограммировать их в качестве цифровых выходов. В качестве демонстрации мы создадим проект мигания светодиода ESP32 в VS Code с расширением ESP-IDF. Проект позволит читателям понять, как настроить выводы GPIO ESP32 в качестве выходных на очень простом примере. Итак, начнём!
Прежде чем продолжить, убедитесь, что у вас установлена последняя версия VS Code и настроено расширение ESP-IDF:
- Установка ESP32 ESP-IDF на Windows и его интеграция с Visual Studio Code
- Установка ESP32 ESP-IDF на Linux Ubuntu
Также про основы работы с ESP-IDF и реализацию проекта мигания светодиодом с его помощью вы можете посмотреть в следующей статье — архитектура и основы программирования ESP32-S3 с помощью ESP-IDF.
Ради интереса вы также посмотреть как намного проще реализуется проект мигания светодиода в ESP32 с помощью Arduino IDE
Введение в GPIO
Универсальные выводы ввода/вывода (GPIO) в сокращенном виде обозначаются как цифровые сигнальные контакты микроконтроллеров, которые могут использоваться как для ввода, так и для вывода, или даже для одновременного использования в обоих режимах. Пользователи могут управлять ими во время выполнения программы.
Контакты GPIO ESP32
Плата разработки ESP32 выпускается в различных моделях с разным количеством выводов GPIO. На рассматриваемой нами плате имеется 36 выводов GPIO. Мы можем использовать выводы в их конфигурации по умолчанию или даже изменить их в программном коде. Выводы GPIO для ESP32 DEVKIT V1 показаны на схеме ниже в их конфигурации по умолчанию.
48 выводов GPIO на микросхеме ESP32, используемой в этой плате, недоступны для подключения через платы разработки. Это означает, что не все выводы GPIO отображаются в схеме расположения контактов. ESP32 Devkit поддерживает 36 выводов GPIO, хотя не все из них могут использоваться в качестве цифровых выходных контактов. Только 24 из 30 выводов могут использоваться как для цифрового ввода, так и для вывода, из которых GPIO34-GPIO39 могут использоваться только в качестве входных контактов.
Примечание: в ESP32 DEVKIT контакты GPIO6 не подключены к GPIO11. Это связано с тем, что эти контакты внутренне соединены со встроенной SPI-флэш-памятью микросхемы ESP-WROOM-32.
API ESP-IDF GPIO для мигания светодиода
Прежде чем двигаться дальше, давайте обсудим некоторые важные функции, необходимые для программирования GPIO в рамках этого проекта.
ESP-IDF предоставляет библиотеку driver/gpio.h, которая содержит полезные функции для управления цифровыми входными и выходными контактами ESP32. Для этого проекта нам потребуется настроить порт GPIO как выходной порт, а затем установить его уровень. Давайте посмотрим, как это будет сделано.
Первым шагом является подключение заголовочного файла:
|
1 |
#include "driver/gpio.h" |
Задание направления работы контакта
Далее, чтобы настроить порт GPIO как вход или выход, мы будем использовать функцию gpio_set_direction(). Она принимает два аргумента. Первый аргумент — это контакт GPIO, который мы хотим настроить. Второй аргумент — это режим (вход или выход), в котором мы хотим установить контакт. Это будет либо ‘ GPIO_MODE_OUTPUT’ , если вы хотите настроить порт как выход, либо ‘ GPIO_MODE_INPUT ‘, если вы хотите настроить порт как вход. В нашем случае мы хотим установить контакт GPIO как выходной, потому что мы хотим управлять подключенным к нему светодиодом.
В следующей строке кода мы настраиваем GPIO0 как выходной контакт
|
1 |
gpio_set_direction(GPIO_NUM_0, GPIO_MODE_OUTPUT); |
Установка уровня выходного сигнала
Следующий шаг — установка уровня выходного сигнала порта GPIO. Для этого мы используем функцию gpio_set_level(). Она также принимает два аргумента. Первый аргумент — это контакт GPIO, состояние которого мы хотим установить. Второй аргумент — это состояние (0 или 1), которое мы хотим установить. Для установки уровня выходного сигнала контакта в состояние HIGH используйте ‘1’ в качестве второго аргумента. Аналогично, для установки уровня выходного сигнала контакта в состояние LOW используйте ‘0’ в качестве второго аргумента.
В следующей строке кода мы устанавливаем GPIO0 в состояние ВЫСОКОГО уровня.
|
1 |
gpio_set_level(GPIO_NUM_0, 1); |
Обзор проекта мигания светодиода на ESP32
Цель нашего проекта — подключить 5-миллиметровый светодиод к одному из 30 доступных контактов ESP32, настроить этот контакт GPIO как цифровой выходной контакт, а затем переключать его состояние с задержкой в несколько секунд для отображения эффекта мигания.
На приведенной ниже диаграмме показано, как будет меняться состояние контакта GPIO:
Светодиод, подключенный к цифровому выходному контакту ESP32, изначально выключен, так как находится в низком состоянии. Через 1 секунду состояние этого контакта GPIO переходит в высокое, и светодиод включается. Светодиод остается включенным в течение 1 секунды. По истечении этого времени состояние светодиода снова переходит в низкое, и он выключается на 1 секунду. Таким образом, процесс повторяется, и светодиод мигает, включаясь и выключаясь каждую секунду.
Схема мигания светодиода на ESP32 и настройка оборудования.
Для этого проекта нам потребуются следующие компоненты.
Необходимые компоненты:
- Плата разработки ESP32.
- Один светодиод 5 мм.
- Один токоограничивающий резистор на 220 Ом.
- Соединительные провода.
- Макетная плата.
На приведенной ниже схеме показана схема проекта мигания светодиода на ESP32.
Мы использовали вывод GPIO13 для подключения к аноду светодиода через токоограничивающий резистор 220 Ом. Катод светодиода подключен к выводу GND микроконтроллера ESP32. Вы также можете использовать любой другой подходящий цифровой выходной контакт ESP32 для подключения к светодиоду.
Вот как выглядит наша схема после подключения всех компонентов.
Проект мигания светодиода в VS Code с использованием ESP-IDF
Откройте VS Code и перейдите в меню View > Command Palette («Вид» > «Палитра команд»). Введите в строке поиска ESP-IDF: New Project и нажмите Enter.
Укажите название проекта и каталог. Мы назвали наш проект «LED_BLINK». Для платы ESP-IDF мы выбрали опцию «пользовательская плата» (custom board). В качестве целевой платформы ESP-IDF мы выбрали модуль ESP32. Нажмите кнопку ‘Choose Template’ («Выбрать шаблон»), чтобы продолжить.
В разделе Extension («Расширение») выберите опцию ESP-IDF:
На вкладке get-started («Начало работы») мы щелкнем по пункту «sample_project». Затем нажмем ‘Create project using template sample_project’.
Вы получите уведомление о создании проекта. Чтобы открыть проект в новом окне, нажмите «Да».
Это открывает наш проект LED_BLINK, который мы создали во вкладке EXPLORER («Проводник»). Как видите, внутри папки нашего проекта (LED_BLINK) находится несколько папок. Это одинаково для всех проектов, которые вы будете создавать с помощью ESP-IDF Explorer. В основной папке находится исходный код, то есть файл main.c будет находиться здесь. В файле main.c мы напишем наш программный код.
Перейдите в папку main > main.c и откройте её. Здесь мы определим функции и программный код.
Теперь мы полностью готовы начать программирование нашей платы ESP32 для проекта мигания светодиодов.
Скрипт для мигания светодиода на ESP32
Это скрипт, который мы будем использовать для мигания светодиода, подключенного к GPIO13 микроконтроллера ESP32.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <stdio.h> #include "driver/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #define LED_PIN 13 void app_main(void) { gpio_pad_select_gpio(LED_PIN); gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); int ON = 0; while(true) { ON = !ON; gpio_set_level(LED_PIN, ON); vTaskDelay(1000/ portTICK_PERIOD_MS); } } |
Как работает код?
Для начала мы подключим необходимые библиотеки для этого проекта. Это включает библиотеку driver/gpio.h, поскольку нам нужно работать с контактами GPIO, и библиотеки FreeRTOS, так как мы хотим добавить задержку для мигания светодиода.
|
1 2 3 |
#include "driver/gpio.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" |
Мы подключили светодиод к выводу GPIO13. Поэтому мы определим переменную с именем ‘LED_PIN’, которая будет хранить значение вывода GPIO 13. Она будет использоваться позже в коде для управления светодиодом.
|
1 |
#define LED_PIN 13 |
Настройка GPIO для мигания светодиода
Следующий шаг — настройка вывода LED_PIN в качестве GPIO. Для этого мы воспользуемся функцией gpio_pad_select_gpio(). Укажите вывод LED_PIN в качестве параметра внутри этой функции.
|
1 |
gpio_pad_select_gpio(LED_PIN); |
Затем мы зададим направление вывода как выходное, используя функцию gpio_set_direction(). Эта функция принимает два аргумента. Первый аргумент — это номер вывода GPIO, а второй — режим (вход или выход), в котором мы хотим установить вывод. В нашем случае мы хотим установить вывод LED_PIN как выходной.
|
1 |
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT); |
Для мигания светодиода мы будем использовать следующие строки кода внутри функции цикла.
|
1 2 3 4 5 6 7 |
int ON = 0; while(true) { ON = !ON; gpio_set_level(LED_PIN, ON); vTaskDelay(1000/ portTick_Period_MS); } |
Сначала мы создаём целочисленную переменную с именем ‘ON’, которая хранит значение 0. Это флаг, который будет отслеживать, включен светодиод или выключен. Внутри цикла while мы переключаем значение переменной ON. Используя gpio_set_level(LED_PIN, ON), мы устанавливаем значение LED_PIN равным значению, сохранённому в переменной ON. Затем мы добавляем задержку перед повторным запуском цикла.
Для добавления задержки в 1 секунду между изменениями состояния светодиода мы будем использовать функцию vTaskDelay(). Эта задержка вызовет эффект мигания светодиода.
Компиляция скетча
Для прошивки микросхемы введите следующую команду в последовательном терминале. Не забудьте заменить COM-порт на тот, через который подключена ваша плата.
|
1 |
idf.py -p COMX flash monitor |
После успешной прошивки кода светодиод начнет мигать с задержкой в одну секунду.
