Рубрики
Проекты на ESP32

Архитектура и основы программирования ESP32-S3 с помощью ESP-IDF (урок 1)

Микроконтроллеры — это мощные устройства, позволяющие создавать интеллектуальные и автоматизированные системы. Хотя такие платформы, как Arduino, сделали изучение электроники доступным, современный мир требует возможности подключения к сети. Сегодняшним проектам часто необходимо подключаться к интернету, передавать данные в облако или взаимодействовать со смартфонами. Добавление этих возможностей к традиционным базовым микроконтроллерам раньше было сложным и дорогостоящим процессом.

Для решения этой проблемы компания Espressif Systems представила линейку недорогих, высокоинтегрированных микроконтроллеров, которые произвели революцию в сфере Интернета вещей (IoT): серию ESP.

Что такое ESP?

Семейство ESP состоит из маломощных, высокоинтегрированных микрочипов со встроенными модулями Wi-Fi и Bluetooth. Вместо отдельного микроконтроллера и отдельного беспроводного модуля, чипы ESP объединяют оба компонента в одном кремниевом кристалле.

Благодаря огромной вычислительной мощности, большому объему памяти и встроенным беспроводным функциям, они стали отраслевым стандартом для устройств IoT, автоматизации умного дома и продвинутой электроники для самостоятельной сборки. Кроме того, они пользуются широкой поддержкой сообщества разработчиков открытого программного обеспечения, что делает переход для новичков невероятно простым.

«Голый чип» против модуля против комплекта разработчика (Dev Kit)

Продукты ESP обычно выпускаются в трех различных формах. Понимание этой иерархии имеет решающее значение. Рассмотрим каждую из этих форм более подробно.

«Голый чип»

Это сам крошечный кремниевый чип (например, ESP32-D0WDQ6). Работать с ним напрямую очень сложно, поскольку требуется разработка сложной схемы, включающей внешнюю флэш-память, кварцевый генератор и антенну.

Модуль

Чтобы сделать чип пригодным для использования производителями, компания Espressif упаковывает его в небольшую печатную плату размером с почтовую марку вместе с флэш-памятью, кварцевым резонатором и встроенной контактной антенной (обычно закрытой блестящим металлическим экраном). Известный пример — модуль ESP-WROOM-32. Хотя он проще в использовании, он все еще требует пайки к специальной печатной плате и работает строго при напряжении 3,3 В.

Комплект разработчика (Dev Kit)

Комплект для разработчиков (Dev Kit) берет модуль ESP и припаивает его к более крупной, удобной для макетной платы печатной плате. Он добавляет USB-порт, преобразователь USB в последовательный порт, стабилизатор напряжения 3,3 В и легкодоступные контактные разъемы, что делает его лучшим вариантом для обучения и прототипирования, поскольку его проще питать, программировать и подключать к другим компонентам.

Серия ESP

Компания Espressif выпустила несколько поколений микросхем, каждое из которых разработано для решения различных технологических задач.

ESP8266

ESP8266 — это чип, положивший начало революции в сфере Интернета вещей. До его появления добавление Wi-Fi к микроконтроллеру обходилось более чем в 30 долларов. ESP8266 сделал это примерно за 2 доллара. Он оснащен одноядерным 32-битным процессором и встроенным Wi-Fi. Хотя он старше и имеет меньше контактов ввода/вывода, чем его преемники, он остается невероятно популярным для простых и недорогих датчиков и выключателей для умного дома. К распространенным комплектам разработчика для этого чипа относятся NodeMCU и Wemos D1 Mini. На нашем сайте вы можете найти множество проектов на основе чипов ESP8266, а также проекты на NodeMCU.

ESP32

Оригинальный ESP32 — это мощный преемник 8266. Он получил практически все улучшения: двухъядерный 32-битный процессор, поддержку Bluetooth (классического и Low Energy), значительно увеличенное количество контактов GPIO и аппаратное шифрование. Это золотой стандарт для проектов, требующих высокой производительности, таких как потоковая передача аудио, сложные веб-серверы или одновременная обработка данных с нескольких датчиков.

