У меня на столе стояла классическая связка: серво SG90 вращает голову с дальномером HC-SR04, глазает по сторонам, как будто ищет врага. Ищет она его была недолго: при каждом повороте Arduino уходила в перезагрузку, в покое серво вздрагивала с частотой раз в секунду, а когда я вынес конструкцию на двухметровом шлейфе проводов — добавился тонкий визг, от которого у кота вставали уши. Три раза я переписал скетч и один раз даже переустановил Arduino IDE. Виноват оказался USB-хаб, а скетч был невиновен с самого начала.
Дёрганье — это не диагноз, а симптом, и у него три разных виновника: нехватка тока в момент старта, помехи от самого мотора и плохая проводка. С первого взгляда они выглядят одинаково — серво нервничает, — но лечатся по-разному, поэтому здесь мы разберём все три по очереди, посчитаем токи и напряжения руками и соберём диагностический скетч, который за минуту показывает, перезагружалась плата или нет. Финальная схема лечения — отдельное питание с общим проводом — живёт в следующем уроке, а сейчас научимся ставить диагноз.
Симптом первый: плата перезагружается — это просадка
Вспомним паспортные токи SG90 из первого урока раздела: в покое около 10 мА, в движении 100–250 мА, при заклинивании или ударе об упор — до 650–700 мА. Пусковой ток — это не «чуть больше рабочего»: в первые десятки миллисекунд мотор разгоняется из нуля, и серво легко утыкается в верхнюю границу. Дальше включается закон Ома, который мы считали в уроке про ток: сопротивление тракта от порта USB до серво — кабель, разъёмы, предохранитель на плате — легко набирает 0,7–1 Ом. Умножаем: 700 мА × 1 Ом = 0,7 В падения. На шине вместо 5 В остаётся 4,3.
Микроконтроллер ATmega328P сам по себе держится до 2,7 В — у него есть отдельный детектор питания. Но USB-мост (у клонов это CH340), стабилизатор и вообще вся обвязка нервнее: у большинства клонов сбросы начинаются, когда шина проваливается ниже 4,4–4,5 В, и мой хаб добавил к кабелю ещё свои пол-Ома. Симптом однозначный: Serial-монитор внезапно начинает печатать лог с самого начала, как будто плату только что воткнули. Никакой мистики — плата честно перезапустилась, и все переменные скетча обнулились вместе с ней.
#include <Servo.h> Servo sv; void setup() { Serial.begin(9600); Serial.print("Старт, t="); Serial.println(millis()); sv.attach(9); sv.write(90); delay(500);} void loop() { Serial.print("t="); Serial.println(millis()); sv.write(0); // резкий перелёт через весь ход delay(800); Serial.print("t="); Serial.println(millis()); sv.write(180); delay(800);}Работает детектор так: millis() считает миллисекунды с момента старта платы, и после перезагрузки счёт начинается заново с нуля. Если в непрерывном логе t=1240, t=2040 вдруг всплывает строка «Старт, t=0» — это отпечаток сброса, точнее улики не бывает. Приём универсальный: он ловит и просадки от серво, и глючный кабель, и плохой контакт в макетке. Заодно скетч провоцирует проблему резким перелётом через весь ход — именно такие команды дают максимальный пусковой ток. Приём из урока про отладку через Serial в новых одеждах: лог — ваш чёрный ящик, он помнит то, чего вы не видели глазами.
Симптом второй: дрожь, вздрагивания и визг — это помехи
Внутри серво крутится коллекторный моторчик, а коллектор — это щётки, которые рвут цепь сотни раз в секунду и при каждом разрыве выбрасывают искру. Искра — импульс помехи, и летит он по двум путям: по проводам питания и прямо в воздух, потому что двухметровый шлейф — приличная антенна. Сигнальный провод, лежащий в том же жгуте, что и силовые, ловит эти импульсы и подмешивает их к импульсам управления. Результат я и видел на голове с дальномером: сердо вздрагивает в те моменты, когда должна стоять, потому что вместо чётких 20-миллисекундных посылок её приёмник получает кашу.
Плохие провода усиливают всё сразу. Тонкая макетная перемычка — это около 0,3 Ом и заметная индуктивность: при резком скачке тока через неё ЭДС самоиндукции подкидывает в шину лишние милливольты, а на длинном плече ещё и падение напряжения. Отсюда первое правило проводки: силовые провода серво — короткие и толстые, сигнальный — отдельно, вдали от силового жгута. Второе правило: дрожь в покое ±1° без нагрузки у дешёвой аналоговой SG90 — почти норма, её схема управления пересчитывает позицию каждые 20 мс и постоянно мелко правит вал; цифровая серво в тех же условиях стоит как вкопанная. А вот резкий визг вместе с нагревом корпуса — уже не норма: так звучит мотор, которому не хватает тока или который держит позицию против сопротивления.
| Симптом | Вероятная причина | Первая проверка |
|---|---|---|
| Плата перезагружается при старте движения | Пусковой ток просаживает питание | Лог с t=0; отключить серво — стабильность вернулась? |
| Серво вздрагивает в покое без нагрузки | Наводки на сигнальный провод; у аналоговых серво — норма ±1° | Развести сигнальный и силовые провода в разные стороны |
| Тонкий визг при удержании позиции | Мотор против нагрузки или нехватка тока | Снять нагрузку: визг ушёл — дело в токе |
| Серво бьётся в упор и гудит | Угол за пределами механики (544 мкс и меньше) | Вернуть вилку 1000–2000 мкс |
| Дёрганье усиливается с длиной проводов | Падение напряжения и индуктивность шлейфа | Сократить силовые провода до 20–30 см |
Лечение на стороне схемы стоит копейки. Электролитический конденсатор 470–1000 мкФ между плюсом и минусом питания серво — прямо у её разъёма, плюс к плюсу, — превращает острый провал на пусковом токе в пологую ямку: конденсатор отдаёт недостающее за те миллисекунды, пока тракт не успел. Рядом не помешает керамика на 0,1 мкФ — она гасит высокочастотную часть помех, которую электролит пропускает мимо ушей из-за собственной индуктивности. Это та же медицина, что в любой схеме с моторами, и в уроке про шины питания макетки она разобрана подробнее. Действие конденсатора видно и в цифрах: ниже в симуляторе пары i= и v= считаются без него, и на упоре шина проваливается в зону сброса — тот же формат пар имя=значение, что рисует график в Serial Plotter, только графику здесь нужен уже не угол, а милливольты.
И трюк из арсенала радиомодельщиков, который я подсмотрел на форуме после истории с MG995: сначала сигнал, потом питание. Рывок серво к упору при подаче напряжения случается, когда она просыпается раньше, чем получает валидные импульсы. Порядок «attach() и write() выполнены, серво получает команду — и только затем на неё подаётся питание» убирает стартовый удар почти полностью. В схеме это реле или транзистор на силовой линии; в жизни — просто не подавайте питание до того, как скетч запустился и отработал setup().
Порядок диагностики: от дешёвого к дорогому
Диагностика всегда идёт от дешёвых проверок к дорогим. Шаг первый: отключите серво и запустите плату — если перезагрузки исчезли, код почти наверняка не виноват, вы экономите вечер. Шаг второй: замените источник — питание от зарядки телефона 5 В 2 А через разъём вместо USB; серво при этом пока питаем от того же тракта, но у зарядки запас тока вдвое больше. Шаг третий: снимите серво с механизма и запустите на столе — если на столе всё плавно, а в механизме дёргается, вы упёрлись в нагрузку и стопорные токи, и это уже не помехи, а арифметика питания. Шаг четвёртый: разведите провода и добавьте конденсатор — косметика, которая лечит остаточные подрагивания.
Если после всех шагов просадка остаётся — значит, задача честно переросла USB, и нужен внешний источник для мотора. Как его выбрать, рассчитать запас по току и соединить с Arduino через общий провод — тема следующего урока, финального в этой ветке: сначала диагноз, потом лечение. Но не перепрыгивайте диагностику: внешний блок питания, прикрученный к схеме с кривой землёй, лечит не то и добавляет свои глюки.
- Дёрганье — симптом с тремя виновниками: просадка питания, помехи от мотора, плохая проводка
- Пусковой ток SG90 до 650–700 мА; тракт USB с потерями 0,7–1 Ом съедает до 0,7 В — сбросы у клонов начинаются ниже 4,4 В
- Детектор сброса: печатайте t=millis() в loop(); строка «Старт, t=0» в логе — плата перезагрузилась
- Силовые провода короткие и толстые, сигнальный — вдали от силового жгута; электролит 470–1000 мкФ у разъёма серво
- Дрожь ±1° в покое у аналоговой серво — норма; визг с нагревом — нехватка тока
- Порядок диагностики: убрать серво → сменить источник → снять нагрузку → развести провода
- 1. Плата перезагружается в момент старта серво. Что происходит электрически?
- 2. Серво съедает 700 мА, сопротивление тракта питания — 1 Ом. Сколько остаётся на шине 5 В?
- 3. Серво едва заметно вздрагивает, стоя на месте без нагрузки. Как это читать?
- 4. Что делает электролитический конденсатор 470–1000 мкФ по питанию серво?
- 5. С чего правильно начинать диагностику дёрганья?
Частые вопросы по теме урока
- Плата перезагружается в момент старта серво. Что происходит электрически?
- Пусковой ток SG90 — сотни миллиампер, и падение напряжения на тракте оставляет шине меньше 4,4 В: обвязка платы ловит сброс. Пусковой ток серво просаживает шину питания ниже рабочего предела
- Серво съедает 700 мА, сопротивление тракта питания — 1 Ом. Сколько остаётся на шине 5 В?
- U = I × R = 0,7 А × 1 Ом = 0,7 В падения. 5 − 0,7 = 4,3 В — зона сбросов у клонов с CH340. Около 4,3 В — потеря 0,7 В по закону Ома
- Серво едва заметно вздрагивает, стоя на месте без нагрузки. Как это читать?
- Аналоговая серво непрерывно микроправит вал, ±1° дрожи — паспортное поведение. Цифровые серво в тех же условиях стоят тише. Для дешёвой аналоговой серво это почти норма: схема пересчитывает позицию каждые 20 мс
- Что делает электролитический конденсатор 470–1000 мкФ по питанию серво?
- В первые миллисекунды пуска конденсатор отдаёт недостающий ток, и провал на шине становится мелким — меньше шансов на сброс. Сглаживает провал напряжения на пусковом токе
- С чего правильно начинать диагностику дёрганья?
- Диагностика идёт от дешёвого к дорогому: сначала исключить серво из схемы, потом менять источник, потом разбираться с проводкой. Отключить серво и проверить, вернулась ли стабильность платы