Nano, с которой мы разбирались в уроке про Old Bootloader, однажды перестала принимать прошивку окончательно: и ATmega328P, и Old Bootloader упирались в одну и ту же ошибку синхронизации. Причина выяснилась позже: эксперимент с чужой прошивкой затёр загрузчик, и чип лишился той самой маленькой программы, которая слушает UART после сброса. Плата исправна, чип живой — а IDE с ней разговаривать не умеет: не с кем. Симптом был тот же, что и при неправильном «Процессоре», но теперь без исключений: оба пункта меню, оба кабеля, два вечера. resp=0x00 в конце строки — подпись того, что цель вообще не отвечает: молчит и чип, и загрузчик.
Второй сюжет, где помощь нужна раньше: голый ATmega328P из магазина. Такой чип приходит без загрузчика вообще — его ставят отдельно, и именно так рождаются самодельные платы на печатных макетках, где ATmega328P впаян прямо в устройство. Третий сюжет: нужно зашить готовый скетч в плату, которая будет жить в устройстве без USB и без возможности перепрошивки через порт. IDE такой чип просто не увидит: загрузчику некому отвечать на стук порта — а как выглядит заливка в нормальном порядке, разобрано в уроке про загрузку скетча.
Программатор USBasp стоит копейки, но ехать до него неделю. Выход лежит на столе: вторая Arduino. В этом уроке превращаем Uno в программатор по методу Arduino as ISP — заливаем стоковый скетч, соединяем цель шестью проводами и записываем в утопленную Nano загрузчик или готовый скетч. Никакого лишнего железа: схема собирается за пять минут и живёт годами.
Как устроен ISP: четыре сигнала и RESET
ISP расшифровывается как in-system programming — прошивка в системе, без извлечения чипа из платы. Чип переводится в специальный режим, в котором им управляют по шине SPI: так заводской программатор пишет загрузчик в свежий чип прямо на конвейере. У ATmega328P шина сидит на конкретных пинах, и Arduino дублирует их своими номерами: MOSI — D11, MISO — D12, SCK — D13. У Uno и Nano эти номера совпадают, потому что чип один и тот же. Обмен двусторонний: команды уходят по MOSI, ответы возвращаются по MISO, SCK задаёт ритм.
Программатор — Uno, на которую залит скетч ArduinoISP из набора примеров (File → Examples → 11.ArduinoISP). Скетч превращает плату в USB-программатор: IDE присылает команды через Serial, а скетч переводит их в SPI-обмен с целью. Пин D10 программатора идёт на RESET цели: им скетч усыпляет цель перед каждой операцией записи и будит после: во время прошивки цель перезагружается сама собой, без вашего участия. Плюс общий 5 В и GND — цель питается от программатора.
У скетча есть индикаторы. D9 мягко «дышит» — программатор жив и ждёт команд; D7 вспыхивает в моменты активной записи в цель; D8 подмигивает при ошибке обмена. Если после заливки ArduinoISP девятый пин дышит — половина дела сделана, дальше дело за проводами. Если он молчит даже после «Загрузка завершена» — пример залит не тот: проверьте, что взяли его из раздела 11.ArduinoISP, а не из древних версий с другими индикаторами.
| Пин Uno-программатора | Пин Nano-цели | Назначение |
|---|---|---|
| 5V | 5V | Питание цели от программатора |
| GND | GND | Общая земля — без неё SPI не работает |
| D11 (MOSI) | D11 (MOSI) | Данные от программатора к цели |
| D12 (MISO) | D12 (MISO) | Ответные данные от цели |
| D13 (SCK) | D13 (SCK) | Тактовый сигнал обмена |
| D10 | RESET | Сброс цели перед операциями записи |
| D9 (индикатор) | — | Heartbeat скетча-программатора: дышит — жив и ждёт команд |
Порядок действий: от скетча-программатора до живой цели
Дальше два разных сценария, и путаница между ними — источник половины разочарований. «Инструменты → Записать загрузчик» (Burn Bootloader) пишет в цель загрузчик и выставляет фьюзы — служебные ячейки, где записаны источник такта и размер области загрузчика. Это путь для голого чипа и для утопленной Nano: после записи цель снова видна в IDE как обычная плата, и порты выбираются как раньше. Фьюзы — то место, где новички чаще всего ломают чипы ручными экспериментами: Burn Bootloader выставляет их сам, и в этом его безопасность; после записи у Nano вернётся и выбор «Процессора» — старый или новый зависит от того, какой загрузчик вы записали.
«Скетч → Загрузить через программатор» (Upload Using Programmer) — другой путь: скетч пишется прямо через SPI, стирая загрузчик. Плата после этого работает в устройстве, но её больше нельзя прошить по USB, пока не запишете загрузчик заново. Моё правило: восстановление — Burn Bootloader, прошивка «бесхвостого» устройства — Upload Using Programmer, и я всегда проговариваю про себя, что эти операции не взаимозаменяемы. Скорость ISP-зашивки, кстати, почти не зависит от того, есть ли в цели загрузчик: шина SPI работает и до него, и после.
- Залейте на Uno пример File → Examples → 11.ArduinoISP → ArduinoISP.
- Отключите программатор от USB и соберите провода по таблице: D11–D11, D12–D12, D13–D13, D10–RESET, 5V–5V, GND–GND.
- Для Uno-программатора поставьте электролит 10 мкФ между RESET и GND (плюс к RESET), чтобы заглушить автосброс.
- «Инструменты → Плата» — та, что соответствует цели (Arduino Nano или Uno); «Инструменты → Программатор» — Arduino as ISP.
- «Инструменты → Записать загрузчик» — для восстановления или голого чипа; ждите надпись «Записан загрузчик».
- Либо «Скетч → Загрузить через программатор» — чтобы зашить готовый скетч без загрузчика.
- Контроль: D9 программатора дышит — он жив; D7 вспыхивает при записи; D8 мигает при ошибках связи.
Частые вопросы после первой попытки. «Цель — Nano, программатор — Uno: это совместимо?» Да: оба на ATmega328P, номера SPI-пинов совпадают, разница только в USB-чипе, который в прошивке цели не участвует. «Можно ли так шить Mega?» Формально да, но у ATmega2560 SPI выведен на центральный двухрядный разъём, и начинающим я не советую начинать с неё. «Цель — голый чип на макетке?» Схема та же, только ноги чипа: MOSI на 17-ю, MISO на 18-ю, SCK на 19-ю, RESET на 1-ю — и обязательно кварц 16 МГц с конденсаторами 22 пФ, без тактирования чип не проснётся.
Провод RESET на D10 обязателен: без него программатор не введёт цель в режим прошивки, и обмен застрянет на чтении сигнатуры с ошибкой Device signature. Провода держите короткими, до 15–20 сантиметров: длинные хвосты на SPI ловят наводки, и заметная часть загадочных not in sync лечится заменой трёх проводов на короткие. И ещё: во время записи загрузчика не трогайте провода — выдернутый SCK посреди операции даст битую запись, и всё придётся начинать заново.
После записи загрузчика — стандартный ритуал: плату выбираем как есть (для Nano не забудьте про «Процессор» из прошлого урока), заливаем классическую мигалку или первый скетч на плату и любуемся: пин 13 — это встроенный L, и если он мигает, чип и кварц живы, значит, провода собраны верно. Важный сюрприз новичка: Serial на цели, прошитой через программатор, печатает в никуда — у голого чипа нет USB, его UART торчит на пинах 0 и 1, и для текстовой отладки нужен переходник USB-UART. Пока его нет, общаемся светодиодом: узнаваемые паттерны вспышек вместо строк лога.
По скорости: SPI-прошивка идёт неспешнее, чем по USB, — десять-двадцать секунд на скетч, потому что каждый байт проходит через программатор по одному. Зато это работает, когда по USB уже ничего не работает, и чинит платы, которые иначе отправились бы в мусор. И не спешите выдёргивать провода после записи: сначала убедитесь, что IDE отчиталась об успехе. Второй заход всегда быстрее первого: IDE кэширует собранное ядро, а пальцы уже запомнили порядок пунктов меню.
void setup() { pinMode(12, OUTPUT);} void loop() { digitalWrite(12, HIGH); delay(120); digitalWrite(12, LOW); delay(120); digitalWrite(12, HIGH); delay(120); digitalWrite(12, LOW); delay(2000);}- Arduino as ISP: Uno со скетчем ArduinoISP превращается в USB-программатор для Nano и голых ATmega328P
- Провода: 5V, GND, D11→MOSI, D12→MISO, D13→SCK, D10→RESET; электролит 10 мкФ на RESET глушит автосброс
- Burn Bootloader пишет загрузчик и фьюзы; «Загрузить через программатор» шьёт скетч, стирая загрузчик — операции не взаимозаменяемы
- Цель без загрузчика молчит по USB — это ожидаемо, а не поломка
- Индикаторы ArduinoISP: D9 дышит — программатор жив, D7 — запись, D8 — ошибка связи
- 1. Утопленная Nano потеряла загрузчик. Что для неё теперь невозможно?
- 2. Какие пины Uno-программатора идут на SPI-шину цели?
- 3. Чем «Загрузить через программатор» отличается от «Записать загрузчик»?
- 4. IDE падает с not in sync, провода верные, программатор живой. Первое действие?
- 5. Светодиод на D9 программатора мягко «дышит». Это значит...
Частые вопросы по теме урока
- Утопленная Nano потеряла загрузчик. Что для неё теперь невозможно?
- Без загрузчика чипу некому слушать UART после сброса — USB-загрузка невозможна в принципе: IDE не с кем стучаться. Путь — ISP через программатор. Прошивка по USB как обычной платы
- Какие пины Uno-программатора идут на SPI-шину цели?
- У ATmega328P шина SPI сидит на D11 (MOSI), D12 (MISO) и D13 (SCK); отдельно D10 идёт на RESET цели, и на Nano номера те же — чип тот же. D11, D12, D13
- Чем «Загрузить через программатор» отличается от «Записать загрузчик»?
- Upload Using Programmer стирает загрузчик; Burn Bootloader записывает его вместе с фьюзами. Операции не взаимозаменяемы — сначала решите, что нужнее: восстановленный загрузчик или скетч без хвоста. Скетч пишется без загрузчика, и USB-загрузка после этого пропадает
- IDE падает с not in sync, провода верные, программатор живой. Первое действие?
- Автосброс перезапускает программатора посреди операции; электролит между RESET и GND глушит этот эффект. Проверка: после установки конденсатора светодиод ON перестаёт мигать при переподключении USB. Конденсатор 10 мкФ между RESET и GND программатора
- Светодиод на D9 программатора мягко «дышит». Это значит...
- D9 — heartbeat скетча ArduinoISP: дыхание означает готовность. Сам он ничего не шьёт — команды приходят от IDE; D7 вспыхивает при записи, D8 — при ошибках. Скетч ArduinoISP работает и ждёт команд