Шторку на окне я в один день пересадил с Uno на ESP32: хотелось видеть её состояние в приложении. Провода не трогал, скетч переписал за полчаса — и на первом же движении серво монитор выплюнул строку Brownout detector was triggered, а плата ушла в перезапуск. Второй раз то же самое, третий — то же. На Uno эта же сборка жила месяц: что изменилось, если серво та же самая и углы те же?
Изменилась плата, которая следит за собственным питанием. ESP32 честнее Uno: у неё внутри стоит brownout-детектор, который сбрасывает чип, как только шина 3,3 В проваливается ниже порога примерно 2,4-2,8 вольта. Серво на старте хода берёт вспышку тока — 100-250 мА у SG90 — и просадка через тонкие провода долетает до шины быстрее, чем вы успеваете моргнуть. Uno на такую яму реагирует разве что мусором в Serial, а ESP32 перезапускается — и держит вас в курсе, для чего я и записал причины перезапусков в уроке про uptime и их причины.
Ниже — три слоя решения: что серво думает о сигнале 3,3 В, откуда ей брать питание и как разнести во времени старт радиомодуля и первый ход серво. Всё проверено на живой шторке, а логика стартовой паузы и мягкого хода крутится в симуляторе в конце урока.
Зачем вообще тащить серво на ESP32, когда Uno справлялся? Из отпуска захотелось закрывать шторку командой из приложения и видеть её состояние на одном экране с датчиком температуры. Сценарий честный: радио в проекте уже есть, серво просто добавляется к нему, и вся её электроника остаётся прежней. Меняются не серво и не скетч, а шина, на которую оба теперь опираются, — и правила игры на этой шине жёстче, чем привык мой старый скетч.
Сигнал и питание: два разных вопроса
Сигнальный вход серво — это вход компаратора, и порог у него куда ниже пяти вольт: большинство 9-граммовых и металлических серво уверенно едут от импульсов 3,3 В, потому и связка с ESP32 работает без всяких преобразователей. Проверяется за минуту: подайте серво питание от отдельного 5 В, сигнальный провод — на GPIO, дайте угол 90, потом 60. Молчание при честных импульсах — редкость, но бывает у дешёвых клонов, которые просят сигнал поближе к 4 В; для таких случаев у меня в ящике лежит буфер 74AHCT125 за копейки, он переводит 3,3 В в честные 5.
С питанием всё строже. Пин 3.3V девкита — выход стабилизатора AMS1117, у которого потолок порядка ампера, и этот ампер уже распределён между чипом, радио и вашей периферией; серво туда вешать нельзя даже мелкую. Правильная схема знакома по Uno: отдельный источник 5 В (BEC, зарядка, сетевой блок на 2-3 А), земля общая с платой в одной точке — порядок соединений разобран в уроке про отдельное питание и общий GND. На ESP32-камерах и слабых платформах это не рекомендация, а условие жизни.
И третий участник, о котором на Uno думать не приходилось, — радиотракт. На передаче WiFi берёт вспышки в сотни миллиампер, и если серво дёргается в тот же момент, шина складывается из двух вспышек сразу. Мой рабочий приём — развести их во времени: WiFi поднимается первым, серво подключается минимум через 800 мс после старта и ходит мягко, по градусу.
Числа для блока питания складываются так: вспышка хода SG90 — до 250 мА, передача WiFi — до 500 мА в пике, сам чип с датчиками — ещё сотня. Складывать вспышки напрямую не нужно, но блок меньше ампера я для такой сборки даже не пробую: ставлю компактный BEC на 5 В 3 А — он дешевле двух ночей отладки. Отдельная песня — USB-кабель: тонкий шнур в метр восемьдесят просаживает питание уже при зарядке телефона, а тут ещё и серво в нагрузке, так что либо короткий толстый кабель, либо свой источник без USB вовсе.
#include <ESP32Servo.h> // на ESP32 Servo.h из AVR не живёт Servo shtora; // сигнальный провод — GPIO 13 const unsigned long T_START = 800; // после старта радиоconst unsigned long T_HOD = 12; // 1 градус за 12 мс int tsel = 30;int tek = 30;bool podklyucheno = false;unsigned long t0 = 0;unsigned long tHod = 0; void setup() { Serial.begin(115200); t0 = millis(); // WiFi.begin(...) здесь: радио первым, серво — потом Serial.println("zagruzka: radio, potom periferiya");} void loop() { unsigned long now = millis(); if (!podklyucheno && now - t0 >= T_START) { shtora.attach(13); // вспышка тока не совпадает со стартом радио shtora.write(tek); podklyucheno = true; Serial.println("servo podklyuchena"); } if (podklyucheno && tek != tsel && now - tHod >= T_HOD) { tHod = now; if (tsel > tek) tek++; else tek--; shtora.write(tek); }}| Плата | Логика GPIO | Питание серво | Главная грабля |
|---|---|---|---|
| ESP32 DevKit | 3,3 В, серво едет прямо | отдельный 5 В, земля общая | brownout при совпадении с WiFi-вспышкой |
| ESP8266 NodeMCU | 3,3 В | отдельный 5 В | пин D3/D4 — странные пины старта, не для серво |
| Arduino Due | 3,3 В | отдельный 5 В | на GPIO больше 3,3 В не подавать вовсе |
| Nano 33 IoT | 3,3 В | отдельный 5 В | тонкий дорожки: конденсатор обязателен |
Пины на ESP32 выбираются не по привычке, а по таблице старта: GPIO 0, 2, 12 и 15 при включении выдают сигналы, нужные загрузчику, — серво на таком пине дёрнется сама, а на GPIO 12 можно и загрузку скетча сломать. Спокойные пины для серво — 13, 25, 26, 27, 32, 33; полную карту с пояснениями я собирал в уроке про распиновку и опасные пины. Библиотека тоже другая: Servo.h из AVR на ESP32 не ставится, вместо неё ESP32Servo поверх 16 аппаратных каналов LEDC — API тот же attach/write, считать частоты не придётся.
Что здесь спасает на живой плате. Задержка attach убирает совпадение вспышки серво со стартом радио — худший момент для просадки. Мягкий ход по градусу растягивает разгон: шина видит серию коротких вспышек вместо одной длинной, и это тот же приём, что я применял к MG996R в уроке про его токи — серво мелкая, а физика та же. Третий слой — конденсатор 470-1000 мкФ у клемм серво: он держит локально первые десятки миллисекунд хода; про роль таких конденсаторов в сборке я писал в уроке про фильтрующие конденсаторы.
Симулятор ниже крутит движок Uno, но логика та же — и это честная проверка идеи: серво подключается через 800 мс после старта скетча, ходит по градусу и меняет цель по расписанию. На живой ESP32 та же пауза отсекает момент подъёма WiFi, а на Uno просто показывает порядок инициализации.
Отдельная оговорка для Arduino Due: его пины не терпят пяти вольт даже коротким импульсом. В нашей схеме сигнал идёт с Due в серво — это безопасно, но если захотите подать на его вход пять вольт с чужой платы, нужен делитель или буфер; я однажды поспешил с такой перемычкой и лечил порт после минуты жизни.
Сброс, который случается раз в неделю, — самая неприятная разновидность: теория сходится, а воспроизвести нечего. Мой протокол ловли такой: после каждого старта Serial печатает uptime и счётчик перезапусков, а причину последнего сброса плата и сама пишет в UART — строка с brownout ровно в момент хода серво ставит диагноз на месте. Если сброс не связан с серво — снимите её разъём и поживите неделю без неё: исчезновение симптома дороже любой красивой теории. И не верьте первому совпадению: у меня однажды виноват оказался датчик на длинном проводе, а серво всю неделю честно стояла рядом с местом события и собирала комплименты.
Чек-лист питания для 3,3-вольтовых плат
Соберу в один проход то, что в тексте рассыпано по абзацам. Источник: отдельный 5 В на 2-3 А для пары мелких серво, у MG996R — свой расчёт по стопорному току. Земля: общая с платой, одной точкой, без длинных хвостов. Провода: от 0,5 мм² и короче полуметра — каждый лишний метр тонкой жилы на ампере хода стоит целый вольт. Конденсатор: электролит 470-1000 мкФ у клемм серво. Время: attach после подъёма WiFi. Пины: 13/25/26/27/32/33. И никогда — питание серво с пина 3.3V: стабилизатор девкита отдавать чужую периферию не обязан.
Для автономных сборок этот чек-лист смыкается с энергобюджетом: серво, которая ходит по расписанию раз в час, и серво, которая дрожит на удержании круглые сутки, — два разных проекта с разными батарейками; арифметику батарейного питания ESP32 я раскладывал в уроке про энергобюджет. И последнее: если после всего списка плата всё же сбрасывается именно на старте серво — ищите просадку лампочкой в разрыв плюса, как учил урок про пик тока: метод один и тот же на любой плате.
Готовая спецификация моей шторки — чтобы было от чего отсчитывать: BEC 5 В 3 А, электролит 1000 мкФ на клеммнике серво, витая пара к окну, GPIO 13 на сигнал, SG90 с пластиковой качалкой на 40 градусов хода. Сборка пережила зиму на неотапливаемой веранде и две сотни ходов в месяц — не потому, что детали особенные, а потому, что каждый пункт чек-листа закрыт, и ни один из них не стоит дороже бутылки минералки.
- Сигнал 3,3 В серво понимает: вход компаратора, редкие клоны просят буфер 74AHCT125
- Питание — только отдельный 5 В с общим GND; пин 3.3V девкита не для серво
- Brownout-детектор ESP32 сбрасывает чип при провале ниже ~2,4-2,8 В на 3,3 В шине
- attach через 800 мс после старта радио и ход по градусу убирают совпавшие вспышки
- Безопасные пины для серво на ESP32: 13, 25, 26, 27, 32, 33
- 1. Плата печатает Brownout detector was triggered на старте серво. Что произошло?
- 2. Серво ест отдельные 5 В. Куда вести сигнальный провод с GPIO ESP32?
- 3. Почему attach() я двигаю минимум на 800 мс после старта?
- 4. Какой набор пинов безопасен для серво на ESP32 DevKit?
- 5. Серво с ESP32 стоит на отдельном 5 В, но еле дёргается от 3,3 В сигнала. Что проверить первым?
Частые вопросы по теме урока
- Плата печатает Brownout detector was triggered на старте серво. Что произошло?
- Вспышка тока серво просадила питание ниже порога детектора (~2,4-2,8 В). Лечится источником, проводами, конденсатором и разнесением стартов. Шина 3,3 В провалилась ниже порога, и чип ушёл в сброс
- Серво ест отдельные 5 В. Куда вести сигнальный провод с GPIO ESP32?
- Сигнальный вход серво — логический: большинство серво едут от 3,3 В импульсов. Землю серво и платы соединить обязательно. Прямо на сигнальный вход серво — 3,3 В достаточно
- Почему attach() я двигаю минимум на 800 мс после старта?
- Радио на передаче берёт сотни миллиампер; совпавшая с ним вспышка серво складывается в провал и brownout. Пауза развязывает их во времени. Чтобы вспышка тока серво не совпала со стартом радио
- Какой набор пинов безопасен для серво на ESP32 DevKit?
- GPIO 0, 2, 12, 15 участвуют в старте чипа и дёргаются при включении; 6-11 заняты флеш-памятью. Серво — на спокойные пины. 13, 25, 26, 27, 32, 33
- Серво с ESP32 стоит на отдельном 5 В, но еле дёргается от 3,3 В сигнала. Что проверить первым?
- Импульсу с пина не с чем сравниваться без общего провода: земля серво, платы и БП соединяются в одной точке. Второй кандидат — клоны, требующие 5 В сигнала. Общую землю между платой и источником серво