Девкит ESP32 на 38 выводов лежит на столе, светодиод перекочевал на ножку GPIO11 — и при первой же прошивке плата отваливается: порт пропадает, загрузка падает. Маленькая карта из набора подписывает GPIO11 как «свободный ввод-вывод», и только полная карта сообщества поясняет правду: GPIO6–GPIO11 подключены к внутренней флеш-памяти чипа, и любая цепь на них роняет плату. Полчаса на поиск причины — цена неправильной карты.
Карта распиновки — первый документ, который я открываю на новой плате, раньше любой библиотеки. Здесь разбираю, как читать pinout за пять минут по цветным зонам, где живёт машинная правда о пинах — файл pins_arduino.h внутри платформы — и почему для ESP32 карту нужно подбирать под свою ревизию девкита: раскладки v1 и v4 различаются.
Что такое цифровой и аналоговый пин, считаю пройденным: чтение АЦП с потенциометром разобрано в уроке про analogRead. Здесь навигация: где у платы ШИМ, где АЦП, где интерфейсы, какие ножки заведомо свободны и какие заложены минами. Выбор платы в меню, к которой относится карта, — в уроке про плату и порт.
Цветные зоны: pinout за пять минут
Официальная карта Uno на arduino.cc подписывает каждый вывод всеми функциями сразу: цифровой номер, тильда ШИМ, буквы АЦП, интерфейсы. Читается по зонам. Питание: VIN, 5V, 3V3, GND — куда можно совать провода, а куда нет. Цифровые 0–13, из них ШИМ-ножки помечены тильдой: 3, 5, 6, 9, 10, 11. Аналоговые A0–A5. Интерфейсы: TX/RX на 0 и 1, I2C на A4/A5 — у Uno выведенные ещё раз отдельными пинами SDA/SCL, SPI на 10–13. Особые: AREF, RESET, IOREF.
Порядок работы с картой у меня такой: сначала питание — какие напряжения где и с каким потолком тока; потом интерфейсы — не заняты ли I2C и SPI чужими устройствами; только потом свободные ножки под периферию. Ножка получает провод после двух подтверждений: пин свободен и умеет нужное. Для Mega счёт пинов другой и ШИМ-зона шире — карты и отличия в уроке про Mega 2560.
Питание по карте читается до периферии, а не после первого рестарта. Линия 5V при работе от USB ограничена портом компьютера, и три серво SG90 с их стартовыми рывками просаживают её до перезагрузки платы — тонкости в уроке про подключение SG90, катушки вообще уводят на отдельный источник с общей землёй. VIN принимает то, что пришло на баррель, — 7–12 В, и при входе выше карта честно подскажет напряжение, но не покажет перегрев стабилизатора.
Чего на карте не видно вовсе — токовые потолки. Ножка ATmega328P держит 40 мА как абсолютный максимум, рабочий потолок вдвое ниже, и сумма по чипу тоже ограничена. Восемь индикаторов по 20 мА — уже под завязку, поэтому длинные гирлянды и матрицы вешают на сдвиговые регистры или драйверы. Я привык подписывать на распечатанной карте нагрузку у каждой задействованной ножки: светодиод через резистор 220 Ом — можно, реле с катушкой на 70 мА — только через транзистор.
Ножки 0 и 1 подписаны RX и TX не для красоты: через них загрузчик заливает скетч, и тот же канал делит USB-мост с вашей периферией. Модуль, который держит пин 0, способен не пустить прошивку — среда повиснет на Uploading. Правило простое: на момент загрузки провода с 0 и 1 сняты, постоянная периферия живёт со второй ножки и выше; у Mega серийных пар больше, и карта подскажет, какая свободна от моста.
Особые ножки тоже стоят пары слов. IOREF выдаёт уровень логики платы — 5 В у Uno, — по нему шилды понимают, с какими сигналами им жить. AREF — вход опорного напряжения АЦП: внешний источник туда подают не выше 5 В и лучше через резистор в несколько килоом, чтобы внутренняя опора не спорила с внешним. На моих платах AREF всегда пуст: штатной опоры хватает, а рисковать первым каналом АЦП ради сотых долей вольта смысла нет.
Машинная правда: pins_arduino.h
Правду IDE держит не на плакате, а в файле variants платформы: packages/arduino/hardware/avr/1.8.x/variants/uno/pins_arduino.h. Там определены LED_BUILTIN, PIN_A0, константы SS, MOSI, SCK, SDA, SCL и макрос analogInputToDigitalPin. Из того же файла собирается меню платы: плакат на сайте рисуют люди и иногда промахиваются, файл читает компилятор и промахивается реже. В IDE 2 достаточно Ctrl+клика по LED_BUILTIN в коде — редактор откроет pins_arduino.h и покажет всю карту целиком.
Макросы зависят от выбранной платы: собрали паспорт под Uno, а скетч поедет на Nano — числа совпадают не все. Хрестоматийный случай: A6 и A7 на Nano — только аналоговые входы, analogInputToDigitalPin для них возвращает -1, и digitalWrite на них не работает вовсе. Клон Nano раскладку не меняет — отличия у клонов в мосте и защите, разбор оригинала и клона; старый bootloader — отдельная тема про Nano со старым загрузчиком.
// Спросите ядро, а не память: макросы из pins_arduino.h печатают паспорт.// Соберите под Uno и под Nano - разница вылезет на A6/A7: там -1. void setup() { Serial.begin(9600); Serial.print("LED_BUILTIN = "); Serial.println(LED_BUILTIN); Serial.print("SS = "); Serial.print(SS); Serial.print(", SDA = "); Serial.print(SDA); Serial.print(", SCL = "); Serial.println(SCL); for (int a = 0; a < 8; a++) { Serial.print("analog "); Serial.print(a); Serial.print(" -> digital "); Serial.println(analogInputToDigitalPin(a)); }} void loop() {}ESP32: карта с минным полем
Классический чип ESP32 держит четыре группы мин. GPIO6–GPIO11 сидят на внутренней SPI-флеш: на части девкитов они выведены на разъём и подписаны как обычные GPIO, но любая цепь на них роняет загрузку — треды форумов 2024 года этим и полнятся. GPIO34–GPIO39 — только вход: цифрового выхода нет, внутренних подтяжек нет, кнопку без внешнего резистора туда не соберёшь. Строп-пины GPIO0, GPIO2, GPIO5, GPIO12, GPIO15 читаются при старте: высокий уровень на GPIO12 (линия MTDI) ставит питание флеша на 1,8 В, и плата молчит после включения — классическая грабля с кнопкой на 12-й ножке.
АЦП тоже делятся: ADC2 уходит целиком, когда поднимается WiFi, поэтому датчики в WiFi-проектах живут на ADC1 — ножки GPIO32–GPIO39. Светодиод у многих девкитов стоит на GPIO2. Модули WROVER держат GPIO16/17 под PSRAM — для внешних цепей они мертвы. И главное: у плат v1 на 30 пинов и v4 на 36–38 пинов раскладка краёв различается, карту берите под свою ревизию. Сама плата ставится через менеджер — установка ESP32 в IDE.
Силовая сторона карты ESP32 — отдельная строка. Логика чипа трёхвольтовая: ножка выдаёт 3,3 В, светодиоду это без разницы, а вот модулям, рассчитанным на пять вольт, нужен преобразователь уровня — на картах об этом молчат обе. Питание при WiFi-передаче ест пиками до полумпера: просевший хаб или тонкий длинный кабель роняют плату ровно на отправке. Если перезагрузки совпадают с включённым WiFi, первым делом меняю кабель на короткий и толстый, потом уже лезу в код.
| Плата | Где правда о пинах | Главная ловушка |
|---|---|---|
| Uno R3 | официальная pinout-карта на arduino.cc | пин 13 завязан на светодиод, I2C — на A4/A5 |
| Nano и клоны | карта оригинала плюс разбор клона | A6/A7 только аналоговые, CH340 вместо FT232 |
| ESP32 DevKit | карта под свою ревизию: v1 или v4 | GPIO6–11 флеш, стропы 0/2/5/12/15, 34–39 вход |
| Mega 2560 | официальная карта и отличия | ШИМ на 2–13, I2C ушёл на 20/21 |
Привычка за пять минут: перед первым проводом — карта своей ревизии, скриншот в папку проекта рядом со скетчами. Сомнительная ножка сначала проходит мигалкой — десять строк и delay, — и только потом занимает место в проекте. Карту, список URL и версии платформ я храню в одном месте с проектом: переезд на новый компьютер тогда сводится к трём вставкам из урока про менеджер плат.
Ритуал, который сберёг не один вечер: распечатанная карта и карандаш. Каждый занятый пин обводится и подписывается одним словом — серво, датчик, шина. Через месяц список говорит больше, чем код: на Uno из шести ШИМ-ножек свободна одна, и новый прибор с ШИМ-входом встанет либо туда, либо на Mega с её широкой зоной. Без такой разметки я дважды восстанавливал макетку по фотографиям и больше не хочу.
Перенос скетча между платами — отдельная проверка: макросы из pins_arduino.h дадут новые числа, а карта подскажет, где у новой платы ШИМ и АЦП. Яркость и паузы держите на analogWrite и millis, чтобы плата оставалась отзывчивой, пока вы листаете карту. Дальше по кластеру — схемы плат: почему скетч рестартует при открытии монитора и за что отвечает полифьюс.
- 1. Что за ножки GPIO6–GPIO11 на девките ESP32?
- 2. Где машинная правда о пинах платы?
- 3. Почему digitalWrite не мигает на A6 у Nano?
- 4. Чем плохи GPIO34–GPIO39 у ESP32?
- 5. Кнопка держит GPIO12 в HIGH при включении. Что будет?
- Карта читается по зонам: питание, цифровые, ШИМ-тильда, АЦП, интерфейсы; ножка получает провод после двух подтверждений — свободна и умеет нужное
- Машинная правда о пинах — pins_arduino.h в variants платформы; Ctrl+клик по LED_BUILTIN открывает его в IDE 2
- A6/A7 Nano и Mini — только АЦП: analogInputToDigitalPin возвращает -1, digitalWrite не работает
- ESP32: GPIO6–11 держит флеш, 34–39 только вход без подтяжек, стропы 0/2/5/12/15; ADC2 молчит при WiFi — датчики на ADC1
- Карту ESP32 берите под свою ревизию: v1 на 30 пинов и v4 на 36–38 раскладывают ножки по-разному
Частые вопросы по теме урока
- Что за ножки GPIO6–GPIO11 на девките ESP32?
- GPIO6–GPIO11 подключены к интегрированной SPI-флеш чипа. На части девкитов они выведены на разъём, но любая цепь на них роняет загрузку платы. линии внутренней SPI-флеш, использовать нельзя
- Где машинная правда о пинах платы?
- Файл variants/<плата>/pins_arduino.h внутри пакета платформы. Из него же собирается меню платы; Ctrl+клик по LED_BUILTIN открывает его в IDE 2. в pins_arduino.h внутри variants платформы
- Почему digitalWrite не мигает на A6 у Nano?
- A6 и A7 на ATmega328P в корпусе TQFP не имеют цифровой части: analogInputToDigitalPin возвращает -1, digitalWrite на них не работает. A6 — только аналоговый вход, цифрового выхода нет
- Чем плохи GPIO34–GPIO39 у ESP32?
- GPIO34–GPIO39 — входы-только без внутренних подтяжек. Кнопка туда ставится с внешним резистором, светодиод — никогда. только вход: выходов и внутренних подтяжек нет
- Кнопка держит GPIO12 в HIGH при включении. Что будет?
- GPIO12 — строп-пин MTDI: высокий уровень при старте ставит питание флеша на 1,8 В вместо 3,3 В, и чип молчит. Стропы: 0, 2, 5, 12, 15. питание флеша настроится на 1,8 В, плата не стартует