Подставка для фоторамки была моим первым серьёзным проектом с серво: рамка на рычаге SG90 поворачивалась к зрителю по нажатию кнопки. Всё работало, но с одной странностью — стоило мне слегка нажать на рамку, как коробочка начинала гудеть и упорно выталкивала палец обратно. А через несколько секунд после установки угла серво мелко подрагивала, будто не могла решить, приехала она или нет. Я два дня был уверен, что мне попался брак, и уже откладывал деньги на вторую. Потом вскрыл корпус тонким лезвием — и увидел внутри обычный моторчик, горстку шестерён и плату размером с ноготь.
В этом уроке мы вскроем серво так же, но без порезов: пройдёмся по всем четырём деталям внутри корпуса, проследим путь команды от импульса до поворота вала и наконец поймём, почему серво гудит под нагрузкой, дрожит в покое и умирает при заклинивании. Заодно выучим примету, по которой за секунду отличаем обычную серво от серво непрерывного вращения, — такие часто продают в тех же наборах под видом «360 градусов».
Что нашлось под крышкой
Внутри SG90 четыре действующих лица. Первый — маленький моторчик постоянного тока, самый дешёвый из существующих: сам по себе он крутится быстро, слабо и абсолютно глупо, без всякого представления об углах. Второй — редуктор: две-три ступени пластиковых шестерён, которые превращают тысячи оборотов мотора в медленный и сильный ход выходного вала. Именно редуктор виноват в том, что серво весит девять граммов, а тянет с моментом около 1,8 кг·см — впрочем, именно из-за пластиковых зубьев он первым и страдает, когда серво заклинивает.
Третий герой — потенциометр, почти тот же, что мы крутили в уроке про потенциометр и dimmer, только крошечный и с осью, механически связанной с выходным валом через шестерню. Вал повернулся — движок потенциометра проехал по резистивной дорожке — сопротивление изменилось. Это единственный датчик во всей конструкции, глаза серво. Четвёртое действующее лицо — плата управления с одним-единственным чипом, которая читает потенциометр, слушает сигнальный провод и решает, в какую сторону и с каким усилием гнать мотор. Мотор к плате подключён через два транзисторных ключа в форме буквы H — тот же принцип, что у драйверов моторов, только уменьшенный до размеров песчинки.
Когда я понял, что потенциометр — это буквально та же деталь, что висела у меня на макетке с ценником в двадцать рублей, магия серво кончилась. Оставалась одна загадка: как из этого набора получается точное позиционирование. Ответ — в способе соединения этих деталей, он разбирается ниже.
| Деталь | Её работа | Что будет при отказе |
|---|---|---|
| Моторчик | создаёт усилие через редуктор | вал не движется, команда уходит впустую |
| Редуктор | понижает обороты, повышает момент | облизанные зубья: люфт, хруст, угол плывёт |
| Потенциометр | сообщает плате фактический угол | серво уезжает в упор и бьётся об него |
| Плата управления | сравнивает цель и факт, рулит мотором | серво молчит и не реагирует ни на что |
| Выходной вал | несёт качалку и вашу механику | сорванные шлицы — качалка проворачивается |
Теперь соберём контур. Каждые 20 миллисекунд по сигнальному проводу приходит импульс длиной 1000–2000 мкс — команда «желаемый угол», мы разбирали её формат в уроке про подключение SG90. Плата читает потенциометр и получает второе число — фактический угол. Дальше происходит главное: плата считает ошибку, разницу между желаемым и фактическим. Ошибка положительная — мотор крутит в одну сторону, отрицательная — в другую, ноль — мотор отпускают. Это замкнутый контур управления, тот же принцип, по которому вы паркуетесь в гараж: смотрите на зазор, поправляете руль, снова смотрите.
Управление пропорциональное: чем больше ошибка, тем сильнее жмёт мотор. Подъехав к цели почти вплотную, серво сбрасывает обороты и мягко доезжает остаток. А вот полная остановка наступает не при нуле ошибки, а когда ошибка падает ниже мёртвой зоны — для SG90 это единицы микросекунд ширины импульса, в пересчёте на угол примерно один-два градуса. Пока вал болтается внутри этой зоны, плата считает, что всё в порядке, и мотор стоит. Мёртвая зона — не брак, а способ не сжечь мотор бесконечной дрожью вокруг цели: без неё серво гоняла бы мотор туда-сюда до полного разогрева.
У контура есть ещё один слой, о котором редко говорят: темп. Импульсы приходят каждые 20 миллисекунд — это темп, с которым внешний мир заказывает цели. Внутренний цикл платы живёт на порядок быстрее: потенциометр опрашивается и мотор правится тысячи раз в секунду, иначе серво не успевала бы тормозить перед целью и влетала бы в неё носом. Если развести эти два темпа в голове, многое встаёт на места: широкий заказ идёт редкими посылками, а тонкая доводка — непрерывной вознёй внутри корпуса. Отсюда и полезное наблюдение из практики: кратковременные пропадания сигнала серво почти не замечает — между импульсами она и так живёт самостоятельно, держа последний приказ.
Дрожание, срывы и непрерывное вращение
Вернёмся к фоторамке, на которой я спалил два дня. Серво дёргалась не браком, а честной работой контура против механического люфта: рамка была тяжёлой, её вес через качалку отжимал вал, ошибка выходила из мёртвой зоны, серво возвращала рамку — вес снова отжимал, цикл повторялся. Платформа подрагивала раз в несколько секунд с фиксированным интервалом, что и выглядело как поломка. Диагноз был механический: я сместил центр тяжести рамки ближе к оси вала и подтянул люфтящую качалку — дрожь исчезла без единой строчки кода. Мораль: когда серво ведёт себя странно, сначала смотрят на механику и питание, и только потом на скетч. Питанию в этом деле посвящён отдельный урок про провода и макетку.
Вторая ловушка — серво непрерывного вращения, которое часто лежит в том же лотке и отличается только надписью 360 на упаковке. Внутри у него механическая обманка: потенциометр либо отсоединён от вала и закручен в среднее положение, либо заменён двумя постоянными резисторами. Контур сохраняют, но смысл команды меняется: плата вечно видит «середину», поэтому write(90) означает «стоп», write(60) — «крутись влево с небольшой скоростью», write(180) — «максимальная скорость вправо». Ни о каких углах речи: серво превращается в мотор-редуктор с регулировкой скорости. Точную позицию без датчика оно потеряло навсегда — если проекту нужен полный оборот с точным шагом, честнее взять шаговый двигатель, как в уроке про 28BYJ-48.
Кстати, если серво дрожит в покое без всякой нагрузки — виновата чаще всего шумящая сигнальная линия или импульсы, которых нет: детали проверки сигнала есть в уроке про ШИМ и analogWrite, серво, в отличие от светодиода, на средний уровень ШИМ отвечает нервным гулом, а не плавным свечением.
#include <Servo.h> Servo sv; void setup() { sv.attach(9); Serial.begin(9600); Serial.println("Тест: обычная серво на 90 стоит и молчит");} void loop() { Serial.println("Цель 90: обычная стоит, 360-градусная ждёт"); sv.write(90); delay(3000); Serial.println("Цель 60: обычная встала на 60, 360-градусная едет"); sv.write(60); delay(3000);}Опыты для закрепления, всё выполняется прямо в симуляторе выше. Первое: добавьте в прогон четвёртую цель 135 градусов — массив расширяется, цикл меняет границу, остальное работает само. Второе: поставьте две команды write подряд с паузой 50 мс между ними и убедитесь, что серво не телепортируется, а честно доезжает вторую цель из положения первой. Третье: выведите в Serial sv.read() после каждого write и сверьте с заказанным — возвращается всегда цель, даже когда вал ещё в пути, потому что read() читает заказ, а не механику.
На живой плате добавится четвёртый опыт: прижмите рычаг пальцем на две секунды и почувствуйте, как корпус согревается — ток в этой ситуации подскакивает до 650–700 мА, и держать так серво минутами не стоит. За точными замерами длительности реальных импульсов, если захочется убедиться, что всё написанное здесь правда, отправляю к микросекундным замерам: там micros() покажет ширину импульса во всей красе.
Пятый опыт для живой платы, если она под рукой: подайте питание, не отправляя ни одной команды, и послушайте. Исправная серво в покое молчит; тихий неравномерный гул без сигнала чаще всего означает, что плата серво видит мусор на сигнальной линии. Это не проблема скетча — это повод проверить контакт оранжевого провода в разъёме. Такие мелочи превращают анатомию из этого урока в рабочий инструмент диагностики, а не в набор интересных фактов: вы знаете, кто внутри за что отвечает, и по звуку угадываете виновника.
- Внутри серво четыре детали: мотор, пластиковый редуктор, потенциометр на выходном валу и плата управления
- Сердце серво — замкнутый контур: ошибка между целью и фактом гонит мотор, ноль ошибки — покой
- Мёртвая зона SG90 — около одного-двух градусов: внутри неё серво не двигается, это защита от дрожи
- Гул под нагрузкой — норма, треск шестерён и запах — сигнал остановиться
- Серво непрерывного вращения: write(90) — стоп, отклонение от 90 — скорость; углов она не знает
- Странности серво начинайте диагностировать с механики и питания, код — третий в очереди
- 1. Какая деталь внутри серво сообщает плате фактический угол вала?
- 2. Серво гудит, пока вы давите на рычаг. Что происходит?
- 3. Что означает write(60) для серво непрерывного вращения?
- 4. Серво бьётся валом об крайнее положение и гудит после write(0). Самая вероятная причина?
- 5. С чего разумнее начать, когда серво подрагивает под нагрузкой раз в несколько секунд?
Частые вопросы по теме урока
- Какая деталь внутри серво сообщает плате фактический угол вала?
- Движок потенциометра механически связан с выходным валом: повернулся вал — изменилось сопротивление, плата прочитала угол. Потенциометр, связанный с валом
- Серво гудит, пока вы давите на рычаг. Что происходит?
- Палец увёл вал из мёртвой зоны, ошибка вышла за порог, и контур гонит мотор на возврат. Гул — нормальная работа контура. Контур управления борется с отклонением вала от цели
- Что означает write(60) для серво непрерывного вращения?
- У 360-градусных серво потенциометр — обманка: отклонение от 90 задаёт скорость и направление вращения, а не угол. Крутиться в одну сторону с небольшой скоростью
- Серво бьётся валом об крайнее положение и гудит после write(0). Самая вероятная причина?
- Без обратной связи от потенциометра контур считает, что цель не достигнута, и давит мотором в упор. Классический диагноз после падения серво. Потенциометр отошёл от вала — плата не видит фактический угол
- С чего разумнее начать, когда серво подрагивает под нагрузкой раз в несколько секунд?
- Подрагивание под нагрузкой почти всегда механическое: люфт, тяжёлое плечо, большой момент. Код здесь ни при чём. Проверить механику: люфт качалки, центр тяжести, плечо нагрузки