Чек-лист родился из получаса позора. Загружаю скетч на Uno — заливка падает с рассинхроном. Пересобрал скетч, перезапустил среду, потыкал reset — по кругу, без изменений. Отписка в журнале была однострочной: avrdude рапортует, что программатор не отвечает, — такая строка почти всегда про связь, а не про код, и разбирать её по косточкам я научился позже. Виноват оказался Bluetooth-модуль HC-05, оставленный на макетке: его TX шёл в RX платы, и модуль разговаривал с бутлоадером громче компьютера. Вынул два провода — загрузка прошла с первого раза. С тех пор перед каждой заливкой у меня десятисекундный обход по списку, который я здесь и разбираю.
Загрузка — короткий диалог: среда дёргает ресет, бутлоадер секунду слушает порт, среда кладёт байты прошивки, плата стартует ваш скетч. Провалиться диалог может на любом шаге, и десять проверок ниже закрывают их все. Порядок я выучил на своих граблях: каждая проверка здесь — чья-то потраченная ночь, чаще всего моя собственная. Прогонять их глазами дешевле, чем вспоминать по очереди после третьей неудачи.
Чек-лист — это не про тупость, а про память. В момент заливки голова занята кодом, и рука сама забывает вынуть модуль из макетки; бумажка у монитора работает лучше памяти — я проверял на себе три года. Пункты идут от самого частого провала к самому редкому: первым проверяйте то, что стреляет чаще.
Десять проверок по порядку
- Плата в «Инструменты → Плата» та самая; для клонов Nano — пункт со старым загрузчиком
- Порт в списке тот, что появился при переподключении кабеля
- Кабель передаёт данные: телефон на нём предлагает передачу файлов
- «Проверить» зелёное: скетч компилируется ещё до заливки
- Монитор порта закрыт: порт свободен для загрузчика
- Пины 0 и 1 пусты: модули с UART вынуты из макетки
- Питание стабильное: без USB это 7–12 вольт на входе, без просадок
- Имя скетча и папки — латиницей, без пробелов
- На макетке нет перемычек между 5V и GND и проводов, повисших в воздухе
- Ядро сторонней платы установлено и свежее — менеджер плат это помнит
Первые два пункта — самые дорогие при провале. Выбор платы и порта разобран в уроке про плату и порт, а история с Nano, который шьётся только со словом old bootloader, живёт в отдельном уроке: симптомы совпадают с рассинхроном один в один, а лечится всё сменой строки в меню.
Про второй пункт есть приём, который экономит недели: сделайте скриншот списка портов в рабочий день и держите его под рукой. Когда заливка падает, сравнение двух списков за секунду отвечает, появился ли порт вообще. Номер порта при переткании в другой разъём меняется — это нормально, но чек-лист честнее пройти заново, чем надеяться на память. У меня этот скриншот живёт в закреплённой заметке рядом со списком того, что висит на 0 и 1: два файла, которые дешевле любых утилит.
Пункт четвёртый недооценён: «Проверить» перед каждой заливкой — моя привычка со времён первого проекта. Он отделяет ошибки кода от проблем связи: если компиляция падает, порт ни при чём, и наоборот. Разбирать красные строки журнала учит урок про чтение ошибок компиляции. Пятый пункт перекликается с серым портом из прошлого урока: держатель порта блокирует не только выбор, но и саму заливку.
Пункт восьмой смешной и обидный: русская буква в имени папки на некоторых системах ломает путь сборки, и среда отчитывается, что не может создать файл. Куда среда складывает проекты и как устроен скетчбук — в уроке про структуру папок. Шестой пункт — моя заноза из вступления: я держу на бумажке список того, что сидит на 0 и 1, потому что GPS, Bluetooth и модули с UART-интерфейсом любят именно эти пины. Если модулю нужен UART на постоянку — шейте плату с вынутыми проводами и вставляйте их после: два движения против получаса угадываний.
Пункт третий проверяется телефоном: если на этом кабеле телефон предлагает передачу файлов, данные по нему ходят. Телефонный тест занимает десять секунд и дешевле любого диагностического вечера: кабели, которые заряжают, но не видят устройство, живут в каждом доме. Пункт седьмой живёт в паре с уроком про батарейки и блоки: плата, перезапускающаяся от просевшей батареи, выглядит как проблема связи — заливка дёргает ресет, плата проваливается в перезагрузку, и загрузчик не успевает договорить. Сначала накормите плату, потом шейте. То же относится и к USB-хабам без питания: проседающая шина даёт ровно те же симптомы, что и севшая батарея.
Пункты с девятого по десятый — про окружение платы. Хороший приём: держите макетку так, чтобы шины 5V и GND были видны целиком, и перед заливкой пробегите взглядом по рядам. Сторонние ядра обновляйте в менеджере плат заранее, а не в момент, когда проект нужен вчера: обновление качает десятки мегабайт и занимает минуты, которых в тот вечер как раз нет.
| Проверка | Симптом при провале | Лечение |
|---|---|---|
| Плата выбрана верно | Заливка падает по sync | Сверить меню; Nano — old bootloader |
| Порт верный | Порт серый или не тот номер | Переткнуть кабель, выбрать появившийся COM |
| Кабель с данными | PWR горит, порта нет | Кабель-тест телефоном, второй шнур |
| Монитор закрыт | Заливка висит до таймаута | Закрыть журнал, повторить |
| Пины 0 и 1 пусты | avrdude не находит плату | Вынуть UART-модуль из макетки |
| Имя латиницей | Среда не может создать файл | Переименовать скетч и папку |
| Питание без просадок | Плата перезапускается по кругу | Померить вход: ниже семи вольт — менять источник |
| Ядро свежее | Странные таймауты только у сторонней платы | Менеджер плат: обновить ядро |
Пункт девятый про макетку звучит очевидно, пока не встретишь плату, которая не шьётся из-за капли припоя между шинами: замкнутое питание гасит USB-порт или уводит плату в перезапуск, и заливке просто не на кого смотреть. Быстрая проверка — вынуть плату из макетки и заливать «на весу»: если так заработало, виноваты провода, а не среда. Тот же приём работает наоборот: если на весу заливка падает, а в макетке живёт — смотрите питание и землю, они в макетке делят одну шину, и лишний потребитель на ней сбивает и заливку, и логику.
И ещё один невидимый враг — провод, держащийся на честном слове: макетные контакты изнашиваются, и вчерашняя схема сегодня не собирается. Шевелите провода перед заливкой: худшее время искать плохой контакт — во время неё. Список из десяти пунктов умещается на половине листа А5 — печать у монитора работает лучше любой памяти, а вычеркнутые пункты дают странное чувство порядка.
void setup() { Serial.begin(9600); pinMode(12, OUTPUT); Serial.println("marker: upload works");} void loop() { digitalWrite(12, HIGH); delay(100); digitalWrite(12, LOW); delay(900);}Маркер из блока выше работает так: если он заливается, а ваш скетч нет — проблема в коде, читайте журнал компиляции; если не заливается и маркер — возвращайтесь к пунктам с первого по шестой, там живёт связь. Правило простое: сначала маркер на пустой макетке, потом ваш скетч на рабочей — так вчерашний рабочий проект перестаёт быть подозреваемым номером один. Так один пустой скетч экономит полчаса угадываний.
После сотой заливки список сворачивается в три секунды: плату знаю, порт вижу, монитор закрыт, на 0 и 1 пусто. Пока этого нет — держите чек-лист перед глазами: он дешевле интуиции, а грабли распределяются равномерно, и каждый пункт однажды спасёт час. Десять пунктов — потолок, не норма: у меня после года практики живёт четыре; новичку же советую первые месяцы прогонять все десять, пока рука не запомнит сама. Монитор при этом полезен и после заливки: плата, которая молчит в нём, скажет о проблеме раньше, чем мигание. Что происходит внутри успешной заливки, байт за байтом, рассказывает урок про загрузку скетча, а питанию седьмого пункта посвящён отдельный урок — ссылки на него в списке выше.
- 1. Заливка падает по sync, на пинах 0 и 1 висит GPS-модуль. Первый ход?
- 2. Зачем запускать «Проверить» перед каждой заливкой?
- 3. Клон Nano отказывается шиться. Какой пункт в меню платы?
- 4. Почему русские буквы в имени папки мешают заливке?
- 5. Когда ручной reset перед заливкой действительно нужен?
- Загрузка — диалог среды и бутлоадера; десять проверок закрывают все места провала
- Самые дорогие пункты: плата (Nano — old bootloader) и порт, тот, что появился при переткании
- «Проверить» перед заливкой отделяет ошибки кода от проблем связи
- Пины 0 и 1 держите пустыми: UART-модули перекрикивают загрузчик
- Имя скетча латиницей; русский путь ломает сборку на некоторых системах
Частые вопросы по теме урока
- Заливка падает по sync, на пинах 0 и 1 висит GPS-модуль. Первый ход?
- Модуль на RX/TX разговаривает с бутлоадером громче компьютера. Два провода — и связь возвращается; всё остальное после этого, а не до. Это самый быстрый ход из всех десяти. Вынуть модуль с UART из макетки
- Зачем запускать «Проверить» перед каждой заливкой?
- Зелёная галка значит: код собирается, дальше вина на связи. Красные строки — вина на коде. Диагноз до заливки экономит круги по чек-листу и чужие советы, у которых другой контекст. Это отделяет ошибки кода от проблем связи
- Клон Nano отказывается шиться. Какой пункт в меню платы?
- Новые клоны Nano шьются только со старым загрузчиком в названии пункта. Симптомы совпадают с рассинхроном — потому пункт и самый дорогой в списке, и самый дешёвый в исправлении. Arduino Nano с пометкой old bootloader
- Почему русские буквы в имени папки мешают заливке?
- Сборка идёт по путям внутри папки скетча; нестандартные символы на некоторых системах ломают эти пути, и среда честно отчитывается о невозможности создать файл. Переименование занимает минуту. Ломается путь сборки: среда не может создать файл
- Когда ручной reset перед заливкой действительно нужен?
- Среда дёргает ресет сама. Исключения — отдельные платы со старыми загрузчиками и сценарии с внешними программаторами; в обычной жизни кнопка reset только сбивает ритм и не помогает. На отдельных платах со старыми загрузчиками и при внешних программаторах