Серия ESP32-S (S2, S3)

Серия ESP32-S ориентирована на безопасность, специализированные функции и передовые возможности обработки данных.

  • ESP32-S2: Одноядерный Wi-Fi-чип, который обеспечил встроенную поддержку USB, что позволяет использовать его как мышь или клавиатуру, а также расширил возможности обеспечения безопасности.
  • ESP32-S3: Двухъядерный процессор, разработанный специально для искусственного интеллекта и машинного обучения на периферии сети. Он включает в себя «векторные инструкции», которые значительно ускоряют работу нейронных сетей, что делает его идеальным для камер распознавания голоса или лиц.

Серия ESP32-C

Серия ESP32-C представляет собой сдвиг в философии проектирования Espressif. В отличие от более ранних чипов, основанных на собственной архитектуре Xtensa, серия C использует архитектуру RISC-V с открытым исходным кодом. Эти чипы ориентированы на низкое энергопотребление, экономичность и современные беспроводные возможности подключения, что делает их идеальными для устройств Интернета вещей.

  • ESP32-C2: Микроконтроллер начального уровня, сверхнизкой стоимости, разработанный для простых приложений Интернета вещей. Он обеспечивает подключение по Wi-Fi 4 (2,4 ГГц) и базовые функции безопасности, при этом потребляя очень мало энергии, что делает его подходящим для массового производства подключенных устройств.
  • ESP32-C3: Популярный и широко используемый чип, являющийся современной заменой ESP8266. Он оснащен одноядерным процессором RISC-V, Wi-Fi 4 и Bluetooth LE 5.0, обеспечивая повышенную безопасность, производительность и низкое энергопотребление для общих проектов IoT.
  • ESP32-C5: Представляет поддержку двухдиапазонного Wi-Fi 6 (2,4 ГГц и 5 ГГц), обеспечивая более высокую пропускную способность и меньшую задержку по сравнению с более ранними чипами. Он разработан для более требовательных беспроводных приложений, где требуется более быстрое и надежное соединение.
  • ESP32-C6: Ориентирован на экосистемы IoT следующего поколения, сочетая Wi-Fi 6, Bluetooth LE 5.3 и поддержку протоколов Zigbee и Thread. Это делает его особенно подходящим для устройств умного дома и устройств, совместимых с Matter, которым требуется поддержка нескольких беспроводных стандартов.

Серия ESP32-H

Серия ESP32-H разработана специально для маломощных ячеистых сетей, используемых в современных экосистемах умного дома. Эти чипы ориентированы на протоколы IEEE 802.15.4, а не на Wi-Fi.

  • ESP32-H2: маломощный микроконтроллер на базе RISC-V, разработанный для устройств, использующих Thread, Zigbee и другие протоколы IEEE 802.15.4. Он также включает Bluetooth LE 5.2 для инициализации и связи с устройствами. В отличие от большинства чипов ESP32, он не имеет Wi-Fi, что делает его идеальным для совместимых с Matter устройств умного дома, датчиков и узлов ячеистой сети с питанием от батарей.

  • ESP32-H4: Разработан как микроконтроллер-компаньон с поддержкой Bluetooth для систем IoT. Он предназначен для приложений Bluetooth Low Energy, таких как носимые устройства, датчики и шлюзы. H4 может использоваться совместно с другими микросхемами ESP (например, микроконтроллерами Wi-Fi) для разгрузки обработки Bluetooth-соединений и беспроводных протоколов, повышая эффективность в многорадиосистемах.

Серия ESP32-P

