Компонент · Контроллер

ESP32

ESP32 — быстрый двухъядерный микроконтроллер со встроенными Wi-Fi и Bluetooth, то есть Arduino с беспроводной связью. Что он умеет и когда его выбрать.

Что это такое

ESP32 — микроконтроллер, похожий на Arduino с прикрученным радиомодулем и снятыми тормозами. В нём есть двухъядерный 32-разрядный процессор, работающий во много раз быстрее Uno, значительно больше памяти и — главная особенность — встроенные Wi-Fi и Bluetooth. Именно эта комбинация обеспечивает доминирование в хобби-робототехнике и IoT: робот может размещать веб-страницу для управления, передавать данные датчиков на телефон или принимать команды по Bluetooth — всё это с одной недорогой микросхемы.

Важно, что для программирования используются те же Arduino IDE и язык, которые, возможно, уже знакомы. Знания, полученные на Uno, переносятся напрямую; вы просто получаете связь и больший запас ресурсов.

Подписанная схема отладочной платы ESP32: модуль ESP32-WROOM с печатной антенной (PCB) для Wi-Fi и Bluetooth, порт USB для питания и прошивки, кнопки EN и BOOT и два ряда выводов GPIO, включая питание, ADC, PWM и TX/RX.
Отладочная плата ESP32: модуль WROOM с антенной Wi-Fi/Bluetooth, USB для питания и прошивки и ряды GPIO вдоль обеих длинных сторон. Скачать SVG

Как это работает

В основе лежат два ядра CPU Xtensa с тактовой частотой до 240 MHz. Два ядра важны для роботов: одно может выполнять контур регулирования с предсказуемыми интервалами, пока другое обслуживает Wi-Fi, поэтому сеть никогда не останавливает колёса. Вокруг CPU расположены обычные периферийные устройства микроконтроллера — GPIO, каналы PWM, несколько ADC, I²C, SPI, UART, — а также радиомодуль.

Самый важный практический факт — напряжение: ESP32 использует логику 3.3 V, а не 5 V Uno. Его выводы не допускают 5 V. Выход 5 V датчика, например вывод Echo HC-SR04, необходимо понизить до 3.3 V до подачи на вывод ESP32, иначе есть риск повреждения. На этом различии спотыкается почти каждый, кто переходит с Uno.

Когда его следует использовать

Выбирайте ESP32, когда роботу нужна беспроводная связь — дистанционное управление, телеметрия, веб-панель в браузере, — или вычисления, с которыми не справляется 8-разрядная плата, например обработка большего числа датчиков или небольшой логики на самом устройстве. Вариант ESP32-CAM добавляет камеру и открывает простые проекты зрения.

Оставайтесь с Arduino Uno при изучении основ, когда допуск 5 V делает монтаж безопаснее, либо когда проект прост и не требует сети: для движения пары двигателей по линии Wi-Fi не нужен.

Подключение и важные нюансы

  • Он работает при 3.3 V и не допускает 5 V. Преобразуйте уровень любого сигнала 5 V до подачи на GPIO. Это самая частая причина повреждения ESP32 новичками.
  • Wi-Fi вместе с двигателями может вызвать просадку питания. Радиомодуль создаёт резкие всплески тока; общий слабый источник с двигателями приводит к перезагрузкам. Питайте двигатели отдельно через драйвер двигателей и обеспечьте ESP32 стабильную шину 3.3 V.
  • Не каждый вывод свободен. Несколько GPIO работают только на ввод, связаны с режимом загрузки или подключены к внутренней Flash. Перед назначением выводов проверьте расположение выводов, иначе плата не загрузится.
  • Особенности ADC. Один из двух ADC недоступен при активном Wi-Fi, а показания менее линейны, чем у Uno; при необходимости точности выполните калибровку.

Выводы, которые нельзя использовать

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

Выводы Состояние Почему
GPIO 6–11 Никогда не использовать Подключены к внутренней SPI Flash. Использование делает загрузку невозможной
GPIO 0 Режим загрузки При сбросе должен быть HIGH, иначе плата перейдёт в режим Flash
GPIO 2 Режим загрузки При сбросе должен быть неподключённым или иметь LOW
GPIO 12 Режим загрузки При сбросе должен иметь LOW — подтяжка вверх мешает загрузке
GPIO 15 Режим загрузки HIGH при сбросе отключает журнал загрузки
GPIO 34–39 Только ввод Нет выходного каскада и внутренней подтяжки
GPIO 1, 3 Serial (TX0/RX0) Используются USB-программатором

На стандартной 30-выводной отладочной плате безопаснее всего использовать выводы общего назначения GPIO 4, 5, 13, 14, 16, 17, 18, 19, 21, 22, 23, 25, 26, 27, 32, 33. Начните с них, и вы избежите всех перечисленных ловушек.

