Термометр в теплице показывал температуру ровно до того момента, как я открывал монитор порта: порт — и скетч начинал жизнь заново, счётчики обнулялись, датчик проходил стартовую инициализацию по новой. Три часа я ловил призрака в собственном коде, а виновник лежал на схеме платы: конденсатор на сто нанофарад между линией DTR USB-моста и RESET. Плате так положено — и это нарисовано в документе, который бесплатно лежит на сайте производителя.
Официальные схемы плат публикуются открыто: у каждой платы на arduino.cc есть страница Documentation с PDF-схемой (Schematics) и исходниками в EAGLE. Документ выглядит страшно, но в нём десяток узлов, и каждый объясняет конкретное поведение железа, на которое иначе тратятся вечера. Здесь читаю Uno R3 и Nano по узлам: авто-ресет, буфер светодиода пина 13, полифьюс, стабилизаторы.
Общие значки — резистор, диод, конденсатор, земля — это язык: азы разобраны в уроке про чтение схем. Здесь язык не учим, а сверяем поведение вашей платы с конкретными узлами её схемы.
Uno R3 по узлам: пять находок
Центр — ATmega328P. Рядом ATmega16U2 — USB-мост, который превращает USB в COM-порт (на ревизиях R1/R2 стоял 8U2; у Nano оригинала — FT232RL, у клонов — CH340G). От линии DTR моста к RESET тянется конденсатор 100 нФ, а сам RESET подтянут 10 кОм к 5 В. Эта пара и есть авто-ресет: каждый раз, когда порт открывается, импульс проходит через конденсатор и чип перезапускается. Поэтому монитор порта, прошивка и даже переподключение кабеля — каждый старт заново.
В линиях между мостом 16U2 и ATmega328P на схеме стоят резисторы по 1 кОм — и это не украшение. Мост и внешний модуль на ножках 0 и 1 делят одну линию, и без резисторов они упираются выходами друг в друга: чей уровень сильнее, тот и выиграл. Килоом в каждой ноге смягчает спор — мост шьёт плату даже с воткнутым на 0-ю ножку модулем. Я всё равно вынимаю такие провода на момент прошивки: схема даёт запас, а не гарантию.
Кварц 16 МГц рядом с чипом обвешан двумя конденсаторами по 22 пФ — типовая обвязка, которая встречается на схемах с любым камнем. Отсюда растут все временные числа: delay(1000) и микросекунды millis делятся от кварца, как и скорость Serial. Разглядывать её полезно при выборе клона: резонатор вместо кварца попадается на дешёвых платах, и ход времени я на них проверяю мигалкой с секундомером, а не по паспорту.
Светодиод L на пине 13 сидит за буфером LMV358: на Uno R3 светодиод подключён через операционный усилитель, а не напрямую к ножке. Пин не грузится светодиодом, и в режиме INPUT с подтяжкой он не тускло-светится — в отличие от Nano, где светодиод с резистором висит прямо на пине. Дальше по линии питания: полифьюс на 500 мА в разрыве USB-линии — при перегрузке 5 В компьютер отключает порт, и плата оживает только после переподключения кабеля.
Стабилизаторы — два, и они разные: NCP1117 выдаёт 5 В с VIN при входном 7–12 В, а линия 3V3 питается от маленького LP2985 с потолком 50 мА. Датчик с голодом больше полусотни миллиампер на 3V3 вешать нельзя — потянет линию вниз. Что можно питать от батареек и через какой вход — в уроке про питание без USB.
Вторая половина того же корпуса LMV358 работает компаратором выбора источника: она следит, что выше — напряжение на VIN или линия USB, — и подаёт на главный стабилизатор победителя. Поэтому кабель и баррель одновременно не устраивают драку за питание: решает схема, за доли секунды. На части клонов этого узла нет, и два источника сразу — лотерея: ещё один повод открыть PDF своей платы, а не оригинала.
// Счётчик boot объявлен глобально, но каждый авто-ресет обнуляет RAM:// при каждом открытии порта скетч начинает жизнь с нуля. Это не баг// в коде, а конденсатор 100 нФ от DTR к RESET, нарисованный в схеме.int boot = 0; void setup() { Serial.begin(9600); pinMode(LED_BUILTIN, OUTPUT); boot++; Serial.print("start nomer "); Serial.println(boot); digitalWrite(LED_BUILTIN, HIGH); delay(60); digitalWrite(LED_BUILTIN, LOW);} void loop() { Serial.print("up, ms: "); Serial.println(millis()); delay(1000);}Когда схема экономит вечер
Диагностика по узлам. Скетч рестартует при открытии монитора — это не баг кода, а авто-ресет; если датчику нужно две-три секунды на старт, он будет проходить её каждый раз. Лечение: держать инициализацию в setup и подождать её там, либо на время работы поставить блокирующий конденсатор около 10 мкФ между RESET и GND — и снять его перед прошивкой, иначе загрузка не начнётся: импульс DTR перестанет доходить. Вкладки и настройки окна монитора, из-за которых всё это всплывает, — в уроке про монитор порта в IDE 2.
Арифметика по схеме спасает и при горячей плате. Стабилизатор NCP1117 сбрасывает на себя разницу между входом и 5 В: при входных 12 В и токе 200 мА на кристалле рассеивается (12−5)×0,2 = 1,4 Вт — корпус без радиатора уже вполкасания горячий. Плата греется не потому, что испорчена: так устроен линейный стабилизатор, и схема честно показывает, куда уходит ватт-другой. Лечение — снизить входное до 7–9 В или увести моторы и серво на отдельный источник.
Клоны читаются по своим схемам, а не по схеме оригинала: мост CH340 вместо FT232 требует отдельного драйвера — разбор невидимой платы; на дешёвых клонах полифьюса может не быть вовсе, и вместо защиты горит порт компьютера; светодиод пина 13 без буфера ведёт себя как на Nano. Полный список отличий при покупке — в уроке про клон и оригинал. Когда плата мертва и мост не помогает, прошивку кладут мимо него внешним программатором — usbasp и запись загрузчика.
Двухрядный разъём ICSP на схеме — шесть контактов MISO, MOSI, SCK, RESET, 5V и GND — запасная дверь в чип. Через него внешний программатор пишет загрузчик мимо USB-моста: когда мост сгорел или загрузчик затёрт скетчем, ICSP остаётся единственным входом. Раскладка у Uno, Nano и Mega совпадает, ключ на разъёме подскажет ориентацию шлейфа; перепутал направление — и питание придёт не на ту ножку.
Схему Nano стоит открыть рядом с Uno хотя бы ради контраста: мост FT232RL со своей обвязкой вместо 16U2, питание только от mini-USB или ножки 5V — барреля нет вовсе, и VIN-истории к Nano не относятся. Зато конденсатор авто-ресета на схеме Nano на своём месте: рестарт при открытии монитора у неё ровно такой же, и лечится тем же способом.
| Узел на схеме | Номинал | Что объясняет |
|---|---|---|
| Конденсатор DTR → RESET | 100 нФ | плата перезапускается при каждом открытии порта |
| Буфер светодиода L | LMV358 | пин 13 не грузится светодиодом и в INPUT не светится |
| Полифьюс в USB-линии | 500 мА | перегрузка 5V отключает порт до переподключения |
| Стабилизатор 3V3 | LP2985, 50 мА | датчики с током больше 50 мА на 3V3 вешать нельзя |
Привычка, которая отрабатывает себя на первой же «мистической» истории: PDF схемы и pinout-карта из урока про карты распиновки лежат в папке проекта. Прежде чем винить код, сверяюсь с узлами: авто-ресет, буфер, полифьюс и потолок 3V3 объясняют девять из десяти историй, в которых «плата ведёт себя как живая».
Второе применение — ремонт и трезвая оценка железа. Увидели на схеме пустое место там, где у оригинала стоит полифьюс, — держите в голове, что защита от короткого замыкания на этой плате только со стороны компьютера. Нашли мост CH340 — заранее поставили драйвер. Схема читается за десять минут, а повторяет она поведение платы точнее любой инструкции из набора.
Последнее, что легко пролистать в схеме, — керамическая россыпь 100 нФ у каждой ножки питания чипов. Пока макетка собрана короткими проводами, она невидима; на длинной плетёнке от внешнего блока младшие разряды analogRead начинают дрожать. Плата гасит всплески у самих чипов, а последний отрезок — провода макетки — остаётся без прикрытия: конденсатор на 100 нФ у входного разъёма стоит копейки и чистит каналы АЦП заметно.
- 1. Почему скетч рестартует при открытии монитора порта?
- 2. Что даёт буфер LMV358 на пине 13 у Uno R3?
- 3. Что делает полифьюс на 500 мА в USB-линии?
- 4. Сколько тока можно вешать на линию 3V3 у Uno?
- 5. Как временно отключить авто-ресет для скетча с долгой инициализацией?
- Схема платы лежит в Documentation на arduino.cc: PDF Schematics и исходники EAGLE, бесплатно для каждой официальной платы
- 100 нФ от DTR к RESET — авто-ресет: каждый открытый порт перезапускает скетч; блокировка на время работы — конденсатор 10 мкФ на RESET, снять при прошивке
- На Uno светодиод пина 13 сидит за буфером LMV358: пин не грузится и в INPUT не светится; на Nano LED прямо на пине
- Полифьюс 500 мА защищает USB-линию, 3V3 Uno — LP2985 на 50 мА, 5 В с VIN даёт NCP1117 при входном 7–12 В
- Схема клона отличается: CH340 вместо FT232, полифьюса может не быть — ищите PDF под свою ревизию
Частые вопросы по теме урока
- Почему скетч рестартует при открытии монитора порта?
- Открытие порта дёргает DTR, и импульс через конденсатор 100 нФ проходит на RESET — чип стартует заново. Это нарисовано в схеме платы. конденсатор 100 нФ от DTR к RESET даёт импульс сброса
- Что даёт буфер LMV358 на пине 13 у Uno R3?
- На Uno R3 светодиод L подключён через операционный усилитель: пин свободен от нагрузки. На Nano светодиод сидит на пине напрямую и в INPUT с подтяжкой тускло светится. светодиод не грузит пин, и в INPUT пин не светится
- Что делает полифьюс на 500 мА в USB-линии?
- Полифьюс — самовосстанавливающийся предохранитель: перегрузили 5 В — линия отвалится, оживает после переподключения кабеля. На дешёвых клонах его может не быть. отключает USB-линию при перегрузке до переподключения
- Сколько тока можно вешать на линию 3V3 у Uno?
- 3V3 питается от отдельного LP2985 с потолком 50 мА. Датчик с большим потреблением потянет линию вниз — ему нужен свой стабилизатор. до 50 мА — там стоит маленький LP2985
- Как временно отключить авто-ресет для скетча с долгой инициализацией?
- Конденсатор ~10 мкФ между RESET и GND глушит импульс DTR. Перед прошивкой его снимают: без импульса DTR загрузчик не дождётся сброса. конденсатор около 10 мкФ между RESET и GND, снять при прошивке