Серия ESP32-P ориентирована на приложения, требующие значительно большей вычислительной мощности, чем у типичных микроконтроллеров для Интернета вещей.

  • ESP32-P4: Мощный микроконтроллер на базе RISC-V, разработанный для ресурсоемких встраиваемых систем, таких как продвинутые человеко-машинные интерфейсы, обработка мультимедиа и задачи искусственного интеллекта на периферии сети. В отличие от большинства чипов ESP, он не имеет встроенной беспроводной связи, что позволяет ему полностью сосредоточиться на производительности ЦП, пропускной способности памяти и возможностях периферийных устройств. Беспроводную связь можно добавить с помощью дополнительных микросхем.

Структура ESP32-S3

ESP32-S3 — это мощный микроконтроллер, разработанный для приложений AIoT (искусственный интеллект вещей). Он объединяет беспроводную связь, ускорение ИИ и богатый набор периферийных устройств на одном чипе.

Понимание его внутренней структуры помогает нам увидеть, как он обрабатывает данные, взаимодействует с устройствами и подключается к сетям.

Чтобы понять, как работает ESP32-S3, нам нужно разобрать его основные компоненты.

Ядро микроконтроллера

ESP32-S3 содержит двухъядерный процессор Xtensa LX7, способный работать на частоте до 240 МГц.

Этот процессор выступает в роли «мозга» системы. Он выполняет инструкции программы, обрабатывает данные с датчиков, производит вычисления и управляет выходными сигналами, такими как дисплеи, двигатели и коммуникационные интерфейсы.

Благодаря наличию двух процессорных ядер задачи могут эффективно распределяться. Например, одно ядро ​​может управлять обменом данными или фоновыми процессами, а другое — обрабатывать логику приложения или сигналы.

Структура памяти

ESP32-S3 включает в себя 512 КБ внутренней SRAM, которая используется в качестве рабочей памяти во время выполнения программы.

Помимо внутренней памяти, чип поддерживает внешнюю высокоскоростную SPI-флэш-память и PSRAM. Эти внешние модули памяти позволяют разработчикам хранить более крупные программы, буферы и наборы данных, необходимые для более сложных приложений, таких как обработка изображений или задачи искусственного интеллекта. Большинство модулей ESP32 поставляются с огромным объемом флэш-памяти от 4 до 16 МБ.

Подключение по Wi-Fi и Bluetooth

Одной из ключевых особенностей ESP32-S3 являются встроенные возможности беспроводной связи.

Встроенный модуль Wi-Fi 2,4 ГГц (802.11 b/g/n) обеспечивает подключение к сети, а Bluetooth 5 Low Energy (LE) — беспроводную связь на коротких расстояниях между устройствами.

Технология Bluetooth LE поддерживает современные функции, такие как связь на большие расстояния с использованием кодированного физического уровня (PHY), более высокая пропускная способность данных с PHY 2 Мбит/с и расширенные возможности передачи рекламных сообщений. Эти беспроводные технологии позволяют ESP32-S3 легко подключаться к смартфонам, датчикам, облачным сервисам и другим интеллектуальным устройствам.

Ускорение ИИ

В ESP32-S3 предусмотрена поддержка векторных инструкций внутри процессора. Эти инструкции ускоряют операции, обычно используемые в обработке сигналов и вычислениях в нейронных сетях.

Это аппаратное ускорение позволяет разработчикам запускать легковесные модели машинного обучения непосредственно на устройстве. Такие библиотеки, как ESP-DSP и ESP-NN, предоставляют оптимизированные реализации, которые упрощают создание приложений с поддержкой искусственного интеллекта (ИИ), таких как распознавание голоса, обнаружение жестов и компьютерное зрение.

Периферийные устройства ввода/вывода

ESP32-S3 предлагает богатый набор периферийных устройств, позволяющих взаимодействовать с широким спектром электронных компонентов.

Он предоставляет до 45 программируемых контактов GPIO, которые можно настроить для различных функций. Эти контакты могут взаимодействовать с датчиками, дисплеями, устройствами хранения данных и коммуникационными модулями.

