Манипулятор из двух сервоприводов и дальномера — второй проект, которым я гордо хвастался в чате. Собрал за вечер на макетке, питание взял с USB-порта ноутбука: пять вольт же, чего ещё роботу. Первые минуты всё было хорошо, а потом серва делала первый хват — и плата уходила в перезагрузку: светодиод на пине 13 мигал, как при включении, скетч стартовал заново, серва снова хватала, плата снова перезагружалась. Круговорот манипулятора в природе.
Я трижды перезаливал скетч, выкидывал и возвращал библиотеку Servo, вешал конденсаторы на дальномер — всё мимо. Виновата оказалась арифметика, которую я не сделал до сборки. Серва SG90 в момент старта под нагрузкой тянет до 650–700 мА пару десятков миллисекунд, сама плата Uno ест около 50, дальномер прибавляет 15. Складываем пик — за 700 мА. Порт отдавал честные 500 мА — ровно столько, сколько обещает спецификация USB 2.0, и не вольтом больше. Он не «сломался». Он делал ровно то, на что подписывался.
Самое унизительное в той истории — схема была правильной: серва подключена по инструкции, дальномер запитан, код безупречен. Урок — про арифметику, которая стоит между исправной схемой и перезагрузкой: где физически кончается ток, как отличить просадку от других причин сброса и как развести питание, чтобы силовая часть больше никогда не трогала USB-порт.
Три этажа лимита: порт, предохранитель, провода
Ограничений на пути от розетки к макетке три, и они складываются, а не выбираются по очереди. Первый этаж — сам порт. USB 2.0 держит 500 мА после распознавания устройства; до распознавания порт может ограничивать потребление сотней миллиампер, поэтому «на одном ноутбуке глючит, на другом нет» — не мистика, а политика порта. Зарядные гнёзда без передачи данных ограничены только своей начинкой и отдают 1–2 А. Второй этаж — самовосстанавливающийся предохранитель на плате Uno, примерно 500 мА: он греется, наращивает сопротивление, и плата мягко отваливается от USB, а через минуту остывания возвращается. Третий этаж — тонкие провода и контакты макетки: при полампера на них падает ещё 0,1–0,3 вольта, и рельса 5 В проседает уже на входе.
Дальше включается физика микроконтроллера. При падении питания ниже порога около 2,7–2,9 В срабатывает супервизор — brown-out detector: чип уходит в сброс, чтобы не исполнять бред при недокорме. Отсюда точный симптом просадки: плата не замирает и не глючит — она именно перезагружается, с миганием загрузчика и запуском setup() с нуля. Супервизор не спасает данные — он спасает логику: при восстановлении питания всё начинается с setup(), и счётчик загрузок в скетче ниже покажет это наглядно. Если бы в моём манипуляторе кто-то знал это слово заранее, диагноз занял бы минуту, а не три вечера.
| Потребитель | Типичный ток | Пик | Комментарий |
|---|---|---|---|
| Плата Uno без навеса | 45–55 мА | 60 мА | цена за USB-чип, стабилизаторы и индикаторы |
| Серва SG90 | 100–150 мА | до 700 мА | пик в момент старта под нагрузкой |
| Мотор с драйвером | 200 мА | 700+ мА | зависит от заторможенности вала |
| Реле-модуль притянут | 70–90 мА | 90 мА | катушка жрёт своё всё время удержания |
| Дисплей 1602 с подсветкой | 25–30 мА | 30 мА | подсветка — главная статья |
| Датчики (DHT, дальномер, ИК) | 1–15 мА | 15 мА | по мелочи, но в бюджет вписывается |
Проверить подозрение можно за пять минут подменой источника. Отключите USB и накормите макетку от зарядки телефона на 5 В 2 А через тот же кабель: перезагрузки пропали — порт ноутбука был на пределе, дальше живём по бюджету. Считать ток удобно мультиметром в режиме измерения тока, включив его в разрыв плюсового провода: полный разбор режимов и прозвонки — в уроке про мультиметр. Одна тонкость: в разрыве измеряется средний ток, а пики сервы длиной в десятки миллисекунд прибор показывает неохотно — пиковые строки бюджета я беру из даташита, а не из замера.
Куда уходит лимит, видно по цепочке: зарядка отдаёт 2 А, предохранитель на плате держит 500 мА, значит слабое звено между ними — кабель и разъёмы. Дешёвый кабель с жилой 0,2 мм на полуметре длины теряет под током 0,2–0,3 В: на бумаге 5 В, в макетке 4,7. Поэтому силовой кабель беру потолще, а тонкие перемычки оставляю сигналам — они для этого и придуманы.
Диагностика: поймать перезагрузку за руку
Признаки самовольной перезагрузки видны без осциллографа. Первое: светодиод на пине 13 вспыхивает короткой серией при каждом сбое — это загрузчик здоровается, и здоровается он только после сброса. Второе: счётчик millis() в мониторе обнуляется. Третье, самое честное: счётчик загрузок в EEPROM. Переменная в ОЗУ умирает вместе со сбросом, а ячейка EEPROM переживает всё, кроме паяльника. Три ночи наблюдений с таким скетчем закрыли вопрос окончательно: boot= рос на каждом хвате сервы, а uptime доживал максимум до полутора секунд.
Параллельно проверяйте тепло. Палец на предохранитель F1 рядом с USB-разъёмом: тёплый — порт и правда на пределе, холодный при живой перезагрузке — ищите просадку в проводах или в пике потребителя. И гляньте на провода макетки: тонкие перемычки папа-папа — это не силовая проводка, пять ампер через них не гоняют. На клонах Nano есть ещё одна маска той же беды: USB-чип отваливается от просадки раньше контроллера, и порт в системе переоткрывается сам по себе — диагноз тот же, симптом другой.
// Счётчик загрузок переживает любые сбросы питания#include <EEPROM.h> const int YACHEJKA = 0; // ячейка 0 EEPROM void setup() { Serial.begin(9600); int kolichestvo = EEPROM.read(YACHEJKA); if (kolichestvo == 255) { kolichestvo = 0; // чистый чип: во всех ячейках записано 255 } kolichestvo = kolichestvo + 1; EEPROM.update(YACHEJKA, kolichestvo); // update пишет только при изменении Serial.print("boot="); Serial.println(kolichestvo);} void loop() { Serial.print("uptime="); Serial.println(millis()); delay(1000);}Лечение: у силовых органов — свой кошелёк
Лечится всё одним принципом: логика и сила живут на разных источниках. Серву кормлю отдельным источником 5–6 В или настроенным понижающим преобразователем LM2596, моторы — через драйвер от своей шины, а плата остаётся на USB и ведёт только датчики и индикацию. Обязательное условие схемы с двумя источниками — общий минус: ток должен возвращаться к своему источнику, а плата должна слышать нагрузку в одной земле. Про выбор батарей и блоков под макетку целиком написано в уроке про внешнее питание макетки, а раскладка проводов сервы — в уроке про первое подключение серво.
Для реле держите в уме постоянные 70–90 мА: катушка ест их всё время удержания, а не в пике. Конденсатор 470–1000 мкФ на рейку рядом с потребителем — подстраховка, а не лечение: серва берёт стартовый пик из конденсатора, и порт не видит всплеска. Ставлю его всегда, но реальную нагрузку всё равно развожу на отдельный источник. Если бюджет переехал за лимит, а второго источника под рукой нет, временная мера — плавный разгон нагрузки через analogWrite: пик растягивается, и порт доживает. Это костыль, но он честно подписан костылём. Моё рабочее правило: USB держит бюджет до 300 мА — сорокапроцентный запас съедает пики и тепло предохранителя; в схеме есть серва, мотор или больше одного реле — сразу внешний источник, без экспериментов. Как посчитать такой бюджет на бумаге до сборки, разобрано в уроке про бюджет тока проекта, а что происходит с платой при настоящем коротком замыкании — в уроке про защиту от КЗ.
- 1. Сколько тока отдаёт порт USB 2.0 после распознавания устройства?
- 2. Плата перезагружается ровно в момент открытия монитора порта. Виновник?
- 3. Серва в среднем ест 150 мА, но валит плату. Почему?
- 4. Где надёжнее всего считать самовольные перезагрузки?
- 5. Схема: плата на USB плюс серва. Как развести питание правильно?
- Лимит USB — это порт (500 мА), предохранитель на плате (те же 500 мА) и падение на тонких проводах; бюджет считай до сборки, а не после третьей ночи.
- Просадка ловится без приборов: тройная вспышка пина 13, обнулённый millis, счётчик загрузок в EEPROM.
- Сервы, моторы и релейные навесы корми от своего источника с общим минусом; USB оставь логике.
- Конденсатор 470–1000 мкФ у потребителя сглаживает стартовый пик — подстраховка, но не замена отдельному питанию.
- Если плата сбрасывается ровно при открытии монитора — это DTR-автосброс, ток тут ни при чём.
Частые вопросы по теме урока
- Сколько тока отдаёт порт USB 2.0 после распознавания устройства?
- Спецификация USB 2.0 — 500 мА, и предохранитель на плате Uno держит ту же цифру. До распознавания порт может ограничивать устройство сотней миллиампер. Около 500 мА — столько же, сколько держит предохранитель Uno
- Плата перезагружается ровно в момент открытия монитора порта. Виновник?
- Это линия DTR и штатный автосброс, а не питание. Он срабатывает при открытии монитора и загрузке — и никогда от щелчка реле. Штатный автосброс: USB-чип дёргает RESET через конденсатор
- Серва в среднем ест 150 мА, но валит плату. Почему?
- Пик при старте под нагрузкой длится десятки миллисекунд и превышает лимит в полтора раза — 5 В проседает, супервизор отправляет чип в сброс. Стартовый пик до 0,7 А просаживает рельсу 5 В
- Где надёжнее всего считать самовольные перезагрузки?
- ОЗУ обнуляется вместе со сбросом, а EEPROM хранит значение без питания. Счётчик загрузок в ячейке 0 — самый честный детектив. В EEPROM: ячейка переживает любой сброс питания
- Схема: плата на USB плюс серва. Как развести питание правильно?
- У силовых органов свой источник, но общий минус обязателен: ток возвращается к источнику, а плата и нагрузка живут в одной земле. Серву кормить от своего источника, минус общий с платой