Компонент · Контроллер
ESP32
ESP32 — быстрый двухъядерный микроконтроллер со встроенными Wi-Fi и Bluetooth, то есть Arduino с беспроводной связью. Что он умеет и когда его выбрать.
Что это такое
ESP32 — микроконтроллер, похожий на Arduino с прикрученным радиомодулем и снятыми тормозами. В нём есть двухъядерный 32-разрядный процессор, работающий во много раз быстрее Uno, значительно больше памяти и — главная особенность — встроенные Wi-Fi и Bluetooth. Именно эта комбинация обеспечивает доминирование в хобби-робототехнике и IoT: робот может размещать веб-страницу для управления, передавать данные датчиков на телефон или принимать команды по Bluetooth — всё это с одной недорогой микросхемы.
Важно, что для программирования используются те же Arduino IDE и язык, которые, возможно, уже знакомы. Знания, полученные на Uno, переносятся напрямую; вы просто получаете связь и больший запас ресурсов.
Как это работает
В основе лежат два ядра 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 для расширенных возможностей.
Дополнительные материалы