Микросхема также поддерживает несколько интерфейсов связи, включая:

  • SPI
  • I2C
  • I2S
  • UART
  • PWM
  • RMT
  • SD/MMC host

Кроме того, 14 контактов GPIO могут функционировать как емкостные сенсорные входы, что позволяет создавать человеко-машинные интерфейсы на основе сенсорного управления.

Аналоговые функции

В состав ESP32-S3 входит аналого-цифровой преобразователь (АЦП), позволяющий системе считывать аналоговые сигналы напряжения с датчиков, таких как датчики температуры, освещенности или потенциометры.

АЦП преобразует эти аналоговые напряжения в цифровые значения, которые микроконтроллер может обрабатывать программно.

Сверхнизкопотребляющий (ULP) сопроцессор

Для поддержки энергоэффективных приложений в ESP32-S3 встроен сверхнизкопотребляющий сопроцессор.

Этот небольшой процессор может работать, даже когда основные ядра находятся в спящем режиме. Он может отслеживать показания датчиков, собирать данные или запускать события пробуждения, потребляя при этом очень мало энергии. Эта функция особенно полезна для устройств с батарейным питанием и систем долговременного мониторинга.

ESP-IDF

Для разработки приложений для ESP32-S3 и других микросхем ESP в данной серии уроков мы будем использовать среду ESP-IDF (Espressif IoT Development Framework), хотя для многих, конечно, более просто освоить программирование ESP32-S3 с помощью Arduino IDE.

ESP-IDF — это официальная среда разработки, предоставляемая компанией Espressif Systems для программирования микроконтроллеров серии ESP32. Это мощная среда, разработанная для профессиональной и передовой разработки встраиваемых систем.

ESP-IDF предоставляет инструменты, необходимые для написания, компиляции и загрузки прошивки на устройства ESP. Он включает в себя набор библиотек, драйверов и инструментов разработки, позволяющих разработчикам получать доступ к аппаратным функциям микроконтроллера, таким как GPIO, Wi-Fi, Bluetooth, таймеры и коммуникационные интерфейсы.

Фреймворк можно скачать с официального сайта и из документации:
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/

ESP-IDF также включает множество примеров проектов, которые помогают пользователям понять, как работать с различными периферийными устройствами и функциями микросхем ESP. Эти примеры демонстрируют такие задачи, как подключение к сетям Wi-Fi, чтение данных с датчиков, управление дисплеями и использование Bluetooth-связи. Кроме того, платформа предоставляет встроенные библиотеки компонентов, которые упрощают работу с аппаратными модулями и позволяют разработчикам более эффективно создавать сложные IoT-приложения.

Программирование ESP32

Введение

Для программирования микроконтроллера ESP32 с использованием фреймворка ESP-IDF мы в основном используем языки программирования C и C++. Структура проекта обычно включает ProjectName.c файл, который служит точкой входа в приложение. Он также содержит файлы конфигурации сборки, которые компилируют исходный код в двоичные инструкции, которые может выполнять микроконтроллер.

В ProjectName.c файле содержится app_main() функция, которая выполняется один раз при включении или перезагрузке платы ESP32. Внутри этой функции мы размещаем инструкции, которые хотим, чтобы микроконтроллер выполнил. Если нам нужен набор инструкций, выполняющихся непрерывно, мы можем добавить цикл while(1), чтобы код выполнялся многократно.

Прежде чем начать, давайте рассмотрим ключевую структуру и синтаксис языка C.

Переменные и типы данных

В языке C переменные можно рассматривать как контейнеры или ячейки, используемые для хранения информации, которую наша программа может использовать и обрабатывать. Каждая переменная имеет тип данных, который сообщает компилятору, какие данные она будет содержать, например, числа, текст или логические состояния.

Для создания переменной мы сначала указываем тип данных переменной, затем её имя, и если у неё есть значение, присваиваем ему это значение с помощью оператора =:

ESP-IDF поддерживает стандартные типы данных языка C:

