Второй проект на ESP32 встал у меня молча и наглухо. Собирал ночью комнатный термометр: датчик повесил на GPIO 12 — так было удобнее по разводке макетки, подал питание — и плата ушла в бесконечную перезагрузку ещё до первой строки моего скетча. Привычное с Uno «любой свободный пин почти годится» здесь не работало: снимаю провод с 12-го — грузится, возвращаю — циклический ребут с мусором в мониторе. Час я менял блок питания, второй — перешивал прошивку, пока не набрал в поиске слово strapping.
В этом уроке рисуем карту DevKit так, как я нарисовал её себе той ночью: где питание, за что отвечают две кнопки, какие пины чип читает при каждом сбросе и какие вообще не умеют быть выходами. После неё датчик встанет на первый раз без единого ребута. Карту стоит сохранить: она пригождается при каждом новом датчике, а не только сегодня вечером.
Карта платы: питание, кнопки, светодиод
Разбираем DevKit V1 на 38 пинов — самый ходовой вариант. По длинным сторонам гребёнки сидят: VIN (принимает 5 В от внешнего блока), 3V3 (отдаёт 3.3 В датчикам; с этого пина можно снять не больше пары сотен миллиампер — тяжёлую периферию питайте от VIN), GND, EN — сброс платы, и ряды GPIO. Кнопок на плате две: EN перезапускает чип, BOOT прижимает GPIO 0 к земле — пригодится при прошивке. USB-мост почти всегда CP2102, на клонах бывает CH340: если плата не появляется в списке портов, дело обычно в драйвере моста — за этим мы ходили в отдельный урок, а сам порядок подключения платы я показывал в материале про первый запуск. Надписи на шёлке платы читаются как подсказка: VP и VN — это 36-й и 39-й пины, G с цифрой — обычный GPIO, а 3V3 и VIN кормят схему.
Встроенный светодиод подключен к GPIO 2 и зажигается высоким уровнем. Пины 6–11 на гребёнке вы не найдёте: они заведены на внутреннюю flash-память, любое попадание на них роняет и прошивку, и загрузчик; на 30-пиновых платах их нет вовсе — это нормально. Если в каталоге встретите плату с надписями SD_* на этих позициях, это та же внутренняя flash, выведенная для отладки: новичку туда нечего ставить. И общий фон всей карты: логика строго 3.3 В, никакой толерантности к 5 В, в отличие от Uno.
| Пин | Почему опасен | Как жить |
|---|---|---|
| GPIO 0 (BOOT) | Страппинг: LOW при сбросе переводит чип в режим прошивки | Кнопкам и датчикам выбрать другой пин |
| GPIO 2 | Страппинг: при прошивке должен быть свободен или LOW; связан со светодиодом | Выход — можно, сильная подтяжка к питанию — нет |
| GPIO 12 (MTDI) | HIGH при сбросе ставит flash на 1.8 В — плата перестаёт грузиться | Не подключать датчики с подтяжкой к 3.3 В |
| GPIO 15 (MTDO) | LOW при сбросе глушит отладочный лог загрузки | Использовать можно, но при отладке учтите молчание лога |
| GPIO 34–39 | Только вход, внутренней подтяжки нет | Кнопке нужен внешний резистор 10 кОм |
| GPIO 6–11 | Внутренняя flash-память чипа | Не трогать; на DevKit их обычно нет на гребёнке |
Strapping: что чип читает до вашего кода
Страппинг — механизм, из-за которого плата ведёт себя по-разному ещё до скетча. При каждом сбросе внутренний загрузчик замеряет уровень на нескольких ножках. GPIO 0 решает, откуда стартовать: HIGH — грузить прошивку из flash, LOW — ждать прошивку по UART. На этой паре держится вся заливка скетча: среда сама дёргает нужные линии через USB-мост, поэтому кнопка BOOT в обычной жизни не нужна. Кстати, те же линии среда дёргает при заливке — ещё один довод держать периферию подальше от страппинга: датчик на 12-м пине мешает не только запуску, но и прошивке.
GPIO 12 хитрее: по уровню на нём чип выбирает напряжение питания flash-памяти. Единица на MTDI в момент сброса говорит чипу — flash работает на 1.8 В. На DevKit стоит обычная 3.3-вольтовая микросхема flash, чип пытается говорить с ней на пониженном напряжении, читает мусор и циклится до первой строки скетча. Мой датчик с подтяжкой данных к 3.3 В как раз держал линию в единице. Диагноз ставится за минуту, если о механизме знать: снимаешь провод — грузится.
GPIO 15 мягче: LOW при сбросе лишь прячет отладочный лог, на работу прошивки не влияет. Но когда вы ищете, почему плата молчит при старте, вспомните, не сидит ли что-то и на 15-м тоже. Сам я 15-й использую спокойно, но в отладочных сборках держу его свободным.
Безопасный набор пинов
Рабочий набор, на котором я собираю первые схемы: 16 и 17 — чистые выходы без страппинга (они же второй аппаратный UART), 21 и 22 — I2C-шина для экранов и датчиков, 18, 19 и 23 — SPI, 25 и 26 — вдобавок цифро-аналоговые выходы, 27, 32 и 33 — универсалы. Любой из них умеет и цифру, и ШИМ: генератор LEDC в ESP32 не привязан к паре пинов, как на Uno, а разводится почти на любой GPIO. Отдельный бонус — пара 16 и 17: на Uno второй UART приходилось эмулировать библиотекой SoftwareSerial с её ограничениями по скорости, а здесь он аппаратный и работает без компромиссов.
Входы 34, 35, 36 и 39 — отдельная каста. Они только слушают: выхода из них не сделать, внутренней подтяжки нет. Кнопка на 34-м без внешнего резистора 10 кОм даст болтающийся вход и случайные срабатывания — та же физика, что в уроке про digitalRead, только там вы спасались режимом INPUT_PULLUP со встроенным резистором, а здесь встроенного нет. Номинал подбирается по цветовым полоскам — мы это делали в уроке про код резисторов. Зато эти пины живут на контроллере ADC1 и работают при включённом WiFi: аналоговый датчик вешаем именно сюда.
Про шум на аналоговых входах: провод к датчику длиннее полуметра — уже повод поставить конденсатор 100 нФ у входа платы. 12-битный ADC и так пляшет на плюс-минус 30–50 единиц, а длинный провод добавит ещё и наводки от того же WiFi. Для точных замеров усредняйте десяток чтений подряд — кашу из единичных сэмплов ни один график не выпрямит.
Заметьте, как мало в этом скетче специфического: тот же pinMode и digitalWrite, что и в первой мигалке на Uno. Специфика ESP32 не в коде, а в выборе пина до кода — за это и отвечает карта выше. Дальше два пути: подключить кнопку по-честному, с подтяжкой, или заняться шиной I2C — два провода SDA и SCL как раз сидят на пинах 21 и 22 из безопасного набора — экран SSD1306 или датчик BME280 встанут туда же, и ни один страппинг-пин не пострадает. А в следующем уроке зальём первый скетч на настоящую плату и помигаем светодиодом по-взрослому — с кнопкой BOOT, если среда закапризничает.
- 1. Что произойдёт при LOW на GPIO 0 в момент сброса платы?
- 2. Датчик с подтяжкой данных к 3.3 В подключен к GPIO 12. Что при старте?
- 3. Чем плохи GPIO 34–39?
- 4. Нужен аналоговый датчик при активном WiFi. Какие пины брать?
- 5. Какие пины нельзя вешать на периферию ни при каких условиях?
- GPIO 0, 2, 12, 15 — страппинг: их уровень при сбросе читает загрузчик, периферию с подтяжкой к питанию туда не вешаем
- Единица на GPIO 12 при старте заставляет чип искать flash на 1.8 В — бесконечный ребут до первой строки скетча
- 34–39 — только вход и без подтяжек: кнопке нужен внешний резистор 10 кОм
- Аналоговые датчики при WiFi — только на ADC1 (GPIO 32–39); ADC2 при активной сети мёртв
- 6–11 — внутренняя flash; безопасный набор для первых схем: 16, 17, 21, 22, 18, 19, 23, 25, 26, 27, 32, 33
Частые вопросы по теме урока
- Что произойдёт при LOW на GPIO 0 в момент сброса платы?
- GPIO 0 — стрраппинг-пин режима загрузки: HIGH при сбросе означает запуск прошивки из flash, LOW — ожидание прошивки по UART. Кнопка BOOT как раз прижимает его к земле. Чип войдёт в режим прошивки по UART
- Датчик с подтяжкой данных к 3.3 В подключен к GPIO 12. Что при старте?
- По уровню на GPIO 12 (MTDI) чип выбирает напряжение flash. Единица при сбросе — 1.8 В вместо нужных 3.3 В, flash читается мусором, плата циклится. Провод с датчика достаточно перекинуть на соседний пин — и плата оживает. Чип решит, что flash на 1.8 В, и уйдёт в цикл перезагрузок
- Чем плохи GPIO 34–39?
- Пины 34–39 физически не имеют выходного каскада и подтяжек. Для кнопки нужен внешний резистор около 10 кОм, светодиодом с них не помигаешь. Только вход, внутренней подтяжки нет
- Нужен аналоговый датчик при активном WiFi. Какие пины брать?
- ADC2 (пины 0, 2, 4, 12–15, 25–27) отключается при активном WiFi. Рабочие аналоговые входы при сети — только ADC1 на пинах 32–39. Пины 25 и 26 — это ЦАП, выходы. GPIO 32–39: контроллер ADC1 работает при сети
- Какие пины нельзя вешать на периферию ни при каких условиях?
- GPIO 6–11 обслуживают flash-память чипа: любое подключение роняет и прошивку, и загрузчик. Остальные перечисленные — нормальные рабочие пины. GPIO 6–11 — они на внутренней flash