Инструкции

Ошибки Arduino IDE: компиляция, загрузка и порт

12 мин чтения·Август 2026·RoboArm R1

Ошибки 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

Загрузчик не отвечает. Проверяйте по порядку:

  1. Правильный порт. Отключите плату, посмотрите список портов, подключите — появившийся порт и есть нужный.
  2. Правильная плата. Nano вместо UNO даёт ровно эту ошибку.
  3. Пины 0 и 1 свободны. RX/TX заняты загрузчиком: любой модуль (Bluetooth, GPS, второй Serial) на этих пинах блокирует прошивку. Отсоедините на время загрузки.
  4. Кабель с линиями данных. Дешёвые кабели «только для зарядки» дают питание, светодиод горит, но данных нет.
  5. 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 здесь не поможет — оно меняет скорость обмена, а не сигнатуру чипа. Проверяйте другое:

  1. Выбранная плата. Самая частая причина: в меню стоит UNO, а подключена Mega или Leonardo. Сигнатура у них разная.
  2. Реальный чип на плате. На дешёвых клонах вместо ATmega328P часто стоит ATmega328PB — у него сигнатура 1E 95 16, и стандартный пакет плат его не поддерживает. Нужен сторонний пакет MiniCore, где эта модификация заявлена явно. Официальное ядро Arduino megaAVR здесь не поможет: оно сделано под ATmega4809 на Nano Every и UNO WiFi Rev2, а ATmega328PB в нём нет.
  3. Качество связи. Если сигнатура читается как 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-UARTCH340 или CP210x — по маркировке чипа рядом с разъёмом
РазъёмПрямой порт компьютера вместо хаба
Плата определиласьWindows: Диспетчер устройств; macOS/Linux: список /dev

Как выглядит порт в разных системах:

СистемаИмя порта
WindowsCOM3, 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, и не пострадают.

Быстрый чек-лист

Прежде чем искать текст ошибки, пройдите четыре пункта — они закрывают большинство случаев:

  1. Выбраны правильные плата и порт.
  2. Кабель с линиями данных, воткнут напрямую в компьютер.
  3. Порт не занят монитором порта или другой программой.
  4. На выводах UART0 на время загрузки ничего не подключено. Какие это выводы, зависит от платы: 0 и 1 у AVR (UNO, Nano, Mega), GPIO 1 и 3 у классического ESP32, GPIO 43 и 44 у ESP32-S3, GPIO 21 и 20 у ESP32-C3.

Что дальше

Рекомендуемые продукты

Связанные статьи