char (символьный)

Представляет собой отдельный символ, например 'a''!', , или '$'.

  • Использует 1 байт памяти.
  • Сохранено с использованием кодировки ASCII.
  • Арифметические операции char фактически выполняются над их значениями ASCII.

Символьные массивы

Представляет собой последовательность символов (текст), например, «Hello» или «ESP32». В языке C строки — это просто массивы символов, завершающиеся нулевым символом ( \0). Пример:

int (целый)

Представляет целые числа, такие как 5-10, или 0.

  • Поскольку ESP32 — 32-битный микроконтроллер, intего размер составляет 4 байта .
  • Арифметические операции над целыми числами возвращают целочисленные значения (например, 4/3= 1).

Числа могут быть записаны в различных системах счисления:

  • Десятичная (основание 10): обычные числа, такие как 10, 25, 100.
  • Двоичная система счисления (по основанию 2): с префиксом 0b.
  • Восьмеричная (основание 8): с префиксом 0.
  • Шестнадцатеричная система счисления (основание 16): с префиксом 0x.

long и long long

Используется для целых чисел. На ESP32 long занимает 4 байта (как и int), тогда как long long для больших чисел используется 8 байтов.

float

Представляет десятичные числа с одинарной точностью.

  • Использует 4 байта.
  • Используется для значений типа 3.14 или -2.5.

double

Представляет десятичные числа с более высокой точностью.

  • Использует 8 байт на ESP32 для высокоточных вычислений.

bool

Представляет логическое значение: true или false. Для использования в C необходимо подключить библиотеку <stdbool.h>. Внутри хранится как 1 (true) или 0 (false).

void

Не имеет значения. Используется для функций, которые ничего не возвращают. Пример:

Целочисленные типы фиксированной ширины

Встраиваемое программирование с использованием ESP-IDF настоятельно рекомендуется использовать целочисленные значения фиксированной ширины, <stdint.h> чтобы точно знать, сколько памяти занимает переменная.

  • uint8_t: Беззнаковое однобайтовое целое число (обычно используется как «байт»).
  • int16_t: Знаковое 2-байтовое целое число.
  • uint32_t: Беззнаковое 4-байтовое целое число.

Массивы

Массивы — это наборы переменных одного типа, хранящихся вместе.

  • Доступ к элементам осуществляется с помощью индексов, начиная с 0.
  • Массивы могут содержать целые числа, символы или другие типы данных.

Таблица типов данных (ESP32 / 32-битная архитектура)

Тип Память Диапазон значений
bool 1 байт true или false
char 1 байт от -128 до 127
unsigned char 1 байт от 0 до 255
short 2 байта -32,768 до 32,767
unsigned short 2 байта от 0 до 65 535
int 4 байта от -2 147 483 648 до 2 147 483 647
unsigned int 4 байта от 0 до 4 294 967 295
long 4 байта от -2 147 483 648 до 2 147 483 647
unsigned long 4 байта от 0 до 4 294 967 295
long long 8 байт -(2^63) до (2^63)-1
float 4 байта ~ ±3,4 × 10³⁸
double 8 байт ~ ±1,7 × 10³⁰⁸
void 0 байт
int8_t 1 байт -128 → 127
uint8_t 1 байт 0 → 255
int16_t 2 байта -32,768 → 32,767
uint16_t 2 байта 0 → 65,535
int32_t 4 байта -2,147,483,648 → 2,147,483,647
uint32_t 4 байта 0 → 4 294 967 295
int64_t 8 байт очень большой
uint64_t 8 байт очень большой

Как видите, типов данных достаточно много, поэтому старайтесь их грамотно использовать.

Константы

Константа — это переменная, значение которой не может изменяться во время выполнения программы. Для обозначения констант используются заглавные буквы, чтобы их было легко идентифицировать в коде. Существует два способа определения констант:

  • Используя ключевое слово const:const float GRAVITY = 9.81;
  • Используя директиву #define:#define PI 3.14159

