Смена ноутбука — и проект по рукам: на новой машине скетч открывается, а компилятор ругается на отсутствующий заголовок. Библиотека осталась на старом диске, версия IDE другая, а папка с прошивкой вообще не переезжала. Первый мой перенос я сделал «по-умному»: скопировал один файл .ino на флешку. Второй перенос — уже правильно: собрал всю папку, копии архивных библиотек и три строки про плату. Флешка с одним файлом — самая частая первая попытка, и она же рождает третье утро с поиском заголовка, который «точно был в скетче». Багаж на другую машину — понятие не абстрактное: ниже четыре строки таблицы, которые я выверил на трёх переездах.
Здесь — что именно лежит в папке скетча, чего в ней нет и зачем нужен export compiled binary. Полную структуру sketchbook с папками libraries и hardware я разбирал в уроке про структуру папок, а git-подход с историей правок — в уроке про git для ардуино-проектов; здесь же — багаж на другую машину и прошивка без окна IDE.
Папка скетча: что таскать
Минимальная единица — папка, названная как скетч: MyProject/MyProject.ino. Имя файла и имя папки обязаны совпадать, иначе IDE откроет скетч в песочнице и попросит перенести в новую папку. Рядом ложатся дописанные вами .h и .cpp — IDE их подхватит, а дополнительные .ino в той же папке склеит с главным при сборке. Всё это уезжает в архив целиком, с подпапками, без разбора, что «важно», а что нет: файл весом в килобайты спорить не будет.
Чего в папке нет — и это половина переносимого багажа. Библиотеки лежат в sketchbook/libraries, выбор платы и порта — в конфиге IDE, а не в скетче. На новую машину их таскают руками: папки тех библиотек, что ставились архивом, и текстовый список: плата, процессор, версия IDE. Список пишется за минуту: в менеджере у каждой библиотеки версия напечатана рядом с именем — перепишите те, что участвуют в проекте. Три строки, а на новом месте сборка сходится с первого раза, без археологии по менеджеру.
Отдельный вопрос — состояние прошивок, уже зашитых в платы. Скетч правится, а платы живут своей жизнью, и через месяц никто не скажет, какая версия на борту. Привычка, которую я завёл после вечера с двумя «одинаковыми» платами: печатать паспорт при старте — имя проекта, номер версии, дату сборки. Макросы __DATE__ и __TIME__ подставляют момент компиляции, и каждая зашивка несёт свою метку.
Пара слов о том, что попадает в архив незаметно. Папка .git внутри проекта — вся история правок: для переезда тяжёлая, но дорогая; решайте по ситуации — либо берите целиком, либо оставляйте на живом репозитории. Служебные скрытые файлы и мусор системы в архив не нужны. А вот структуру папок я сохраняю как есть: если проект лежал в глубине дерева, на новой машине пусть живёт похоже — меньше путаницы при поиске глазами.
// Паспорт прошивки: печатается один раз при старте.// __DATE__ и __TIME__ - момент компиляции, не момент загрузки. const char* NAME = "Polivalka";const int VERSION = 7; void setup() { Serial.begin(9600); pinMode(13, OUTPUT); Serial.print(NAME); Serial.print(" v"); Serial.println(VERSION); Serial.print("build: "); Serial.print(__DATE__); Serial.print(" "); Serial.println(__TIME__);} void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000);}Export compiled binary: зачем он
Меню Скетч → Экспортировать скомпилированный бинарный файл собирает проект и оставляет результат в папке build с подписью платы внутри папки скетча: для Uno это .hex и .elf, для ESP32 — набор .bin под загрузчик и разделы. Рядом с hex в build лежит .elf: отладчику нужен, архиву — не всегда; hex копируйте всегда, elf — по желанию. С тех пор прошивка существует отдельно от IDE: avrdude зальёт hex на Uno одной строкой, esptool — bin на ESP32, и для этого не нужен ни монитор, ни порт в IDE. Имя папки внутри build подписано платой не случайно: при работе с Uno и Mega из одного скетча папки ложатся рядом, и перепутать прошивки сложнее. Когда это стреляет: прошиваете десяток одинаковых плат подряд, отдаёте сборку коллеге без IDE или фиксируете точную версию прошивки в архиве проекта.
Второй сценарий — перенос на машину без интернета: hex уже собран, ставьте IDE минимальной комплектации. Для регулярной сборки без окна IDE тот же шаг делает arduino-cli compile --export-binaries — про клавиатурный путь я писал в уроке про CLI. А чем именно шить hex и что значат слова avrdude в логе — в уроке про avrdude и stk500. Третий сценарий — прошивка где-нибудь на объекте: заранее скинутый hex и карманный программатор снимают зависимость от установленной IDE.
Граница метода: бинарь привязан к плате — сборка для Uno на Mega не поедет, у них разные загрузчики и объёмы памяти, поэтому папку build копируют целиком, с подписью платы. Для проектов под несколько плат список целей ведёт PlatformIO — сравнение подходов я собирал в уроке про PlatformIO против IDE.
Итоговый чек на переезд собран в таблицу: что архивировать, что копировать отдельно и когда без этого стреляет. Строки стоят по приоритету: если берёте только одну — берите первую, папку скетча целиком. Третий пункт — единственный, что требует сборки, а не копирования: экспорт делайте после последней правки, иначе архив зафиксирует промежуточную версию. Второй и четвёртый пункты весят килобайты, а ценят их только в день переезда: без списка версий новая машина молча соберёт проект с другими библиотеками, и поведение изменится без единой правки кода.
Копия, которую ни разу не открывали на чистом месте, — это надежда, а не бэкап. Проверка простая и занимает пять минут: распакуйте архив в свежую папку вне скетчбука, откройте скетч, соберите. Заголовок не найден — в архиве нет папки библиотеки или списка версий. Сборка прошла — сверьте паспорт при старте: версия и дата должны быть последними, а не полугодовой давности. Если паспорт напечатал чужую дату — в архиве старый build: пересоберите и перезапишите экспорт.
Тот же прогон я делаю раз в квартал для проектов, которые считаю живыми: история с ноутбуком научила, что перенос случается не по расписанию, а в самый занятой день. Раз в квартал по пять минут дешевле, чем один вечер восстановления в дедлайн. Мой шаблон README вырос из таких прогонов: три строки про библиотеки, строка про плату, строка про дату последней проверенной сборки.
| Что делаете | Что уезжает на другую машину | Когда без этого никак |
|---|---|---|
| Архив папки скетча | .ino, доп. файлы, build с прошивками | любой перенос, даже между своими машинами |
| Копия папок zip-библиотек | исходники того, чего нет в менеджере | сборка на чистой машине без интернета |
| Export compiled binary | hex или bin с подписью платы | прошивка без IDE, архив точной версии |
| Текстовый список: плата, версии | три строки в README рядом с .ino | воспроизводимая сборка через месяц |
- 1. Что должно совпадать у скетча и его папки?
- 2. Куда export compiled binary кладёт собранный бинарь?
- 3. Чем залить .hex на Uno без IDE?
- 4. Где по умолчанию живут библиотеки?
- 5. Зачем печатать имя и дату сборки при старте прошивки?
- Единица бэкапа — папка: MyProject.ino с именем папки, рядом .h, .cpp и доп. .ino
- Библиотеки и выбор платы живут вне папки скетча: таскаются отдельными папками и списком
- Паспорт при старте: имя, версия, __DATE__/__TIME__ — видно, какая прошивка в плате
- Export compiled binary кладёт hex/bin/elf в build с подписью платы: прошивка без IDE, архив версии
- Бинарь привязан к плате: сборка для Uno не поедет на Mega
Частые вопросы по теме урока
- Что должно совпадать у скетча и его папки?
- MyProject/MyProject.ino — иначе IDE откроет скетч в песочнице и попросит перенести в новую папку: файл есть, а проекта нет. Дополнительные .ino в той же папке склеиваются с главным при сборке. имя файла .ino и имя папки
- Куда export compiled binary кладёт собранный бинарь?
- Результат сборки ложится рядом со скетчем в build с подписью платы: для Uno — .hex и .elf, для ESP32 — набор .bin. Копируйте папку целиком: подпись платы — единственная защита от прошивки не той сборки. в build с подписью платы внутри папки скетча
- Чем залить .hex на Uno без IDE?
- Hex собирается под avrdude: одна строка в терминале — и плата прошита, без окна IDE. Для ESP32 ту же роль играет esptool и .bin. avrdude из командной строки
- Где по умолчанию живут библиотеки?
- Documents/Arduino/libraries — отдельно от скетчей. Поэтому один файл .ino на флешке переезжает, а сборка на новой машине падает: заголовков-то нет. Список библиотек в README — часть бэкапа, а не приятный бонус. в sketchbook/libraries, вне папки скетча
- Зачем печатать имя и дату сборки при старте прошивки?
- Макросы __DATE__ и __TIME__ подставляют момент компиляции: каждая зашивка несёт метку. Две внешне одинаковые платы перестают быть близнецами по одной строке. чтобы по монитору отличить, какая версия сидит в плате