Выводы режима загрузки вызывают наиболее запутанный отказ: плата работает идеально, пока к ней ничего не подключают. Подтягивающий резистор на GPIO 12, вполне естественный для кнопки, означает, что плата просто не запустится, без ошибки и последовательного вывода.

Выводы только для ввода создают другую проблему: GPIO 34–39 не имеют внутренней подтяжки вверх или вниз, поэтому кнопка на таком выводе находится в плавающем состоянии и даёт случайные показания. Нужен внешний резистор.

3.3 V и связанные с ними издержки

Выводы ESP32 не допускают 5 V, и это самая частая причина повреждения микросхемы. Любой сигнал 5 V требует обработки:

Ситуация Решение
Выход датчика 5 V → вход ESP32 Делитель напряжения (1 kΩ / 2 kΩ) или преобразователь уровней
Выход ESP32 → вход устройства 5 V Обычно допустимо — большая часть логики 5 V воспринимает 3.3 V как HIGH
Двунаправленная I²C между 5 V и 3.3 V Полноценный двунаправленный преобразователь уровней на BSS138
Устройство I²C 5 V с собственными подтяжками 3.3 V Часто работает напрямую — проверьте расположение подтяжек

Важно запомнить асимметрию: выходы обычно безопасны, входы обычно нет. Классический пример — вывод Echo HC-SR04, подающий полные 5 V на вывод с абсолютным максимумом 3.6 V.

Проблема ADC

Самое слабое место ESP32 — ADC, и попытки сделать вид, что это не так, бесполезно тратят время.

ADC2 не работает при активном Wi-Fi. Его использует радиомодуль. Любой вызов analogRead на выводе ADC2 возвращает мусор или блокируется в момент подключения Wi-Fi. Поскольку беспроводная связь — главная причина использования ESP32, это почти полностью исключает ADC2. Используйте только ADC1: GPIO 32–39.

Характеристика нелинейна. 12-разрядный ADC заметно нелинеен на обоих краях диапазона, а показания ниже примерно 0.1 V и выше примерно 3.1 V сжимаются. Микросхема содержит заводские данные калибровки, которые функции esp_adc_cal из ESP-IDF применяют автоматически; analogRead из Arduino по умолчанию их не использует.

Затухание Используемый диапазон входа
ADC_0db 0–1.1 V
ADC_2_5db 0–1.5 V
ADC_6db 0–2.2 V
ADC_11db (по умолчанию) 0–3.3 V, наименее линейный

Если аналоговому датчику нужна реальная точность, практический ответ — внешний ADC I²C, например ADS1115. Он стоит несколько долларов и полностью устраняет проблему.

Питание без просадок

Здесь проекты ESP32-роботов чаще всего терпят неудачу, и причина неочевидна.

Радиомодуль потребляет ток не постоянно, а всплесками. Пакет передачи может потреблять 500 mA в течение нескольких сотен микросекунд при среднем токе 40–80 mA. Источник, который показывает хорошие параметры на мультиметре, всё равно может проседать на этих всплесках, а ESP32 перезагружается с сообщением Brownout detector was triggered.

Правило Почему
Источник не менее 500 mA, желательно 1 A Важен пиковый, а не средний ток
Установить 100 µF или больше у вывода 3.3 V платы Локальный заряд для покрытия всплеска
Никогда не использовать общую шину с двигателями Бросок тока двигателя вместе со всплеском радиомодуля гарантированно вызывает перезагрузку
Использовать качественный USB-кабель Сопротивление тонкого кабеля превращает всплеск в просадку
Предпочитать вывод 5 V выводу 3.3 V Встроенный регулятор обрабатывает переходные процессы

Последний пункт следует сформулировать прямо: подавайте 5 V на вывод VIN/5V и позвольте регулятору платы сформировать 3.3 V. Подача 3.3 V напрямую обходит регулятор и его сглаживание, которые для этого и нужны.

Два ядра и как их действительно использовать

Двухъядерная архитектура — главное преимущество ESP32 для роботов, но среда Arduino скрывает её: loop() работает на ядре 1, а стек Wi-Fi — на ядре 0.

Явно закрепить задачу за ядром можно так:

void controlLoop(void *param) {
  const TickType_t period = pdMS_TO_TICKS(10);   // exactly 100 Hz
  TickType_t last = xTaskGetTickCount();
  for (;;) {
    readSensors();
    updatePid();
    driveMotors();
    vTaskDelayUntil(&last, period);              // no drift, unlike delay()
  }
}

void setup() {
  xTaskCreatePinnedToCore(
    controlLoop, "control", 4096, nullptr,
    2,          // priority above the default
    nullptr,
    1);         // core 1 — leave core 0 for Wi-Fi
}

Именно эта схема делает ESP32 действительно хорошим для роботов, а не просто подключённым: контур с жёстко заданным временем на одном ядре и веб-сервер на другом, который не может его остановить. Важная деталь — vTaskDelayUntil: в отличие от delay(), она компенсирует время выполнения тела цикла, поэтому период остаётся ровно 10 ms.