#define— это директива препроцессора, которая заменяет имя значением перед компиляцией и не имеет проверки типов, в то время как constсоздает типизированную переменную, значение которой не может изменяться, что позволяет компилятору обеспечивать типовую безопасность.

Арифметические операторы

Арифметические операторы используются для выполнения математических операций. Они позволяют производить такие вычисления, как сложение, вычитание, умножение и деление.

  • Сложение (+):  Складывает два операнда. При использовании с символьными типами данных складывает их ASCII-значения и возвращает результирующий символ.
  • Вычитание (-):  Вычитает второй операнд из первого. Аналогично сложению, при использовании с символьными типами данных (char) работает с ASCII-значениями.
  • Умножение (*):  Умножает два операнда. Этот оператор нельзя использовать напрямую с типами данных char.
  • Деление (/):
    • Для типов данных float или double выполняется обычное деление, и возвращается точный результат.
    • Для типов int или long выполняется целочисленное деление, при котором отбрасывается дробная часть результата. Округление результата не производится.
  • Остаток от деления (%):  Возвращает остаток от деления между двумя операндами. Применимо только для типов int и long.

Составные операторы

Составные операторы объединяют арифметическую операцию и присваивание в один шаг. Они делают код короче, понятнее и проще для чтения.

  • += (Сложное сложение):  Присваивает значение переменной и присваивает результат той же переменной.   x += 5; То же самое, что и x = x + 5;
  • -= (Составное вычитание):  Вычитает значение из переменной.   x -= 2;   То же самое, что и x = x - 2;
  • *= (Сложное умножение):  Умножает переменную на значение. x *= 4;   То же самое, что и x = x * 4;
  • /= (Составное деление):  Делит переменную на значение.   x /= 2;  То же самое, что и x = x / 2;
  • %= (Составной остаток):  хранит остаток от деления.   x %= 3;   То же самое, что и x = x % 3;

Операторы приращения и уменьшения

Эти операторы представляют собой специальные составные операторы, используемые для увеличения или уменьшения переменной на 1. Они очень распространены в циклах и счетчиках.

  • ++ (Приращение):  Увеличивает переменную на единицу.   i++;   То же самое, что и i = i + 1;
  • -- (Уменьшение):  Уменьшает переменную на единицу.   i--;  То же самое, что и i = i - 1;

Эти операторы могут использоваться в двух формах:

  • ++i (предварительное увеличение): сначала увеличить значение, затем использовать полученное значение.
  • i++ (пост-инкремент): сначала используйте значение, затем выполните инкремент.

Операторы сравнения

Операторы сравнения сравнивают два значения и выдают логический результат (true или false, или 10 в стандартном языке C).

Оператор Значение
== Равно
!= Не равно
> Больше, чем
< Меньше, чем
>= Больше или равно
<= Меньше или равно

В принципе, данные операторы очень похожи во многих языках программирования.

Логические операторы

Логические операторы помогают объединять несколько условий в более сложные выражения. Результатом логической операции также является логическое значение (истина или ложь).

  • || (ИЛИ): Возвращает  true если  выполняется  хотя бы одно из связанных между собой условий  .
  • && (AND):  Возвращает  true  только в том случае, если все связанные между собой условия  истинны.
  • ! (НЕ):  Изменяет логическое состояние условия на противоположное.

Условные операторы

Одно условие с if

Иногда нам нужно выполнить инструкцию только тогда, когда выполняется определенное условие. Если условие ложно, система просто пропускает этот блок и продолжает выполнение остальной части программы.

Альтернативный путь с if-else

Мы также можем предложить альтернативный путь. Если условие выполняется, выполняется один блок; в противном случае выполняется другой блок.

Множественные состояния сelse if

Когда существует более двух возможных исходов, мы можем объединять условия в цепочку, используя оператор else if.. C проверяет их по порядку и выполняет первое истинное условие.

