Подвес из двух серво я собирал по мотивам камерного пан-тилта: нижняя ведёт панораму, верхняя — наклон. По одному серво — шелк: пишешь угол, рог едет и стоит как вкопанный. В первый совместный тест я скомандовал обоим переехать с 30 на 150 разом — и увидел цирк: верхняя дрожала мелкой дрожью, нижняя шла рывками, а через секунду плата перезагрузилась, и серво обвисли. Три вечера я подозревал код, пока не повесил мультиметр на шину 5 В: в момент совместного старта напряжение проваливалось до 3,8 вольта.
Арифметика, которой мне не хватило тогда. SG90 на старте против трения и инерции тянет до 650 миллиампер на пик — клоны с маркетплейса гуляют от 500 до 800; в удержании без нагрузки — скромные 100–150. Два одновременных старта — 1,3 ампера на несколько десятков миллисекунд. USB-порт по спецификации 2.0 даёт 500 мА, 3.0 — до 900. Дальше арифметика делает своё дело: недостающие 800 миллиампер берутся из ёмкостей, шина проседает, и начался вечер из трёх суток — я умножал два на два в коде, а надо было умножать в амперах. Для тяжёлых MG995/MG996R с пиками до 2,5 ампера всё это умножается ещё и на два, а где именно кончается запас платы, считал урок про пределы питания и разбор пика тока со сбросом платы.
Сюжет урока — лестница решений по возрастанию усилий: развести ходы программой (бесплатно), подстелить конденсатор (копейки, полумера) и главный ответ — отдельный стабилизатор с общей землёй. Ток в симуляторе не нарисовать, но разведённый старт и его логика видны вживую.
Куда упирается шина 5 В
Маршрутов питания у пары серво три, и у каждого свой потолок. Первый — USB: разъём и порт дают полампера, и это потолок до входа на плату. Второй — пин 5V при питании от VIN: бортовой стабилизатор Uno (NCP1117) рассчитан на разницу вход-выход, при 12 вольтах на входе он уже горячий вхолостую, а пиковый ампер серво доводит его до термозащиты — классическая картина, когда плата сбрасывается не от просадки, а от перегрева регулятора. От 9 вольт пик пары серво греет его на (9−5)×1,3 — около 5 ватт: без радиатора это не вариант, а с радиатором — страдание.
Третий маршрут — импульсный понижающий стабилизатор, buck: LM2596 или MP1584 с того же входа 7–12 вольт честно отдают два-три ампера и почти не греются. Я не люблю городить отдельные платы на каждом стенде, но два серво — ровно тот случай, где buck дешевле одного потерянного вечера: платка стоит дешевле бутылки лимонада, а пиковая пара серво перестаёт быть событием. Отдельный блок 5 В на 3 ампера — то же решение без пайки, если проект уже стационарный.
Что происходит при просадке внутри серво — то место, где дрожь рождается физически. У серво внутри собственный потенциометр-датчик и логика, которая сравнивает заказ с фактом; питаются они с той же шины, и когда напряжение проваливается, опорное напряжение датчика плывёт — серво видит рассогласование, которого не было, и начинает охоту за собственным хвостом. На форумах это описывают ровно так: нестабильная линия 5 В делает чтение внутреннего потенциометра нестабильным — отсюда и мелкая дрожь при одновременном движении. Конденсатор здесь — первая помощь: электролит 470–1000 микрофарад прямо у разъёма серво плюс 0,1 мкФ керамика рядом; принцип разбирался в уроке про фильтрующий конденсатор. Но честно: электролит покрывает пик в десятки миллисекунд и не заменяет источник — если средний ток больше, чем даёт линия, банка разрядится, и просадка вернётся.
Отдельная строка бюджета — сами провода до серво. Тонкий дюпон-хвост со всеми контактами добирает до половины ома, и на стартовом пике 1,3 ампера это полвольта и больше: шина у платы стоит честно, а у разъёма серво проваливается ниже четырёх — дрожь рождается именно там. Подвес я перевёл на провода 0,75 квадрата и укоротил хвост до тридцати сантиметров; после этого мультиметр на просадку смотреть расхотелось — смотреть стало не на что.
Разводим старты и кормим отдельно
Программная половина лечения — дирижёр. Пик старта короток, десятки миллисекунд, поэтому если вторая серво трогается на 150 мс позже первой, их пики не складываются: первая уже разогналась и съела меньше, вторая стартует в спокойную шину. Это смягчение, а не лечение — при тяжёлых серво и длинных ходах токи всё равно пересекаются, — но вместе с конденсатором разводка стартов делает пару SG90 приемлемой даже от щедрого USB-хаба. Заодно дирижёр наводит порядок в механике: ходы, которые едут по очереди, выглядят осмысленнее, чем синхронный шахматный ход двух осей.
#include <Servo.h> Servo niz; // нижнее серво — панорама, D11Servo verh; // верхнее серво — наклон, D10 const int PIN_POT = A0; // общая цель для обоихconst int PIN_LED = 12; // горит, пока кто-то в пути const unsigned long T_HOD = 20; // тик ходаconst unsigned long PERENOS = 150; // старт второго после первогоconst float K_EASE = 0.1; int tsel = 90;int lastTsel = -1;float pozA = 90; // позиция нижнегоfloat pozB = 90; // позиция верхнегоint edetA = 0;int edetB = 0;int zHdB = 0; // заказ на ход второго сервоunsigned long tStartB = 0;unsigned long tHod = 0;unsigned long tLog = 0; void setup() { niz.attach(11); verh.attach(10); niz.write(90); verh.write(90); pinMode(PIN_LED, OUTPUT); Serial.begin(9600); Serial.println("Dva servo: start B pozzhe na 150 ms");} void loop() { unsigned long now = millis(); int z = map(analogRead(PIN_POT), 0, 1023, 20, 160); if (z != lastTsel) { // новая цель — раздать обоим lastTsel = z; tsel = z; edetA = 1; // первое трогается сразу zHdB = 1; // второе ждёт переноса tStartB = now + PERENOS; } if (now - tHod >= T_HOD) { tHod = now; if (zHdB == 1 && now >= tStartB) { zHdB = 0; edetB = 1; } if (edetA == 1) { float ostA = (float)tsel - pozA; if (abs(ostA) < 0.6) { pozA = tsel; edetA = 0; } else { pozA = pozA + ostA * K_EASE; } niz.write((int)(pozA + 0.5)); } if (edetB == 1) { float ostB = (float)tsel - pozB; if (abs(ostB) < 0.6) { pozB = tsel; edetB = 0; } else { pozB = pozB + ostB * K_EASE; } verh.write((int)(pozB + 0.5)); } if (edetA == 1 || edetB == 1) digitalWrite(PIN_LED, HIGH); else digitalWrite(PIN_LED, LOW); } if (now - tLog >= 400) { tLog = now; Serial.print("A="); Serial.print((int)(pozA + 0.5)); Serial.print(" B="); Serial.println((int)(pozB + 0.5)); }}Разбор по строчкам. Новая цель с потенциометра раздаётся обоим осям сразу, но флаги разные: нижняя получает edetA и трогается в следующий тик, верхняя получает заказ zHdB с отложенным сроком now + 150 — и лишь через 150 миллисекунд начинает свой ход. Ход у обеих с мягким доводом, K_EASE = 0,1: серво едет плавно и не бьёт по шине резким стартом из стоячей позиции. Светодиод горит, пока в пути хоть одна ось — на живой плате по нему удобно ловить моменты, когда токовый бюджет под напряжением.
Здесь нужна честная оговорка: в симуляторе ток не виден, и разнесённый старт выглядит как эстетика. На живой плате это выглядит как разница между работающим и перезагружающимся стендом. Проверяется мультиметром на шине 5 В в режиме постоянного напряжения: совместный старт без развязки на USB-питании проваливает шину ниже четырёх вольт, с развязкой — просадка мельче и короче. А самый честный индикатор — строка из setup в Serial-логе посреди работы: если она напечаталась заново, плата перезапустилась, и виной почти всегда питание.
У просадки есть вторая роль, о которой забывают: не сброс платы, а защита порта. У большинства USB-хостов на линии стоит ключ с ограничением тока, и пары стартующих серво хватает, чтобы он отрубил разъём. Симптом узнаваемый: серво дёрнулись, монитор замолчал, а после переподключения кабеля всё ожило — это не каприз операционки, это защита отчитала вам амперы.
Питание серво от buck-платки раскидывается так: плюс и минус стабилизатора — на красный и коричневый провода обеих серво, сигнальные провода остаются на пинах платы. И правило, без которого всё это не работает: минус стабилизатора обязан быть связан с GND платы. Импульс управления — разность потенциалов между пином и землёй серво; без общей земли серво слышит не команду, а шум. Подробно это разобрано в уроке про внешнее питание и общий GND, а связывается именно земля — плюс платы к плюсу серво не подключают.
| Источник 5 В | Реальный потолок | Два SG90? | Вердикт |
|---|---|---|---|
| USB-порт | 500 мА (USB 2.0), 900 мА (3.0) | нет | просадка и сброс на совместном старте |
| пин 5V от бортового регулятора, VIN 7–12 В | 0,8–1 А с нагревом | на грани | только с разведёнными стартами и лёгкой нагрузкой |
| buck LM2596 / MP1584 с VIN | 2–3 А без нагрева | да | рабочая лошадка для двух-трёх серво |
| отдельный блок 5 В 3 А | 3 А | да | стационарные проекты: подвесы, роборука, сортировщик |
Диагностика на живой плате укладывается в три шага. Мультиметр в режиме постоянного напряжения на шину 5 В во время движения: провал ниже четырёх вольт на старте — диагноз подтверждён. Мигание светодиода на 13 или повторная строка приветствия в Serial — плата перезапускалась. Тёплый бортовой стабилизатор после пяти минут работы — вы живёте на его потолке, и следующий скачок будет термозащитой. По этим трём симптомам лечится девять из десяти двух-серво стендов, и почти всегда лекарство одно — buck или блок с общей землёй.
Последний абзац — про удержание, о котором забывают на радостях. Серво, которая держит груз, ест постоянно: сотня-полторы миллиампер на SG90 без нагрузки превращаются в полампера и больше под весом, и греется при этом вся скоба. Если механика не падает сама — отпустите серво командой detach, ход освобождения разобран в уроке про detach и свободный рог, или добавьте механический упор, который держит вместо мотора. Правило моего верстака простое: бюджет тока пары серво считается до пайки — два пика плюс тридцать процентов запаса, и если сумма перелезает за 500 миллиампер, buck покупается вместе с серво.
- Пик SG90 на старте — до 650 мА, пара на совместном старте — 1,3 А против 500 мА у USB
- Джиттер при совместном движении — плывёт опорное напряжение внутреннего потенциометра серво от просевшей шины
- Конденсатор 470–1000 мкФ у разъёма серво — первая помощь, но не замена источнику
- Разнесённый старт на 150 мс разводит пики программно — смягчение, а не лечение
- Отдельный buck или блок 5 В 3 А с общей землёй — настоящее решение; бюджет тока считают до пайки
- 1. По одному серво работают чисто, вместе — дрожат, и плата сбрасывается. Первая версия?
- 2. Почему дрожь серво связана именно с питанием, а не с кодом?
- 3. Конденсатор 1000 мкФ у разъёма серво — это…
- 4. Питаете пару серво от buck-платки с 12 В. Что обязательно для работы?
- 5. Стенд с двумя серво час держит груз, и серво греются. Что сделать в первую очередь?
Частые вопросы по теме урока
- По одному серво работают чисто, вместе — дрожат, и плата сбрасывается. Первая версия?
- Два старта против трения складываются в 1,3 ампера, USB даёт 500 мА. Шина проваливается, опорное напряжение датчика серво плывёт — отсюда дрожь, а глубокий провал сбрасывает плату. Просадка шины 5 В от сложившихся пиков двух серво
- Почему дрожь серво связана именно с питанием, а не с кодом?
- Датчик положения внутри серво сравнивает заказ с фактом по опорному напряжению. Когда шина проседает, опора плывёт, серво видит рассогласование, которого не было, и начинает дрожать. Внутри серво свой потенциометр и логика от той же шины — просадка плывёт их опору
- Конденсатор 1000 мкФ у разъёма серво — это…
- Электролит сглаживает короткий пик, но если средний ток больше, чем даёт линия, банка разрядится и просадка вернётся. Источник — buck или блок, конденсатор — подстраховка. Первая помощь на пике в десятки миллисекунд, но не источник тока
- Питаете пару серво от buck-платки с 12 В. Что обязательно для работы?
- Импульс управления — разность потенциалов между пином и землёй серво. Без общей земли команда не существует. Плюсы соединять нельзя — два источника начнут делить шину. Соединить минус buck с GND платы — общая земля
- Стенд с двумя серво час держит груз, и серво греются. Что сделать в первую очередь?
- Греется удержание: серво давит мотором против груза все время. Если механика не падает сама — detach или упор, который держит вес вместо мотора. Отпустить серво командой detach или добавить механический упор