Настольные часы с плавной секундной стрелкой я собрал за вечер: серво с рогом-стрелкой, скетч на millis с шагом один градус каждые двенадцать миллисекунд — тот самый каркас из урока про шаг по градусу. Стрелка ползла красиво, гости спрашивали, как я это сделал. Через сутки непрерывной работы я тронул корпус серво и отдёрнул руку: корпус был как кружка с чаем, градусов сорок пять. Серво не делала ничего — просто стояла и ползла. Что её греет, если работы нет?
Работа как раз была. Серво, к которой подключены импульсы, живёт в режиме постоянного слежения: контур сравнивает заданный угол с реальным и каждый микросдвиг исправляет током. Плавный ход по миллис только усугубляет: стрелка движется непрерывно, значит импульсы и коррекции не прекращаются ни на секунду. detach() вернул бы железу покой — но тогда сквозняк от окна сдувает стрелку, а возврат пишется рывком. Получилась дилемма: держать attached и платить током — или отпускать и терять позицию.
Этот урок про цену плавности и про то, как платить её по счётчику. Ток удержания и нагрев стоящей серво я считал по частям в уроке про ток удержания, там же анатомия микрокоррекций; здесь взгляд со стороны скетча: когда серво обязана быть attached, когда можно отпустить, и как построить автомат, который сам делает правильный выбор без вашего участия.
Что ест серво, когда ползёт и когда стоит
Начну с цифр, потому что без них вся стратегия — гадание. SG90 на ходу берёт порядка 100-250 мА, при стопоре около 650 мА; в покое attached, когда ей нечего исправлять, — единицы-десятки миллиампер, но стоит рогу микросдвинуться, контур качнёт ток, и среднее по минуте вырастает. MG996R тяжелее: под реальной нагрузкой 500-900 мА при 6 В, стопор 1,4-2,5 А по даташиту, а на удержании позиции без движения её питание честно оценивают в сумму до 200 мА — цифровые серво агрессивнее поправляют микросдвиги и потому не бывают бесплатными в покое.
Отсюда простая арифметика дежурного режима. Часы-стрелка attached круглосуточно: даже скромные двадцать миллиампер — это почти полватта-часа в сутки только на удержание, а MG996R в той же роли съест до четырёх-пяти ватт-часов и будет заметно тёплой. Блок питания при этом считается не по холостому ходу, а по худшему режиму: вспышка старта плюс запас — порядок расчёта я разбирал в уроке про пиковый ток и сброс платы и в уроке про MG996R против SG90.
Нагрев — тот же счётчик, только в градусах. Корпус серво в 40-45 °C при удержании считаю нормой: ладонь терпит бесконечно. 50-55 °C — предупреждение, у меня так грелись дешёвые клоны SG90 на удержании против пружины. 60 °C и выше — режим, который вымывает смазку из редуктора за месяцы; так я угробил первую серво в поливалке, пока не понял, что она круглосуточно борется с обратной пружиной клапана.
И одна ловушка измерений: ток серво пульсирует вместе с коррекциями, и дешёвый стрелочный амперметр показывает среднее, на которое приятно смотреть и которое ничего не значит. Вспышка в двести миллиампер на пять миллисекунд и пауза до следующей выглядят на приборе как «двадцать мА», а редуктор при этом греется от вспышек. Поэтому я сужу о режиме по двум надёжным свидетелям — ладони и ИК-термометру, а амперметр использую только чтобы поймать грубое: стопор, затор или вспышку старта.
Теперь про отпускание. detach() отключает контур: импульсы по сигнальному проводу прекращаются, редуктор расцепляется, серво перестаёт есть — по шине остаётся ноль с копейками. Цена: рог свободен, и любая внешняя сила — сквозняк, противовес, пружина, чей-то палец — уводит позицию. Когда серво подключают обратно, она возвращает угол из скетча одним рывком: моя стрелка после ночного простоя прыгала на десять градусов с ощутимым щелчком, и гости вздрагивали.
Вывод, к которому я пришёл: detach — не про экономию ради экономии, а про сценарий. Если нагрузку держит механика — рог уравновешен, стрелка горизонтальна, заслонка в нейтрали — отпускать можно и нужно. Если серво единственная, что держит позицию против внешней силы, отпускать нельзя, и платить током придётся, а бороться надо с самой нагрузкой: противовес, трение, фиксатор. Подробно про свободу рога и безопасные положения — в уроке про detach.
#include <Servo.h> Servo strelka; // D11; цель — ручка A0; диод D12 = «на удержании» const int PIN_LED = 12;const unsigned long T_HOD = 12; // 1 градус за 12 мс: плавный ползущий ходconst unsigned long PROSTOJ = 5000; // сколько стоим attached после приездаconst int POROG = 5; // пробуждение, если цель уехала на 5° int tek = 90;unsigned long tHod = 0;unsigned long tPokoj = 0;bool derzhit = true; void setup() { Serial.begin(9600); pinMode(PIN_LED, OUTPUT); digitalWrite(PIN_LED, HIGH); strelka.attach(11); strelka.write(tek); Serial.println("derzhu; 5 s prostoya -> detach");} void loop() { unsigned long now = millis(); int tsel = map(analogRead(A0), 0, 1023, 20, 160); int diff = tsel - tek; if (diff < 0) diff = -diff; if (!derzhit && diff > POROG) { // работа вернулась strelka.attach(11); strelka.write(tek); // встаём на текущий угол, не на цель derzhit = true; digitalWrite(PIN_LED, HIGH); Serial.println("attach: est dvizhenie"); } if (derzhit) { if (tek != tsel && now - tHod >= T_HOD) { tHod = now; tek += (tsel > tek) ? 1 : -1; strelka.write(tek); } if (tek == tsel) { if (tPokoj == 0) tPokoj = now; if (now - tPokoj >= PROSTOJ) { strelka.detach(); derzhit = false; digitalWrite(PIN_LED, LOW); Serial.println("detach: 5 s bez dvizheniya"); tPokoj = 0; } } else { tPokoj = 0; } }}Реальный ток покоя своей серво вы легко померите сами: мультиметр в режиме миллиампер в разрыв минусового провода серво, ручка неподвижна, ждёте минуту. Среднее у attached SG90 у меня ложилось в диапазон от десяти до двадцати мА в зависимости от экземпляра, у клона против пружины — под сотню. Конденсатор 470-1000 мкФ рядом с разъёмом серво в этой схеме не опция: каждая вспышка attach после простоя просаживает тонкие провода, и чем длиннее шлейф, тем заметнее мусор в аналоговых чтениях ручки.
В симуляторе диод играет роль амперметра: горит — серво attached и платит током удержания, погас — по шине тишина. В железе тот же автомат виден по нагреву корпуса: прикоснитесь через час работы к серво, которая стоит в простое отпущенной, и к той, что держит позицию, — разница температур и есть цена, которую считает этот урок. Границы 40-45 °C и 60 °C оттуда же: первая — норма удержания, вторая — сигнал остановиться и пересчитать механику.
| Режим | SG90 | MG996R | Когда выбираю |
|---|---|---|---|
| Плавный ход attached | 100-250 мА, стопор до 650 мА | 500-900 мА под нагрузкой, стопор до 2,5 А | всегда во время движения |
| Удержание без движения | единицы-десятки мА плюс микрокоррекции | до 200 мА по шине | когда позицию держит только серво |
| detach в простое | практически 0 мА | практически 0 мА | позицию держит механика, цель ждёт |
| Старт после attach | вспышка 100-250 мА | вспышка до ампера и выше | учитывать в бюджете блока питания |
В симуляторе виден весь ритм: диод горит — серво на удержании, импульсы идут, контур жив; пять секунд покоя — диод гаснет, по шине тишина; двинули ручку на шесть градусов — attach и плавный подъезд. В мониторе те же события словами. На настоящих часах я добавил к этой схеме одну строку телеметрии раз в минуту — печать угла и состояния; по ней за вечер видно, сколько циклов attach/detach набегает. Слишком частые переключения — сигнал, что порог выбран слишком близко к шуму источника цели.
Порог пробуждения — единственное число, которое тут реально настраивается под проект. Для ручки потенциометра хватает пяти градусов: ручка шумит на один-два, и чуткий порог будил бы серво каждую секунду — тот же принцип гистерезиса, что в уроке про гистерезис потенциометра. Для цели из расписания, где значения приходят чистыми, хватит двух; для стрелки, на которую дует из окна, порог вообще противопоказан — такую серво лучше не отпускать вовсе, и автомат должен это знать. Я держу порог константой рядом с комментарием, почему именно столько: через полгода без записи никто, включая меня, не вспомнит.
Обратите внимание на счётчик простоя: любое движение обнуляет tPokoj, и пять секунд начинаются заново с последнего приезда, а не с первого. Дрожащая цель — скажем, ручка, которую кто-то вертит туда-сюда, — держит серво attached бесконечно, и это честно: работа есть — платим током движущегося режима. Провал в этой схеме один: цель, которая ходит вокруг порога по шуму, будет будить серво каждые пять секунд; лечится тем же гистерезисом — пока разница меньше порога, считаем покоем.
Стратегии для дежурных режимов
Разложу мои типовые дежурные сценарии по полочкам. Часы и указатели: attached всегда, ток удержания — статья расходов проекта, блок питания считается с запасом, серво ставлю подальше от глаз пользователя, нагрев 45 °C никого не пугает. Пан-тилт камера: detach между наведениями — камера весит мало, а уравновешенный рог делает своё дело. Заслонки и шторки с пружиной или ветром: attached всегда, иначе утром найдёте шторку в другом конце штанги; экономия ищется в механике, а не в скетче.
И практическая деталь напоследок: если после detach серво обязана иногда держать позицию, я ставлю механический фиксатор — трещотку, магнитный стопор, банальный упор, в который рог ложится и стоит без тока. Тогда автомат отпускает серво с чистой совестью: позицию держит железо за ноль миллиампер, а скетч подключает мотор только чтобы переехать на новый угол. Самое дешёвое удержание — то, которое не требует мотора вообще.
Для автономных проектов арифметика удержания превращается в бюджет батареи. MG996R, который круглосуточно attached на удержании, — это до пяти ватт-часов в сутки: за месяц набегает 140-150 Ач от пятивольтовой шины, и никакой повербанк такого не простит. SG90 в той же роли скромнее вчетверо-впятеро, но принцип тот же: если проект живёт от аккумулятора, серво либо отпускают в простое, либо меняют механику так, чтобы удержание было бесплатным. Питание от сети — единственный сценарий, где attached круглые сутки мне не жалко.
- 1. Сколько ест MG996R, удерживая позицию без движения?
- 2. Сколько примерно ест SG90, которая attached и стоит?
- 3. Когда detach безопасен?
- 4. Почему возврат после detach выглядит рывком?
- 5. Почему порог пробуждения 5°, а не 1°?
- Attached серво ест всегда: SG90 — десятки мА в покое, MG996R — до 200 мА на удержании
- Плавный ход по миллис — импульсы не прекращаются: 40-45 °C после суток норма, 60 °C — стоп
- detach обнуляет ток, но отдаёт позицию внешней силе: сначала баланс и противовес, потом отпускание
- Автомат «простой — отпусти»: 5 с покоя — detach, цель уехала на 5° — attach и плавный ход
- Порог пробуждения настраивается под шум источника и записывается в комментарий с объяснением
Частые вопросы по теме урока
- Сколько ест MG996R, удерживая позицию без движения?
- Цифровая серво агрессивно следит за углом и в покое: до 200 мА по шине 5 В. «Бесплатного» удержания у MG996R не бывает. До 200 мА — контур постоянно поправляет микросдвиги
- Сколько примерно ест SG90, которая attached и стоит?
- 650 мА — это стопор, а не покой. Стоящая attached SG90 ест единицы-десятки мА, и среднее растёт с каждым микросдвигом, который контур исправляет. Единицы-десятки мА, с микрокоррекциями больше
- Когда detach безопасен?
- Detach безопасен, когда рог нечему уводить: нагрузку держит механика. Иначе позиция уплывёт, а возврат станет рывком. Если позицию держит механика: баланс, трение, упор
- Почему возврат после detach выглядит рывком?
- За время простоя позиция уехала: серво видит разницу в десяток градусов и отрабатывает её с максимальной скоростью. Отсюда щелчок и вздрагивание. Рог свободно уводило под нагрузкой, и write гонит его обратно на полном моменте
- Почему порог пробуждения 5°, а не 1°?
- Порог должен стоять выше шума источника цели: ручка шумит на один-два градуса, и чуткий порог превратил бы паузу в вечный attach/detach. Шум ручки в один-два градуса будил бы серво постоянно