Диагностика

Симптом Вероятная причина Исправление
Brownout detector was triggered Просадка источника при всплесках радиомодуля Более жёсткий источник, локально 100 µF, подать 5 V, а не 3.3 V
Плата вообще не загружается Что-то удерживает GPIO 0, 2 или 12 Освободить выводы режима загрузки
analogRead возвращает мусор при Wi-Fi Используется вывод ADC2 Перейти на ADC1: GPIO 32–39
Вывод никогда не становится высоким GPIO 34–39 предназначены только для ввода Использовать другой вывод
Кнопка на GPIO 35 даёт случайные показания На 34–39 нет внутренней подтяжки Добавить внешний резистор
Загрузка не проходит без кнопки BOOT На клоне отсутствует цепь автосброса Удерживать BOOT при начале загрузки или добавить конденсатор 10 µF на EN
Случайные перезагрузки под нагрузкой двигателей Общая шина питания Раздельные источники, общая земля
Датчик повреждён после подключения 5 V на вывод 3.3 V Преобразовать уровень и проверить вывод
Wi-Fi отключается при работе двигателей Помехи радиомодуля или просадка питания Удалить антенну от проводов двигателей и обеспечить локальную фильтрацию

ESP32 или Arduino Uno?

Uno ESP32
Скорость 16 MHz, 8-разрядный До 240 MHz, двухъядерный 32-разрядный
SRAM 2 KB 520 KB
Логика 5 V, прощает ошибки 3.3 V, не прощает
Беспроводная связь Нет Wi-Fi и Bluetooth
Ловушки выводов Почти нет Несколько мешают плате загрузиться
Кривая обучения Всё работает с первого раза Перед подключением нужно прочитать схему выводов

Обе платы используют одинаковые язык и IDE, в чём и заключается смысл перехода: в коде он почти ничего не стоит, зато заметно повышает дисциплину монтажа.

Честная рекомендация: изучайте на Uno, создавайте на ESP32. Допуск 5 V и полное отсутствие ловушек выводов делают ранние ошибки исправимыми. Когда вы поймёте, что такое контур регулирования и почему земли должны быть общими, ESP32 даст пятнадцатикратную тактовую частоту, в 260 раз больше памяти и радиомодуль примерно за те же деньги.

Вариант ESP32-CAM стоит запомнить отдельно: он добавляет камеру и слот SD за несколько долларов и является самым дешёвым путём в машинное зрение роботов, но оставляет почти свободных выводов GPIO.

Исследуйте граф

Используется в этих сборках

Проекты, учебные пути и симуляторы, в которых используется ESP32.

Сравнение

Альтернативы

Вопросы

ESP32: частые вопросы

Что такое ESP32?

ESP32 — недорогой микроконтроллер с двухъядерным процессором и встроенными Wi-Fi и Bluetooth. Считайте его гораздо более быстрым Arduino с возможностью беспроводной связи с сетями и телефонами; поэтому он питает большинство подключённых проектов робототехники и IoT.

Для чего используют ESP32?

Его применяют везде, где проекту нужна беспроводная связь или больше вычислений, чем может обеспечить 8-разрядная плата: роботы с управлением по Wi-Fi, веб-панели, дистанционное управление по Bluetooth, датчики, передающие данные в облако, и проекты с камерой на варианте ESP32-CAM.

ESP32 лучше Arduino Uno?

По числовым характеристикам — да: он намного быстрее, имеет больше памяти и встроенную беспроводную связь, которой нет у Uno. Но Uno работает при 5 V и прощает ошибки монтажа, тогда как ESP32 использует 3.3 V и менее терпим к ним. Для изучения основ Uno удобнее, а для подключённых или вычислительно сложных роботов побеждает ESP32.

Чем Arduino отличается от ESP32?

Под Arduino обычно понимают 8-разрядную 5 V одноядерную плату без радиомодуля. ESP32 — 32-разрядная 3.3 V двухъядерная плата со встроенными Wi-Fi и Bluetooth. Путаница возникает потому, что обе программируются в Arduino IDE: «Arduino» может означать и язык с инструментами, и классические платы.

На чём программируют ESP32?

ESP32 программируют на C++ (с большим количеством C) с помощью среды Arduino или собственной среды ESP-IDF от Espressif. Если вы писали скетчи для Arduino, язык и структура переносятся напрямую — появляются в основном Wi-Fi, Bluetooth и дополнительные выводы.

Можно ли программировать ESP32 в Arduino IDE?

Да. После добавления пакета плат ESP32 в менеджер плат Arduino IDE вы пишете и загружаете скетчи точно как для Uno, а существующие библиотеки в основном работают. Это самый простой старт перед переходом на ESP-IDF для расширенных возможностей.

Дополнительные материалы

Источники