Пятница, восемь вечера: на столе девкит ESP32-S3, а в меню Инструменты — Плата — только AVR-линейка: Uno, Nano, Mega. Среда не сломана — по умолчанию она знает ровно те платформы, что приехали с установкой, и ни о каком другом мире не слышала. Дорога к чужим платам проходит через два места: поле URL в настройках и менеджер плат. В первый раз я вставил туда адрес с хвостовым пробелом и следующие двадцать минут искал плату, которой не существовало: менеджер молчал так убедительно, будто в настройки никто не лазил.
Разбираю конвейер целиком: откуда среда берёт список плат (короткий ответ — из скачанных JSON-индексов, а не из интернета напрямую), куда падают сотни мегабайт toolchain после нажатия Install, как сносить ставшее лишним и почему поиск в менеджере иногда глух. Пошаговая установка ESP32 с адресом пакета и лечением вечного Connecting — в уроке про Boards Manager Espressif; здесь — механика, общая для любой сторонней платы, от ESP8266 до ATTinyCore.
Маршрут один и тот же для всех: ATTinyCore встаёт тем же способом, что и ESP32, — один URL, одна кнопка в менеджере, и в меню вылезает дюжина мелких чипов, которых Arduino в глаза не видела; запись фьюзов и периферия ATtiny — отдельная история про прошивку ATtiny85. Когда платформа встала, плата выбирается и порт назначается так же, как для Uno, — про этот выбор я разбирал в уроке про плату и порт. Дальше — только различия.
URL в настройках: дверь к индексам
Механика. При старте и при обновлении IDE читает адреса из File — Preferences — Additional boards manager URLs; адреса через запятую, их может быть сколько угодно. Каждый адрес обязан указывать прямо на JSON-файл индекса пакета: package_esp32_index.json у Espressif, package_esp8266com_index.json у ESP8266-команды, drazzy-индекс для ATTinyCore. Ссылка на страницу репозитория или раздел сайта производителя менеджеру бесполезна — он не умеет вытаскивать JSON из HTML. Скачанные индексы лежат в кэше внутри папки настроек: на Windows это AppData\Local\Arduino15, на Linux ~/.arduino15, на macOS ~/Library/Arduino15 — и только после разбора кэша платы всплывают в меню.
Первая и самая частая засада — невидимый пробел после вставки адреса: индекс не скачивается, менеджер молчит, плата не находится, а виноват хвост пробела, которого в поле не видно. Лечение примитивное: стереть хвосты, пересчитать запятые-разделители, перезапустить. Вторая засада из той же серии — вставленный адрес ведёт на GitHub-страницу проекта: глазу выглядит правильно, а менеджеру нужен сырой JSON, у Espressif это espressif.github.io/arduino-esp32/package_esp32_index.json. Третья — несколько адресов через точку с запятой: разделитель ровно один, запятая.
Куда падают сотни мегабайт
Кнопка Install в карточке платформы — это не «скачался один файл»: пакет тянет toolchain, то есть собственный компилятор (avr-gcc для AVR, xtensa-esp32-elf для ESP32), ядро, загрузчики и вспомогательные утилиты. Всё это ложится в packages внутри той же Arduino15: packages/esp32/hardware/esp32/<версия>. Счёт при установке ESP32 идёт на сотни мегабайт и десятки минут на медленном канале, поэтому портативная среда с флешки выигрывает дважды: окружение переезжает вместе с папкой, а второй компьютер получает всё без единого скачивания — детали в уроке про портативную IDE.
Снос работает зеркально. В карточке платформы есть кнопка Remove: она убирает платформу целиком вместе с toolchain. Если карточка спотыкается или осталась папка от старой версии, packages/<имя> выносится вручную — платформа исчезает из меню после перезапуска. Тот же конвейер доступен из терминала через arduino-cli: core update-index пересобирает индексы, core install ставит платформу без окна менеджера — удобно и для CI, и для вечера, когда IDE зависла на полпути установки.
У папки Arduino15 есть свойство, которое я оценил, когда обновление ESP32-платформы сломало сборку посреди проекта: её можно переименовать целиком. Среда при следующем старте создаст пустую папку и скачает только официальное AVR-ядро, а старая, со всеми toolchain и версиями внутри, возвращается обратным переименованием — без переустановки среды и без повторной закачки сотен мегабайт. Туда же примыкает офлайн-план: без сети среда стартует на кэше индексов, установленные платы остаются в меню, новые версии не приезжают. Отсюда правило выездной работы: платформы качаю заранее, пока ноутбук дома и канал быстрый.
// Макросы платформы пишет система сборки из карточки платы в boards.txt.// Соберите тот же скетч под Uno, Nano и ESP32 - паспорт поменяется// без единой правки кода. Проверка, что платформа встала и выбрана верно. void setup() { Serial.begin(9600); Serial.println("--- pasport sborki ---");#if defined(ARDUINO_ARCH_AVR) Serial.println("platforma: AVR");#elif defined(ARDUINO_ARCH_ESP32) Serial.println("platforma: ESP32");#elif defined(ARDUINO_ARCH_ESP8266) Serial.println("platforma: ESP8266");#else Serial.println("platforma: drugaya");#endif Serial.print("F_CPU, Gerc: "); Serial.println((unsigned long)F_CPU); Serial.print("versiya API: "); Serial.println(ARDUINO);} void loop() { delay(2000);}Индекс скачался, а платы нет
Классический набор с форумов за 2024 год однообразен. Человек добавляет адрес Adafruit или RAK, перезапускает IDE, ищет плату в менеджере — и тишина. В половине разборов виноват один из трёх пунктов: пробел или перенос строки внутри URL, адрес на страницу вместо JSON, непересобранный кэш индексов. Реже всплывает четвёртый: прокси или антивирус режет скачивание, индекс остаётся в кэше обрезанным, и менеджер спотыкается уже на разборе файла. Диагностика идёт по возрастанию усилий: сначала глазом в поле URL, потом перезапуск среды, потом кэш.
Мой порядок диагностики собрался на десятке чужих вечеров. Сначала читаю адрес в поле вслух, посимвольно: хвостовой пробел глаз перескакивает десятки раз, а паузу слышно сразу. Дальше выключаю все адреса разом и вставляю по одному: после каждой вставки — обновление менеджера и взгляд в поиск. Виновник находится за столько шагов, сколько было адресов, а не за вечер перебора гипотез. И после самого первого Install я всё равно перезапускаю среду: на 1.8.x встречал меню, которое новые платы показывало только со второго старта, а монитор порта перед первой прошивкой свежей платформы закрываю — экономит минуту недоумения.
Отдельная история — дубли. Если одна платформа доступна из двух индексов, например свой старый адрес производителя плюс официальный, в меню вырастают два одинаковых пункта платы, и прошивка уходит в непонятно какую версию ядра. Правило жёсткое: один источник на платформу. Лишний URL из настроек убрать, ставшую ненужной платформу снести через packages, после перезапуска убедиться, что пункт остался один. И помните: поиск в менеджере плат не гуглит интернет — он ищет только по скачанным индексам. Нет платы в выдаче — сначала проверьте адрес в настройках, потом ищите по короткому слову названия.
| Ситуация | Причина | Лечение |
|---|---|---|
| URL вставлен, платы в поиске нет | пробел в адресе или ссылка на страницу вместо JSON | стереть хвосты, вставить прямой адрес индекса, перезапуск |
| Установка обрывается на середине | прокси или антивирус режет скачивание toolchain | заново после снятия фильтра; путь профиля без кириллицы |
| Два одинаковых пункта платы в меню | платформа доступна из двух индексов сразу | один URL на платформу, лишнюю копию снести |
| Сторонние платы пропали после апдейта | кэш индексов пересобирается заново | дождаться обновления, сверить URL в настройках |
Рабочая привычка, которая окупается при каждом переезде: в репозиторий проекта, рядом со скетчами, кладётся текстовый файл с адресами индексов и версиями платформ. Новый компьютер: три вставки в настройки, три кнопки Install — и через час окружение на месте. В командной работе версию платформы стоит фиксировать: 3.1.1 и 3.0.х собирают один и тот же скетч с разными допущениями, и различия вылезают через месяц, когда уже не отыскать, что поменялось. Про фиксацию версии в карточке и в терминале читайте в уроке про портативную IDE и версии.
Отдельная грабля — два профиля на одной машине. Arduino15 лежит внутри профиля пользователя, поэтому платформа, установленная из-под учётки администратора, обычной учётке не видна: у той свой пустой путь, свои сотни мегабайт и та же история по кругу. Проверка занимает минуту: какая учётка запустила среду, из-под неё и ставим, иначе Install отработает, а платы в меню не появится.
Не перепутайте два менеджера: библиотеки живут отдельно от плат, у них свои индексы и своя установка в один клик. Платформы ложатся в packages, библиотеки — в папку libraries скетчбука, и смешение этих миров — верный способ потерять вечер в поисках того, что никуда не пропадало. Правду о пинах свежеустановленной платы ищите в картах распиновки — следующий урок кластера.
- 1. Где IDE хранит скачанные индексы платформ?
- 2. Какой адрес можно вставлять в Additional boards manager URLs?
- 3. Что на самом деле происходит при Install платформы ESP32?
- 4. В меню две одинаковые платы с одним именем. Что делать?
- 5. Почему поиск в менеджере плат не находит плату по названию?
- IDE узнаёт о сторонних платах из JSON-индексов: URL в File — Preferences через запятую, ссылка обязана вести прямо на индекс
- Кэш индексов живёт в Arduino15 (Windows: AppData\Local, Linux: ~/.arduino15), toolchain после Install ложится в packages/<платформа>
- Пробел в URL и ссылка на страницу вместо JSON — две главные причины молчащего менеджера плат
- Remove в карточке сносит платформу целиком; arduino-cli core update-index и core install делают то же из терминала
- Один источник на платформу: дубли меню растут из двух индексов, а поиск в менеджере не гуглит интернет
Частые вопросы по теме урока
- Где IDE хранит скачанные индексы платформ?
- Скачанные индексы лежат в Arduino15 (Windows: AppData\Local, Linux: ~/.arduino15, macOS: ~/Library/Arduino15). Менеджер плат ищет по ним, а не по интернету. в кэше внутри папки настроек Arduino15
- Какой адрес можно вставлять в Additional boards manager URLs?
- Менеджер умеет качать JSON-индекс и разбирать его. Страницы и репозитории он не читает: нужен прямой адрес файла вида package_esp32_index.json. только прямой путь до JSON-индекса пакета
- Что на самом деле происходит при Install платформы ESP32?
- Пакет — это toolchain (xtensa-esp32-elf), ядро, загрузчики и утилиты. Всё ложится в Arduino15/packages/esp32, счёт идёт на сотни мегабайт. тянутся компилятор, ядро и утилиты — сотни мегабайт
- В меню две одинаковые платы с одним именем. Что делать?
- Дубли вырастают из двух индексов для одной платформы. Один источник на платформу; лишняя копия сносится через packages или Remove в карточке. оставить один источник: снести лишний URL и копию платформы
- Почему поиск в менеджере плат не находит плату по названию?
- Поиск идёт по локальным индексам. Если нужного индекса нет в настройках или он не скачался, платы в выдаче не будет. поиск идёт только по скачанным индексам, а не по интернету