Шлагбаум на въезде в мой гараж простоял открытым сорок минут — я уходил монтировать видео для этого сайта, — а когда вернулся к столу, корпус SG90 не поддался пальцу: пластик разогрелся так, что пахло горячей пылью. При этом серво «ничего не делала». Она стояла на 90 градусах и ждала следующей команды, как её и просили. Первой мыслью был брак, и я поймал себя на том, что уже открыл вкладку с корзиной маркетплейса. Спасло то, что новая серво стоила как две пиццы, а я всё ещё считал себя инженером: включил Serial и стал считать — если серво стоит на месте, откуда у неё вообще энергия на нагрев?
Разбор этой загадки и есть урок. Мы посчитаем ток в каждом режиме работы — от лёгкой езды до удара в упор, найдём, где именно серво работает на износ, разберём мою «оптимизацию», которая делала всё хуже, и соберём скетч со счётчиком командных импульсов: он делает невидимую работу стоящей серво видимой в Serial, а заодно показывает, что происходит после detach().
«Стоит» не значит «отдыхает»
Сервопривод — не моторчик, который засыпает, когда ему нечего крутить. Внутри у неё замкнутый контур: плата постоянно сравнивает заказанный угол с показаниями потенциометра на выходном валу и гонит мотор, пока есть рассогласование. Механику этого контура мы разбирали по деталям в уроке про анатомию серво изнутри. А теперь самая хитрая часть, на которой спотыкаются все, включая меня того времени: команда write(90) — не разовый приказ, а подписка. После неё библиотека Servo.h шлёт импульс каждые 20 миллисекунд — пятьдесят раз в секунду, без праздников и выходных.
Плата серво слушает эти импульсы и держит мотор в состоянии боевой готовности: чуть тронули качалку — вал тут же возвращают на место. Стоящая серво — это система, которая работает прямо сейчас, просто её работа не видна глазу. На поддержание готовности уходит ток, а любой ток в моторе и ключах превращается в тепло внутри корпуса размером с крупную виноградину. Вот и вся тайна «холодного дымохода»: серво греется стоя по той же причине, по которой греется рука, сжимающая мяч, — статическое усилие тоже тратит энергию.
Сколько она ест: ток в четырёх режимах
Числа — каждое с условием, потому что вилки у SG90 широкие, а дешёвые экземпляры гуляют внутри вилок прилично. Серво стоит без нагрузки, качалку никто не трогает: порядка 10–30 мА — это электроника и микрокоррекции. Едет без нагрузки: 100–250 мА, причём верх вилки — в момент старта, пока шестерни разгоняются. Держит угол, а пружина или ваш палец давят на рычаг: ток подскакивает к сотням миллиампер и растёт пропорционально силе подпора. Уперлась в неподвижное препятствие и продолжает получать команду: это режим упора, 650–700 мА — максимум из даташита, мотор давит изо всех сил и никуда не едет.
При 600 мА на обмотках и ключах рассеивается около ватта тепла в корпус весом девять граммов — отсюда «утюг» через сорок минут. У крупной MG996R цифры другого порядка, мы их отдельно считали в уроке про MG995 и MG996R. Вывод, к которому я пришёл с мультиметром и термометром: греется не «езда», а «борьба». Езда даже полезна — вал хотя бы крутится. А вот каждый час в подпоре или упоре стоит проекту и корпуса, и шестерён, и, если питание общее с платой, случайных перезагрузок Arduino: об этом отдельная история в уроке про дрожь и просадки питания.
Одна оговорка для честности: ток покоя я мерил лабораторным блоком с амперметром в разрыве плюсового провода, и ваши экземпляры могут отличаться на десятки процентов — дешёвая партия есть дешёвая партия. Но порядок величин держится крепко: разрыв между «стоит без нагрузки» и «стоит с подпором» — десятикратный, и именно этот разрыв отделяет тёплую серво от утюга. Поэтому в таблице ниже я прошёлся по всем режимам с рекомендацией для каждого — она короткая, потому что толковых вариантов лечения немного.
| Режим | Ток SG90 (5 В) | Что происходит | Что делаю я |
|---|---|---|---|
| Едет без нагрузки | 100–250 мА | штатная работа, старт — самый прожорливый момент | норма, ничего |
| Стоит без нагрузки | 10–30 мА | микрокоррекции по потенциометру | норма |
| Держит с подпором | 200–650 мА | мотор рвётся от цели, корпус теплеет за минуты | убрать подпор или detach() |
| Упёрлась в упор | 650–700 мА | бесконечный stall, гудит на весь стол | отступ 15–20° от края |
| После detach() | импульсы кончились | плата почти молчит, вал свободен | следить, чтобы вал не свалила нагрузка |
Теперь моя проходная ошибка, чтобы вы её не повторяли. Я решил, что серво иногда «теряет команду», и начал слать write() в каждом проходе loop — десятки тысяч раз в секунду, для надёжности. Схема выглядела разумно и работала ровно наоборот: плата серво при каждом импульсе видела свежую команду, контур коррекции не спал ни миллисекунды, и серво, которая могла бы стоять тихо, гудела от каждой микровибрации, а ток удержания вырастал в разы. Ничего это не чинило: write(90) и так подписка навсегда, частота повторов ничего не добавляет — частота уже задана библиотекой на 50 Гц.
Правило, которое я вынес из этого тупика: write() вызывается только при перемене цели. Сменился угол — посылаем приказ один раз; угол тот же — молчим, библиотека сама держит поток импульсов. Скромнее выглядит в коде — тише работает в железе. И это же правило защищает от второго симптома: постоянные повторы команды загоняют серво в микрокачания, а микрокачания в сумме с просадкой питания и роняют Uno — цепочку мы уже разбирали в уроке про дрожь.
Три честных способа дать ей остыть
Первый способ — отступ: никогда не заказывайте угол, на котором качалка прижимается к упору или к неподвижной детали. Мы это правило вырабатывали в уроке про серво-переключатель с двумя положениями: 15–20 градусов запаса — и режим упора исчезает из жизни проекта насовсем. Второй способ — detach(): когда серво доехала и вал можно отпустить, четвёртым вызовом библиотеки снимаем командные импульсы совсем — плата серво почти замолкает, и нагрев падает до комнатной температуры. Но у способа жёсткая граница: если нагрузка способна сдвинуть вал — ветер, пружина, противовес, вес самой заслонки, — без импульсов она сделает это за вас, и вернуть всё на место можно будет только новым write(). Поэтому на указатель с лёгким флажком я ставлю detach() всегда, а на шторку с пружиной — никогда.
Третий способ — питание: отдельный источник на 5–6 В с общим минусом и Arduino, чтобы борьба серво не роняла плату и не грела её стабилизатор. Вся схема с номиналами собрана в уроке про внешнее питание серво; граница простая — блок на 2 А вывозит одну SG90 с запасом, на две серво с подпором он уже впритык. Питание не убирает нагрев самой серво — ватт тепла куда-то деваться должен, — но разделяет проблемы: серво греется своё, электроника живёт отдельно. А detach() в цепочке стоит последним: сам вызов — одна строка после приезда, но у него есть нюансы с таймингом и повторным захватом пина; мы их разбирали в уроке про attach, write и detach. Ниже два скетча: минимальный паттерн «приказ только при перемене цели» и счётчик командных импульсов, который переводит нагрев в числа и умеет останавливаться по кнопке.
#include <Servo.h> Servo sv;int cel = 90; void setup() { sv.attach(11); sv.write(cel); Serial.begin(9600);} void loop() { int novaya = 90; // сюда встаёт ваш датчик или кнопка if (novaya != cel) { // write() только при перемене цели cel = novaya; sv.write(cel); Serial.print("cel="); Serial.println(cel); }}- 1. Серво стоит на угле без нагрузки, качалку никто не трогает. Почему корпус всё равно теплеет?
- 2. Рычаг упёрся в неподвижную стенку, команда продолжает приходить. Ток SG90?
- 3. Что на самом деле делает write(90), вызванный один раз в setup()?
- 4. detach() безопасен, когда…
- 5. Стрелка-указатель часами висит на одном угле. Какая схема против перегрева?
- Серво, которая стоит, всё равно работает: импульсы 50 Гц и микрокоррекции — источник тока удержания
- Борьба греет сильнее езды: подпор — сотни мА, упор — 650–700 мА
- write() зовём только при перемене цели — частые повторы греют и ничего не чинят
- detach() останавливает насос импульсов — но не для нагруженного вала
- Отступ 15–20° от упоров дешевле любого радиатора
Частые вопросы по теме урока
- Серво стоит на угле без нагрузки, качалку никто не трогает. Почему корпус всё равно теплеет?
- write() — это подписка: импульсы идут всегда, плата серво держит мотор готовым к коррекциям. Ток на готовность — и есть ток удержания. библиотека шлёт импульсы 50 раз в секунду, и контур серво гонит микрокоррекции
- Рычаг упёрся в неподвижную стенку, команда продолжает приходить. Ток SG90?
- Мотор давит изо всех сил и никуда не едет — это максимальный ток и максимальный нагрев. Час в таком режиме убивает и корпус, и шестерни. до 650–700 мА — режим упора
- Что на самом деле делает write(90), вызванный один раз в setup()?
- Это подписка: библиотека в фоне шлёт импульс каждые 20 мс, пока не скажут detach(). Повторные write() с той же целью ничего не добавляют. включает непрерывный поток импульсов 50 Гц с целью 90°
- detach() безопасен, когда…
- После detach() вал свободен. Пружина, ветер или вес заслонки сведут позицию — возвращать придётся новым write(). нагрузка не способна сдвинуть вал с места
- Стрелка-указатель часами висит на одном угле. Какая схема против перегрева?
- Один приказ плюс detach() — и насос импульсов остановлен. Частые повторы, высокое напряжение и потеря общего минуса — наоборот, из моего личного антирейтинга. вызвать write() один раз, после приезда — detach(), если вал ничем не прижато