Ошибки Arduino IDE: компиляция, загрузка и порт
Ошибки Arduino IDE пугают в основном тем, что среда показывает их одним красным блоком, а настоящая причина прячется где-то в середине. Ниже — разбор частых ошибок компиляции и загрузки для плат Arduino, ESP32 и ESP8266: что означает текст, из-за чего он появляется и что делать. Начните с первых двух разделов — они экономят больше времени, чем все остальные вместе взятые.
Главное правило: последняя строка бесполезна
Самый частый вопрос новичка — «что такое exit status 1». Это не ошибка, а код
возврата компилятора: он просто сообщает, что сборка не удалась. То же с
Compilation error: exit status 1 в заголовке панели. Настоящая причина всегда
выше, в первой красной строке вывода.
sketch.ino:12:3: error: 'digitalWrte' was not declared in this scope
digitalWrte(13, HIGH);
^~~~~~~~~~~
exit status 1
Compilation error: exit status 1
Читать нужно строку с error: — здесь опечатка в digitalWrite. Если ошибок
несколько, исправляйте самую первую: остальные часто оказываются её следствием
и исчезают сами.
Формат строки всегда одинаковый: файл:строка:столбец: error: описание. Двойной
клик по этой строке в Arduino IDE переносит курсор ровно в место ошибки.
Включите подробный вывод
По умолчанию IDE прячет команды компилятора и загрузчика. Для разбора нетривиальных проблем это стоит включить: File → Preferences (Файл → Настройки), галочки Show verbose output during: compile и upload.
После этого в консоли будут видны реальные вызовы avr-g++, avrdude и esptool,
пути к библиотекам и порту. Именно в этом выводе видно, что среда, например,
подхватила не ту версию библиотеки или обращается к другому порту.
Ошибки компиляции
No such file or directory
sketch.ino:1:10: fatal error: Servo.h: No such file or directory
#include <Servo.h>
^~~~~~~~~
Библиотека не установлена или называется иначе. Откройте Sketch → Include Library
→ Manage Libraries (Скетч → Подключить библиотеку → Управлять библиотеками),
найдите её по имени из #include и установите. Если библиотека ставилась вручную —
проверьте, что папка лежит в Документы/Arduino/libraries/ и содержит файл с тем же
именем, что в #include.
Регистр имеет значение на macOS и Linux: #include <servo.h> не найдёт файл
Servo.h. Windows такую ошибку прощает, поэтому скетч «работал у автора», но не
собирается у вас.
was not declared in this scope
error: 'Servo' was not declared in this scope
Три типичные причины, в порядке вероятности: опечатка в имени; забытый #include
для типа или функции; переменная объявлена внутри setup(), а используется в
loop(). В последнем случае вынесите объявление на уровень файла — выше setup().
expected ';' before / expected '}' at end of input
Синтаксис: пропущена точка с запятой или не закрыта фигурная скобка. Компилятор указывает на строку, где заметил проблему, а реальный пропуск обычно строкой выше. Выделите весь код и нажмите Ctrl+T (Cmd+T на macOS) — автоформат сместит отступы и незакрытый блок станет видно сразу.
Please select a board / No board selected
Плата или порт не выбраны. Tools → Board и Tools → Port, либо выпадающий список вверху окна IDE 2.x. Если нужной платы нет в списке — не установлен пакет поддержки: для ESP32 это настройка Arduino IDE для ESP32, для официальных плат — настройка под платы Arduino.
Low memory available / Global variables use 2048 bytes
Sketch uses 8102 bytes (26%) of program storage space.
Global variables use 1953 bytes (95%) of dynamic memory, leaving 95 bytes for local variables.
Low memory available, stability problems may occur.
Это предупреждение, а не ошибка: скетч соберётся и зальётся, но при нехватке ОЗУ плата начнёт вести себя непредсказуемо — виснуть, перезагружаться, печатать мусор в монитор порта. У ATmega328P (UNO, Nano) всего 2048 байт ОЗУ, и строковые литералы съедают их первыми.
Быстрый способ освободить память — обернуть строки в макрос F(), тогда они
останутся во flash и не будут копироваться в ОЗУ:
Serial.println(F("Инициализация завершена"));
Дальше по эффективности: заменить String на обычные char[], перевести константные
таблицы в PROGMEM, уменьшить размеры массивов и буферов.
Sketch too big
Sketch uses 267543 bytes (102%) of program storage space. Maximum is 262144 bytes.
text section exceeds available space in board
Скетч не помещается во flash. На ESP32 это лечится сменой разметки: Tools →
Partition Scheme → например, Huge APP (3MB No OTA/1MB SPIFFS). На AVR-платах
выхода два — чистить код или брать плату с большей памятью (Mega 2560).
Ошибки загрузки: платы AVR (UNO, Nano, Mega)
stk500_getsync(): not in sync
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
Загрузчик не отвечает. Проверяйте по порядку:
- Правильный порт. Отключите плату, посмотрите список портов, подключите — появившийся порт и есть нужный.
- Правильная плата. Nano вместо UNO даёт ровно эту ошибку.
- Пины 0 и 1 свободны. RX/TX заняты загрузчиком: любой модуль (Bluetooth, GPS, второй Serial) на этих пинах блокирует прошивку. Отсоедините на время загрузки.
- Кабель с линиями данных. Дешёвые кабели «только для зарядки» дают питание, светодиод горит, но данных нет.
- Nano с китайского маркетплейса — почти всегда старый загрузчик, см. ниже.
Nano не прошивается: старый загрузчик
Если предыдущие пункты не помогли и плата — Arduino Nano из недорогих, откройте
Tools → Processor и выберите ATmega328P (Old Bootloader). На такие платы
записан загрузчик старой версии, который общается на скорости 57600 вместо 115200,
и при неверном выборе вы получаете всё тот же stk500_getsync().
Обратная ситуация тоже бывает: на новой плате выбран Old Bootloader, и она молчит ровно так же. Если не знаете, какой у вас, — просто попробуйте оба варианта.
avrdude: Expected signature
avrdude: Expected signature for ATmega328P is 1E 95 0F
Double check chip, or use -F to override this check.
Связь с платой есть, но подключённый микроконтроллер оказался не тем, который ждёт выбранная плата. Переключение на Old Bootloader здесь не поможет — оно меняет скорость обмена, а не сигнатуру чипа. Проверяйте другое:
- Выбранная плата. Самая частая причина: в меню стоит UNO, а подключена Mega или Leonardo. Сигнатура у них разная.
- Реальный чип на плате. На дешёвых клонах вместо ATmega328P часто стоит
ATmega328PB — у него сигнатура
1E 95 16, и стандартный пакет плат его не поддерживает. Нужен сторонний пакет MiniCore, где эта модификация заявлена явно. Официальное ядро Arduino megaAVR здесь не поможет: оно сделано под ATmega4809 на Nano Every и UNO WiFi Rev2, а ATmega328PB в нём нет. - Качество связи. Если сигнатура читается как
0x000000или0xFFFFFF, дело не в чипе — контакта нет вообще: проверьте кабель, питание и провода к программатору.
Совет из интернета «добавьте -F, чтобы обойти проверку» игнорирует несовпадение
сигнатуры, а не устраняет его. В лучшем случае прошивка не заработает, в худшем —
испортите загрузчик и плату придётся восстанавливать программатором.
Access is denied / Порт занят
avrdude: ser_open(): can't open device "\\.\COM3": Access is denied.
Порт держит другая программа. Чаще всего это открытый монитор порта — как в самой IDE, так и во внешней утилите, включая веб-инструменты в браузере. Закройте все подключения к порту и повторите загрузку.
На Linux та же ошибка выглядит как Permission denied: '/dev/ttyUSB0' и означает не
занятость, а нехватку прав. Добавьте себя в группу dialout и перезайдите в систему.
Команда для Linux:
sudo usermod -a -G dialout $USER
A programmer is required to upload
Выбрана плата, которая шьётся только через внешний программатор (например, «чистая» ATmega328P без загрузчика). Либо выберите обычную плату, либо используйте Sketch → Upload Using Programmer.
Ошибки загрузки: ESP32 и ESP8266
Failed to connect to ESP32
A fatal error occurred: Failed to connect to ESP32: Wrong boot mode detected (0x13)
Чип не перешёл в режим прошивки. На платах с автосбросом это обычно решается сменой
кабеля или порта, а на платах без него — вручную: зажмите кнопку BOOT в момент,
когда в логе появляется Connecting......, и отпустите через пару секунд после
старта загрузки. Если кнопки нет — притяните GPIO0 к земле на время подключения.
Дополнительно помогает снизить скорость: Tools → Upload Speed → 115200.
Brownout detector was triggered
Плата уходит в перезагрузку из-за просадки питания — обычно в момент включения Wi-Fi, когда потребление скачком растёт. Смените USB-кабель на более короткий и толстый, воткните в порт напрямую, а не через хаб, или запитайте плату от отдельного источника на 5 В с запасом по току.
MD5 of file does not match data in flash
A fatal error occurred: MD5 of file does not match data in flash after writing!
Прошивка записалась с искажениями. Причины те же, что у предыдущей ошибки, — плохой
контакт и питание. Снизьте Upload Speed до 115200 и попробуйте другой кабель. Если
повторяется на любой скорости, перед прошивкой очистите флеш через
esptool командой esptool erase_flash.
Ошибка компиляции платы esp32
Сообщение вида Compilation error: Error: 2 UNKNOWN: An unknown error occurred или
жалобы на отсутствующий xtensa-esp32-elf-g++ означают повреждённый пакет плат.
Удалите пакет в Boards Manager и установите заново; если не помогло — удалите
папку packages/esp32 в каталоге конфигурации (см. следующий раздел).
Порт не появляется в системе
Если в Tools → Port пусто, до ошибок загрузки дело даже не доходит. Порядок проверки одинаковый для всех плат:
| Что проверить | Как |
|---|---|
| Кабель | Заменить на заведомо рабочий с линиями данных |
| Драйвер моста USB-UART | CH340 или CP210x — по маркировке чипа рядом с разъёмом |
| Разъём | Прямой порт компьютера вместо хаба |
| Плата определилась | Windows: Диспетчер устройств; macOS/Linux: список /dev |
Как выглядит порт в разных системах:
| Система | Имя порта |
|---|---|
| Windows | COM3, COM4, … |
| macOS | /dev/cu.usbserial-…, /dev/cu.SLAB_USBtoUART, /dev/cu.wchusbserial… |
| Linux | /dev/ttyUSB0 (CH340, CP210x), /dev/ttyACM0 (UNO, Mega) |
На macOS в списке видны пары /dev/tty.* и /dev/cu.* для одного устройства.
Для прошивки и монитора порта всегда выбирайте cu.* — вариант tty.* ждёт сигнал
готовности модема и может «зависнуть» при открытии.
Arduino IDE не запускается или не качает пакеты
Error downloading package index
Error downloading index: https://downloads.arduino.cc/packages/package_index.json
Среда не может скачать список пакетов. Проверьте доступ в сеть, отключите VPN или, наоборот, включите — часть зеркал Arduino и Espressif недоступна из некоторых регионов. Если используете корпоративный прокси, пропишите его в File → Preferences → Network.
Ошибка при загрузке дополнительных ссылок (package_esp32_index.json) не мешает
работе с уже установленными платами — IDE ругается, но собирает скетчи как обычно.
IDE не стартует или падает при запуске
Обычно виноват испорченный конфиг после неудачного обновления. Переименуйте
каталоги настроек — например, добавив к имени .bak, — и среда пересоздаст их при
следующем запуске. Переименование лучше удаления: если дело окажется не в конфиге,
вы вернёте всё обратно одним движением.
| Система | Каталоги |
|---|---|
| Windows | %LOCALAPPDATA%\Arduino15 и %APPDATA%\arduino-ide |
| macOS | ~/Library/Arduino15 и ~/Library/Application Support/arduino-ide |
| Linux | ~/.arduino15 и ~/.config/arduino-ide |
Вместе с Arduino15 уедут установленные пакеты плат и настройки — их придётся
ставить заново, а это снова сотни мегабайт загрузки. Скетчи и библиотеки лежат
отдельно, в папке Документы/Arduino, и не пострадают.
Быстрый чек-лист
Прежде чем искать текст ошибки, пройдите четыре пункта — они закрывают большинство случаев:
- Выбраны правильные плата и порт.
- Кабель с линиями данных, воткнут напрямую в компьютер.
- Порт не занят монитором порта или другой программой.
- На выводах UART0 на время загрузки ничего не подключено. Какие это выводы, зависит от платы: 0 и 1 у AVR (UNO, Nano, Mega), GPIO 1 и 3 у классического ESP32, GPIO 43 и 44 у ESP32-S3, GPIO 21 и 20 у ESP32-C3.
Что дальше
- Настройка среды под ESP32 — Настройка Arduino IDE для работы с ESP32.
- Настройка под платы Arduino — Настройка Arduino IDE для разных плат Arduino.
- Прошивка из командной строки — Установка esptool под Windows, macOS и Linux.