В радиомагазине ATmega328P стоит копейки — дешевле любой платы — и это тот же чип, что сидит на Uno. Плата вокруг него: кварц, горстка конденсаторов, резистор, разъёмы. Один вечер с макеткой наглядно это показывает: обвязка помещается в спичечный коробок, и чип начинает жить жизнью Arduino. Но вместе с обвязкой вам достаётся и работа платы: прошивать голый чип среда сама не умеет — загрузчика в нём нет.
Здесь собираем минимальную схему из семи деталей, записываем загрузчик вторым Arduino по методу Arduino as ISP и шьём скетч — тем же программатором. Схема из того урока переезжает на макетку без изменений: MOSI, MISO, SCK и RESET уходят в чип по номерам его ножек. Схему раскладываем на макетке; если рельсы и жёлтые ряды до сих пор путают, начните с урока про макетку и возвращайтесь.
Зачем это всё, если Nano стоит ненамного дороже всей детали? Для устройства: чип в панельке на своей плате весит меньше, занимает меньше и стоит гроши, когда вы делаете десять одинаковых будильников или датчиков. Плюс независимость: чип с записанным загрузчиком живёт в устройстве без USB, без переходников и без часов откапывания документации — я открывал собранные корпуса спустя годы, и такие платы просто работали. Мой первый голый чип вообще вырос из спасательной операции: вынуть живой ATmega328P из залитой чаем Uno и дать ему вторую жизнь на макетке.
Минимальная обвязка: кварц, резистор, конденсаторы
Кварц 16 МГц — единственный путь сделать чип Uno-совместимым. У ATmega328P есть внутренний RC-генератор на 8 МГц, и чип на нём заводится, но загрузчик Optiboot, который ставит среда, рассчитан на внешний кварц: под него выставлены фьюзы и скорость UART. Записали загрузчик — фьюзы зафиксированы под внешний кварц 16 МГц, и без него чип замолкает наглухо: такта нет, стучаться некому. Поэтому кварц тут не опция, а обязательная деталь, и берите его с маркировкой 16.000.
Кварц сам по себе не резонирует: обе его ножки — XTAL1 (пин 9) и XTAL2 (пин 10) у DIP-28 корпуса — садятся на землю через керамические конденсаторы 22 пФ, именно керамика, не электролит: полярная ёмкость у кварца не работает. Держите детали в отсеках: 22 пФ и 100 нФ на вид почти близнецы, а маркировка на керамике мелкая. RESET (пин 1) подтягивается резистором 10 кОм к 5 В: без подтяжки линия висит в воздухе, чип ловит самосбросы от любой наводки, и скетч перезапускается по расписанию погоды. Питание чистят конденсаторы 100 нФ — по одному от VCC (пин 7) и AVCC (пин 20) на землю, вплотную к чипу. AVCC питает аналоговую часть, и без него чип молчит так же убедительно, как без кварца: это вторая по частоте находка при отладке.
Питание на макетке разводите первым делом: 5 В и землю — на обе рельсы, потом подключайте чип и только затем сигнальные провода. Такой порядок экономит вечер: если в схеме что-то не заводится, вы уже знаете, что рельсы проверены. И помните про длинные макетки: у части из них рельсы разорваны посередине — у меня однажды половина платы просто не питалась, и я двадцать минут лечил несуществующего мёртвого чипа.
| Деталь | Номинал | Куда встаёт (DIP-28) | Зачем |
|---|---|---|---|
| Кварц | 16 МГц | пины 9 и 10 (XTAL1/XTAL2) | такт для загрузчика и точные тайминги |
| Керамика | 22 пФ, две штуки | каждая ножка кварца на землю | запуск и стабилизация резонанса |
| Резистор | 10 кОм | RESET (пин 1) к 5 В | не даёт RESETу висеть в воздухе |
| Керамика | 100 нФ, две штуки | VCC (пин 7) и AVCC (пин 20) на землю | чистое питание, без них чип молчит |
| Светодиод + резистор | 220 Ом | пин 19 (это D13) на землю | Optiboot мигает им трижды при подаче питания |
- Посадите чип поперёк желоба макетки, выемкой-ключом в одну сторону: у DIP-28 пин 1 — слева под ключом, счёт ножек против часовой стрелки.
- Подайте 5 В на пин 7 (VCC) и пин 20 (AVCC); землю — на пины 8 и 22.
- Кварц 16 МГц — между пинами 9 и 10; от каждой ножки кварца — конденсатор 22 пФ на землю, вплотную.
- Резистор 10 кОм — между пином 1 (RESET) и 5 В.
- Конденсаторы 100 нФ — от пинов 7 и 20 на землю.
- Светодиод с резистором 220 Ом — с пина 19 (D13) на землю; если программатор капризничает, на время записи снимите его — он подгружает линию SCK.
- Соедините программатор: D11 — пин 17 (MOSI), D12 — пин 18 (MISO), D13 — пин 19 (SCK), D10 — пин 1 (RESET), плюс общие 5 В и GND.
Пины D11-D13 у чипа неслучайны: это аппаратная шина SPI — она же MOSI, MISO и SCK, — и программатор пересылает команды именно через неё, без программных эмуляций. D10 при этом остаётся обычным пином: скетч ArduinoISP дёргает им RESET цели перед каждой операцией записи. Номера ножек DIP-28 не совпадают с номерами Arduino — у корпуса своя нумерация против часовой стрелки, поэтому держите под рукой распиновку: MOSI — пин 17, MISO — пин 18, SCK — пин 19, RESET — пин 1. Я однажды пересчитал ножки по часовой стрелке, полвечера боролся с молчанием цели и понял, где промахнулся, только по отметке ключа на корпусе.
Загрузчик и скетч: программатором с Uno
Порядок повторяет урок про Arduino as ISP: залить на Uno скетч ArduinoISP из примеров, собрать провода, выбрать «Инструменты → Плата: Arduino Uno» и «Программатор: Arduino as ISP», затем «Инструменты → Записать загрузчик». Через минуту-полторы среда отчитается, и в чипе появится Optiboot: светодиод на пине 19 мигнёт трижды при подаче питания — фирменный знак загрузчика, по нему проверяют, что запись прошла. Всё это время светодиод-«сердцебиение» на пине 9 программатора мягко дышит: погас — смотрите провода и конденсатор автосброса на Uno, соседний урок раскладывает этот случай по полкам. Тем же методом ISP шьют и мелкие чипы: урок про ATtiny85 показывает, как меняется только выбор платы и программатора.
Скетч шьётся двумя путями. «Скетч → Загрузить через программатор» пишет прошивку прямо по SPI и стирает загрузчик — путь для устройства, которое в жизни не увидит UART. Второй путь: после записи загрузчика шить по Serial через USB-TTL адаптер, как делают с Pro Mini, — крест-накрест TX/RX и DTR на RESET (пин 1). Одно отличие от готовых плат: на макетке нет впаянного конденсатора автосброса, поэтому поставьте 100 нФ между DTR адаптера и RESET чипа, иначе окно загрузчика придётся ловить кнопкой Reset. После записи загрузчика чип виден среде как обычная Uno: платы и порты выбираются так же, как в уроке про выбор платы и порта.
const int LED = 12;const int BTN = 2; unsigned long lastBlink = 0;unsigned long period = 500;int state = LOW; void setup() { pinMode(LED, OUTPUT); pinMode(BTN, INPUT); Serial.begin(9600); Serial.println("Test takta: D12 migaet po millis, D2 menyaet period");} void loop() { if (digitalRead(BTN) == HIGH) { period = 100; } else { period = 500; } if (millis() - lastBlink >= period) { lastBlink = millis(); if (state == HIGH) { state = LOW; } else { state = HIGH; } digitalWrite(LED, state); Serial.print("period="); Serial.println(period); }}Почему пробник именно на millis, а не на delay: эта проверка гонит чип по полному циклу — такт с кварца, таймер, прерывание переполнения, Serial. Кривой кварц или не те фьюзы выдают себя масштабом: мигание идёт не каждые 500 мс, а каждые 1000, и кнопка-переключатель периода меняет его с той же промашкой вдвое. Планировщик без delay я собирал в уроке про millis — здесь он работает щупом: правильные интервалы на глаз значат, что такт встал ровно.
Serial на голом чипе — тот же UART, сидящий на ножках D0 и D1 (пины 2 и 3 у DIP-28): я ставлю скорость 9600, чтобы любой USB-TTL адаптер показал журнал без настроек. Если вывод идёт кашей с посторонними знаками — скорость монитора не совпала со скоростью скетча. Тишина при живой плате — проверяйте крест TX/RX, он не прощает ни в одном кластере.
- Голый ATmega328P для Uno-совместимости требует внешний кварц 16 МГц с конденсаторами 22 пФ: фьюзы Optiboot рассчитаны именно на него
- Обвязка: 10 кОм с RESET на 5 В, 100 нФ на VCC и AVCC, светодиод с 220 Ом на D13 — пин 19 у DIP-28 корпуса
- Загрузчик записывается через Arduino as ISP: Burn Bootloader выставляет фьюзы сам, светодиод на D13 мигает трижды при подаче питания
- Скетч шьют тем же ISP (загрузчик стирается) или по Serial через USB-TTL, поставив 100 нФ между DTR и RESET
- Панелька DIP-28 пересаживает чип без пайки: прошивка на столе дешевле перегретого чипа
- 1. Чипу записали загрузчик с фьюзами под внешний кварц, а кварца на макетке нет. Что будет?
- 2. Зачем конденсаторы 22 пФ у кварца?
- 3. Что делает резистор 10 кОм на RESET?
- 4. Какой пин DIP-28 нужно подключить к 5 В вместе с VCC (пин 7), иначе чип молчит?
- 5. Как по поведению светодиода понять, что Burn Bootloader прошёл успешно?
Частые вопросы по теме урока
- Чипу записали загрузчик с фьюзами под внешний кварц, а кварца на макетке нет. Что будет?
- Фьюзы отключают внутренний генератор и назначают источником такта внешний кварц. Без кварца такта нет вообще — чип молчит, и запись скетча падает с resp=0x00. замолчит: такта нет, загрузчику не с чем стучаться
- Зачем конденсаторы 22 пФ у кварца?
- Кварц резонирует вместе с ёмкостями на обеих ножках: без 22 пФ генерация может не запуститься или пойти с плавающей частотой. Питание чистят другие конденсаторы — 100 нФ. запускают и стабилизируют резонанс
- Что делает резистор 10 кОм на RESET?
- RESET должен быть притянут к питанию, иначе линия висит в воздухе и чип перезапускается от любой наводки. Скорость заливки задаёт не резистор, а фьюзы и ядро. держит RESET притянутым к 5 В, чтобы чип не сбрасывался от наводок
- Какой пин DIP-28 нужно подключить к 5 В вместе с VCC (пин 7), иначе чип молчит?
- AVCC питает аналоговый блок, и без него чип молчит так же, как без кварца. AREF — опорное напряжение АЦП, XTAL2 — ножка кварца, GND сажается на землю, а не на 5 В. AVCC (пин 20) — питание аналоговой части
- Как по поведению светодиода понять, что Burn Bootloader прошёл успешно?
- Optiboot при старте мигает светодиодом на D13 (пин 19) три раза — фирменный знак записанного загрузчика. Ровное горение и ежесекундное мигание — признаки других скетчей. при подаче питания светодиод на D13 мигает трижды