Тернарный оператор

В языке C мы можем использовать тернарный оператор ? :, который является сокращенной формой оператора if-else, используемого для присвоения значения переменной на основе условия. Он полезен для коротких и простых решений, особенно при присваивании значений.

Операторы switch case

При проверке значения на соответствие множеству вариантов можно использовать операторы switch иcase. Это делает код чище по сравнению с использованием множества else ifусловий.

Циклы

Циклы помогают нам повторять действие несколько раз. Существует три типа циклов.

Цикл for

Цикл for используется, когда нам известно, сколько раз мы хотим повторить блок кода. Он очень распространен в Esp32, особенно для управления светодиодами, датчиками или повторения задач фиксированное количество раз.

Цикл while

Цикл while повторяется до тех пор, пока выполняется условие. Он полезен, когда неизвестно, сколько раз будет выполнен цикл.

Цикл do-while

Цикл do-while похож на while, но он всегда выполняется хотя бы один раз, даже если условие ложно.

Перерыв и продолжение:

Мы можем улучшить управление циклами, используя ключевые слова  break и  continue:

  • break— эта  инструкция используется для немедленного завершения цикла при выполнении определенного условия.
  • continue— эта инструкция используется для пропуска текущей итерации цикла и перехода к следующей, фактически игнорируя инструкции для этой итерации, когда выполняется определенное условие.

Комментарии:

Комментарии — это строки кода, которые компилятор игнорирует. Они используются для добавления пояснительных примечаний и улучшения читаемости кода. Существует два способа создания комментариев:

  • Однострочные комментарии:  начинаются с // текущей строки и продолжаются до конца. Весь текст, следующий за ними на той же строке, игнорируется компилятором.
  • Многострочные комментарии:  начинаются с символа /* и заканчиваются символом */. Любой текст между этими двумя символами, включая несколько строк, будет проигнорирован компилятором.

Создание наших первых проектов

Теперь, когда мы понимаем, что такое микроконтроллер ESP32-S3, и рассмотрели основные понятия языка C, мы можем начать писать простую программу для ESP32-S3.

Традиционным первым проектом в области встраиваемых систем является мигающий светодиод. Этот проект помогает нам проверить, что:

  • Среда разработки работает корректно.
  • Код компилируется успешно.
  • Плата может управлять своими контактами GPIO.

Прежде чем писать какой-либо код, необходимо настроить структуру папок проекта, используемую ESP-IDF.

Настройка папки проекта

Сначала создайте папку, которая будет содержать все файлы, относящиеся к нашему проекту. Проекты ESP-IDF используют стандартную структуру каталогов, которая позволяет системе сборки правильно компилировать и организовывать наш код.

Минимальная структура проекта ESP-IDF выглядит следующим образом:

  • my-new-project— это корневая папка нашего проекта. Она содержит конфигурационные файлы и подпапки, определяющие весь проект.
  • CMakeLists.txt — определяет глобальные параметры сборки для проекта, в них указывается местоположение системы сборки ESP-IDF, какие компоненты относятся к проекту и как организовать процесс сборки.

  • main/ В ESP-IDF проекты организованы в компоненты, которые представляют собой небольшие блоки, выполняющие определенные задачи. Папка main является компонентом по умолчанию, содержащим основной код приложения. В небольших проектах весь код может оставаться внутри этой папки.
  • main/CMakeLists.txt Этот файл конфигурации сборки на уровне компонента указывает системе сборки, какие исходные файлы относятся к данному компоненту.

В этом файле необходимо указать две основные вещи: SRCSсписок исходных файлов для компиляции и INCLUDE_DIRSкаталоги, содержащие заголовочные файлы.

  • main/main.c — этот файл содержит фактический программный код, который будет работать на ESP32-S3.

Давайте применим это и создадим папку blink, а внутрь неё добавим файлы, которые мы обсуждали выше.

