Табличка «занят / свободно» на двери моей мастерской держалась на серво: приехала на 90 — табличка повернулась ребром, и всё, больше от неё ничего не требовалось часами. Механика простейшая, нагрузка нулевая — и именно поэтому то, что случилось дальше, так поучительно. Днём я был доволен, а ночью из-за двери тянуло тонкое «пиии», и корпус серво оставался тёплым, хотя не ездила она со вчерашнего вечера. Мультиметр в разрыве питания показывал честные 25–40 мА — в покое и без нагрузки; для сравнения, после detach() та же серво брала 4–6 мА, но до этого я ещё не додумался. Разница в восемь раз — и вся она уходила в тепло корпуса. Серво не спала: каждые 20 мс ей приходил импульс, внутренняя плата сравнивала заказ с потенциометром и подправляла вал туда-сюда на доли градуса. Грелась, жужжала и ела ток за ноль полезной работы — идеальный жилец: ничего не делает, а ресурс ест, только платила я. К концу недели я знал про дрожание серво всё, что нужно на практике: где у неё мёртвая зона, что делает detach() и почему конденсатор за копейки закрывает половину проблем, — и табличка с тех пор молчит годами. Теперь рассказываю по порядку.
Почему серво дрожит: борьба на грани мёртвой зоны
Серво — следящая система, и лёгкая дрожь у неё не поломка, а работа на грани. Внутри вал связан с потенциометром; плата раз в кадр сравнивает заказанный импульс с его показанием и при рассогласовании включает мотор. Мёртвая зона SG90 — порядка 10 мкс: всё, что меньше, серво игнорирует, и правильно делает. Но потенциометр шумит на единицы микросекунд, плюс наводки с проводов, плюс люфт шестерён — и плату шатает ровно по границе «стоять / поправить», где каждая микросекунда шума уже решение. Получается микро-коррекция туда-сюда по несколько раз в секунду — та самая ночь, только в замедленной съёмке: каждый кадр серво что-то решает, и решение не «спать». Сверху это выглядит как дрожь, снизу — как работа по уставу. Если дрожь мелкая и редкая — норма жизни дешёвой серво: моя табличка так и жила, изредка вздрагивая, и месяц я считал это характером механизма. Если вал ходит на градус-два постоянно — ищите источник по порядку: питание, контакты, механика. Изношенный потенциометр — любимая болезнь мелких MG90S: у них он стоит на редукторе и изнашивается сам собой, без всяких моих усилий. Плохой контакт в макетке ловится перетыканием проводов, а просадку питания слышно по гулу при старте. Разбор внутренностей я делал в уроке про анатомию серво изнутри — там про редуктор и почему потенциометр вообще врёт.
| Симптом | Диагноз | Лечение |
|---|---|---|
| мелкая дрожь в покое | шум потенциометра на грани мёртвой зоны | detach() после приезда |
| дёргается, когда едет вторая серво | просадка 5 В от соседнего мотора | отдельное питание и общий GND |
| гудит и греется без движения | держит позицию импульсами под нагрузкой | освободить механику или смириться |
| после detach вал уезжает | нагрузка поворачивает вал | detach запрещён, менять механику |
| дрожит у 0° или 180° | цель у самого упора | уводить цели на 10–15° от краёв |
detach(): выключатель борьбы
Лечение номер один — detach(). Он не выдёргивает провода и не гасит питание: он просто перестаёт слать импульсы, и это ровно та пауза между кадрами, только бесконечная. А без импульсов плате серво нечего сравнивать — мотор обесточен, вал обмякает, и его можно повернуть рукой. Ток падает с 25–40 мА в покое до 4–6 мА — столько ест уже только её внутренняя платка, ждущая импульсов; моя табличка после этой одной строки перестала греться и замолчала, и «пиии» из-за двери ушло в ту же ночь. Обратная сторона: серво больше не держит нагрузку. Если на вал давит заслонка, ворота или пружина — после detach механизм уедет сам, и код этого не заметит. Моё правило: механизм «приехал и стоит» — делаю detach; на вал давит или идёт непрерывное слежение — не трогаю. И вторая ловушка, на которой я обжёгся: attach() в начале loop(). Цикл крутится десятки тысяч раз в секунду, каждый проход заново включает импульсы — и дрожь возвращается, будто вы ничего и не отключали: мой флюгер на даче месяц жил с этим багом, пока я не поставил флаг. Attach — только по событию, вместе с новым приказом. Флаг занял одну переменную и закрыл вопрос навсегда.
Питание и фильтры: два конденсатора на разные беды
Вторая серия дрожи — электрическая, и тут копеечные детали работают лучше любого кода. Электролит 470–1000 мкФ на рельсе 5 В рядом с серво сглаживает просадки длительностью в миллисекунды — а старт мотора как раз такая: ток с десятков миллиампер скачет к 650–700 при подпоре, напряжение проваливается, и у соседей по рельсе начинается своя жизнь. Как собрать такую развязку, показано в уроке про конденсаторный фильтр питания и в уроке про внешнее питание макетки. Керамика 100 нФ (маркировка 104) от сигнального провода к земле — инструмент другой: она глотает высокочастотный мусор на микросекундах, который серво ловит как дрожь заказа, но от просадки питания не спасает — не надейтесь, у меня эта иллюзия прожила один вечер, пока я не понял, что лечу не ту беду. Ставятся они по-разному: электролит — у разъёма питания, керамика — прямо у сигнального пина серво, чем короче путь до земли, тем честнее она работает. У меня керамика втыкается в макетку соседней с серво дорожкой — сантиметр провода, и больше ничего. Мультиметр просадку в миллисекунду не покажет — стрелка не успеет, поэтому конденсатор я ставлю без доказательств, а осциллограф, если он есть, покажет, сколько именно всплесков ваша рельса глотает каждый цикл. И последнее: родные провода SG90 тонкие, на своих 0,65 ампера они роняют сотни милливольт — не кормите серво с дальнего конца макетки через тонкие перемычки.
// Кнопка на D2: серво едет к цели, держит секунду и обмякает#include <Servo.h> Servo srv;int cel = 60;bool byloNazhato = false; void setup() { pinMode(2, INPUT_PULLUP); Serial.begin(9600);} void loop() { bool nazhata = digitalRead(2) == LOW; if (nazhata == true && byloNazhato == false) { srv.attach(11); // импульсы включены только сейчас srv.write(cel); Serial.print("edyu k "); Serial.println(cel); delay(1000); // приезд и секунда держания srv.detach(); // импульсы выключены, ток упал Serial.println("detach: val oslab"); if (cel == 60) { cel = 120; } else { cel = 60; } } byloNazhato = nazhata;}Обратите внимание на порядок в скетче: attach() стоит внутри обработки фронта кнопки, а не в начале loop() — это та самая защита от вечного включения импульсов. После detach() вызовы write() не двигают вал: библиотека запоминает угол, но импульсы пойдут только после следующего attach() — серво просыпается лишь с новым приказом. Хотите проверить — напишите write() после detach() и посмотрите на неподвижный вал: угол записан, импульсов нет. Циферблат в симуляторе ниже ведёт себя честно: после detach стрелка замирает на последнем угле — настоящая серво в этот момент обмякшая: из неё убрали приказы, и вал можно повернуть пальцем. Мультиметр в этот момент покажет те самые 4–6 мА — ток тут постоянный, не миллисекундный, и стрелка прибора успевает. Если ваш механизм держит позицию сам — створка с доводчиком, стрелка с противовесом — detach ставьте всегда: экономия тока с десятков миллиампер до единиц и тишина в ночи. Исключение — непрерывное слежение: там серво по определению не спит, и её честная цена — тёплый корпус. Две серво на одной рельсе дрожат заодно: одна стартует — вторая вздрагивает от просадки, так что фильтр ставьте общий, а ток считайте на обе сразу — мой электролит на 1000 мкФ вырос именно из такой пары. Механизмы под нагрузкой мы обсуждали в уроке про серво-переключатель, а просадки USB с перезагрузками — в уроке про USB-порт и сброс платы.
- 1. Почему серво дрожит, стоя на месте без нагрузки?
- 2. Что именно делает detach()?
- 3. Когда detach() запрещён?
- 4. Что делает керамика 100 нФ (104) у сигнального провода?
- 5. Сколько примерно потребляет SG90 после detach()?
- Дрожь в покое — следящая петля на грани мёртвой зоны: шум потенциометра против заказа.
- detach() выключает борьбу: ток падает с десятков мА до 4–6, вал обмякает.
- attach() — только по событию: attach в каждом проходе loop возвращает дрожь.
- Нагрузка на вал — detach запрещён: механизм уедет, код не заметит.
- Электролит 470 мкФ на 5 В против просадок, керамика 104 у сигнала против мусора — инструменты разные.
Частые вопросы по теме урока
- Почему серво дрожит, стоя на месте без нагрузки?
- Следящая петля каждый кадр решает «стоять или поправить», и шум потенциометра в единицы мкс толкает её к поправкам. Количества здесь важнее слов: единицы мкс шума против зоны в десять. Мёртвая зона тут не защита, а порог, около которого плату и шатает. плата сравнивает заказ с потенциометром, и шум выводит её за границу мёртвой зоны
- Что именно делает detach()?
- detach() прекращает генерацию импульсов, провода остаются на местах. Серво перестаёт бороться за позицию и больше не держит нагрузку. останавливает импульсы: серво обмякает, вал можно повернуть рукой
- Когда detach() запрещён?
- Без импульсов серво не держит позицию. Заслонка с пружиной или ворота после detach уедут молча, и код этого не узнает — проверяется толканием вала рукой. если на вал давит нагрузка — механизм уедет сам
- Что делает керамика 100 нФ (104) у сигнального провода?
- Керамика работает на микросекундах и чистит заказ; на макетке я вешаю её прямо на сигнальный пин серво. Миллисекундные просадки при старте мотора глотит только электролит. глотает высокочастотный мусор, но от просадки не спасает
- Сколько примерно потребляет SG90 после detach()?
- В покое с импульсами — 25–40 мА, после detach — единицы миллиампер на собственную платку. Разница между «греется» и «спит» — одна строка кода. 4–6 мА