Сборка схемы проекта

Теперь, когда мы создали папку проекта, давайте соберем схему. Нам понадобится светодиод (LED). Светодиод пропускает ток только в одном направлении и имеет два вывода:

  • Более длинный вывод (анод): подключается к положительной стороне (сигналу или питанию).
  • Более короткий вывод (катод): соединяется с заземлением (GND) .

Нам также понадобится резистор на 220 Ом. Резистор ограничивает ток, протекающий через светодиод, чтобы предотвратить его перегорание.

Для управления светодиодом и его мигания мы будем использовать цифровой вывод GPIO на ESP32. В этом примере мы будем использовать GPIO 2.

Теперь давайте соберем нашу схему:

  1. Подключите длинный вывод (анод) светодиода к выводу GPIO 2 через резистор 220 Ом.
  2. Подключите короткий вывод (катод) светодиода к контакту GND на ESP32.

Создание программы

Теперь давайте запрограммируем плату ESP32. Перейдём в файл main/main.c и начнём с импорта необходимых библиотек.

#include <stdio.h> Это стандартная библиотека ввода/вывода из языка C. Она позволяет использовать такие функции, как printf()вывод сообщений в последовательный монитор.

#include "freertos/FreeRTOS.h" Этот заголовок содержит основные определения FreeRTOS, используемые фреймворком ESP-IDF. FreeRTOS — это операционная система реального времени, работающая на ESP32 и управляющая задачами, синхронизацией и системными ресурсами.

#include "freertos/task.h" Эта библиотека предоставляет функции для создания и управления задачами в FreeRTOS. Она также включает в себя полезные функции, vTaskDelay() позволяющие приостанавливать выполнение задачи на определённое время.

#include "driver/gpio.h" Эта библиотека предоставляет нам доступ к драйверу GPIO (General Purpose Input/Output) ESP32. Он позволяет нам настраивать контакты как входы или выходы и управлять ими, именно так мы будем включать и выключать светодиод с помощью GPIO 2.

Теперь создадим нашу функцию app_main, начнём с установки режима работы контакта.

После этого мы создаём бесконечный цикл while. Внутри этого цикла мы управляем светодиодом, отправляя сигналы на GPIO 2.
Для включения и выключения светодиода мы используем функцию gpio_set_level(PIN, signal); которая устанавливает электрический уровень указанного контакта GPIO.

  • PIN обозначает номер GPIO, которым мы хотим управлять (в нашем случае, GPIO 2).
  • signal определяет уровень выходного сигнала:
    • 1→ включает светодиод
    • 0→ выключает светодиод

Для создания эффекта мигания мы добавляем задержку между включением и выключением светодиода, используя функцию vTaskDelay(1000 / portTICK_PERIOD_MS); которая выполняет задачу в течение определенного промежутка времени.

  • 1000обозначает время задержки в миллисекундах (1 секунда) .
  • portTICK_PERIOD_MS— преобразует миллисекунды в системные такты FreeRTOS, которые являются единицей времени, используемой операционной системой.

Выполнение программы

Теперь давайте запустим и загрузим программу в наш микроконтроллер.

Подключение и выбор микроконтроллера

Начнём с подключения микроконтроллера через USB. После этого выберем целевой микроконтроллер (ESP32-S3), чтобы компилятор знал, какую архитектуру чипа использовать:

Определение порта

Далее мы проверяем, к какому порту подключен микроконтроллер. Это можно определить, просканировав подключенное оборудование:

В Windows это будет выглядеть так: COM3; в Linux/macOS это будет выглядеть так: /dev/ttyUSB0 или /dev/cu.usbmodem....

Создание проекта

После этого мы компилируем наш код в машиночитаемый формат. На этом этапе проверяется наличие ошибок в нашем коде на языке C:

Flash и монитор

Наконец, мы запускаем нашу программу.

Замените PORT на идентификатор, найденный вами на шаге «Определение порта».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *