SG90 — миниатюрный аналоговый серводвигатель (micro servo), один из самых распространённых исполнительных механизмов в любительской робототехнике. Изначально выпускался компанией TowerPro, сейчас производится множеством фабрик под тем же названием и почти идентичными характеристиками. В отличие от обычного DC-мотора, серводвигатель удерживает заданный угол поворота вала и не требует от микроконтроллера постоянного управления — достаточно один раз задать нужное положение импульсом ШИМ.
Основные характеристики SG90
- Тип: аналоговый серводвигатель с пластиковыми шестернями
- Рабочее напряжение: 4,8 В (около 5 В) по даташиту; на практике 4,8 — 6 В, встречаются модули, допускающие 3 — 7,2 В
- Угол поворота: около 180° (по 90° в каждую сторону от центра)
- Момент удержания (stall torque): 1,8 кгс·см при 4,8 В
- Скорость поворота: 0,1 с на 60° при 4,8 В
- Управляющий сигнал: ШИМ, период 20 мс; номинальная ширина импульса 1000 — 2000 мкс, у большинства экземпляров рабочий диапазон шире — 500 — 2400 мкс
- Зона нечувствительности (dead band): 10 мкс
- Вес: 9 г
- Размеры: 22,2 × 11,8 × 31 мм
- Рабочая температура: 0…+55 °C
Габаритный чертёж из даташита (размеры в миллиметрах): корпус 22,2 × 11,8 мм, вместе с ушками крепления 32,2 мм, высота с качалкой 31 мм.
Примечание: значения выше взяты из даташита (копия на Components101, спецификация TowerPro). Серводвигатели других производителей под названием SG90 заметно различаются: у клонов момент удержания бывает от 1,2 до 1,8 кгс·см, скорость — от 0,09 до 0,12 с на 60°, размеры корпуса отличаются на 1 — 2 мм. Перед покупкой для проекта, где важен запас по моменту, лучше ориентироваться на характеристики конкретного продавца.
Принцип работы
Внутри корпуса серводвигателя находятся небольшой DC-мотор, понижающий редуктор из пластиковых шестерней, потенциометр обратной связи, механически связанный с выходным валом, и небольшая управляющая платка. Контроллер на платке сравнивает текущее положение вала (считанное с потенциометра) с положением, заданным шириной входящего ШИМ-импульса, и подаёт питание на мотор в нужном направлении до тех пор, пока оба значения не совпадут — это замкнутая система управления с обратной связью по положению, а не просто открытый цикл управления скоростью, как у обычного DC-мотора.
Угол поворота задаётся длительностью управляющего импульса: импульс около 1500 мкс соответствует среднему положению (90°, центр), около 1000 мкс — одному крайнему положению (0°), около 2000 мкс — другому крайнему (180°). В даташите те же три положения записаны как −90°, 0° и +90° относительно центра. Период повторения импульсов — 20 мс (частота 50 Гц), что соответствует стандарту, унаследованному от RC-моделизма. «Мёртвая зона» (dead band) в 10 мкс определяет минимальное изменение ширины импульса, которое серво ещё способно отличить — более мелкие изменения не вызывают движения.
На рисунке из даташита показан управляющий сигнал: период 20 мс (50 Гц), ширина импульса 1 — 2 мс, уровень сигнала 4,8 В (около 5 В).
Библиотека Arduino Servo.h по умолчанию использует диапазон 544 — 2400 мкс, поэтому крайние положения write(0) и write(180) получаются чуть дальше номинальных 1000 и 2000 мкс. Если вал упирается в ограничитель и серво гудит, диапазон можно сузить: myServo.attach(9, 600, 2300).
Распиновка
| Цвет провода | Назначение |
|---|---|
| Коричневый / чёрный | GND |
| Красный | VCC (4,8 — 6 В) |
| Оранжевый / жёлтый | Управляющий сигнал (ШИМ) |
Цвета проводов у разных производителей немного отличаются, поэтому смотрите на расположение разъёма: как правило, средний провод это плюс питания, а сигнальный провод светлее остальных.
Подключение к Arduino
| Arduino Uno | SG90 |
|---|---|
| 5V | VCC (красный) |
| GND | GND (коричневый/чёрный) |
| 9 (любой цифровой пин) | Сигнал (оранжевый/жёлтый) |
Важно о питании: пусковой ток серводвигателя при старте движения может кратковременно достигать нескольких сотен миллиампер, а при одновременной работе нескольких серво суммарный ток легко превышает возможности стабилизатора 5 В на плате Arduino. Один серводвигатель обычно можно питать прямо от Arduino, но для двух и более серво рекомендуется отдельный источник питания 5 В с общим проводом GND с Arduino. Электролитический конденсатор 100 — 470 мкФ, подключённый параллельно выводам питания серво, сглаживает просадки напряжения в момент старта и уменьшает дрожание вала и самопроизвольные перезагрузки платы.
Библиотеки
Arduino: встроенная библиотека Servo.h — входит в состав Arduino IDE, не требует отдельной установки, предоставляет простой метод write(угол) для задания положения от 0 до 180°. На платах Arduino Uno, Nano и других, кроме Mega, библиотека занимает таймер 1, поэтому, пока она подключена, analogWrite() не работает на выводах 9 и 10 — даже если на них нет серводвигателя.
ESP32: встроенная Servo.h рассчитана на архитектуру AVR и не работает на ESP32 — используется библиотека ESP32Servo, учитывающая особенности аппаратного ШИМ (LEDC) на этой платформе.
Raspberry Pi / Python: класс gpiozero.Servo (или более точный по таймингам pigpio) позволяет управлять серводвигателем программным ШИМ через обычный GPIO, без необходимости аппаратного PWM-контроллера. Для нескольких серво удобнее внешний 16-канальный ШИМ-контроллер PCA9685 по I²C: пример управления SG90 с его помощью на Python есть в статье «Управление сервоприводом SG90 с помощью PCA9685 из Python на Raspberry Pi/Orange Pi/Banana Pi».
Примеры скетчей
Пример 1: плавное качание вала
Серводвигатель подключают к выводу 9, а управляет им встроенная библиотека Servo.h. В отличие от простейшего варианта, в скетче есть именованные константы вместо «магических» чисел, а в крайних положениях сделаны паузы, чтобы вал успевал дойти до упора. Сразу после attach() вал встаёт в среднее положение: библиотека начинает выдавать импульс 1500 мкс.
#include <Servo.h>
/*
SG90: плавное качание вала от 0 до 180 градусов и обратно.
Подключение: красный провод -> 5V, коричневый (чёрный) -> GND,
оранжевый (жёлтый) -> вывод 9.
*/
const uint8_t SERVO_PIN = 9;
const uint8_t MIN_ANGLE = 0;
const uint8_t MAX_ANGLE = 180;
// Пауза после каждого шага в 1 градус. SG90 поворачивается на 60° примерно
// за 0,1 с, то есть на 1° за 2 мс, а 15 мс дают запас и плавное движение.
const uint8_t STEP_DELAY_MS = 15;
// Пауза в крайних положениях
const uint16_t END_DELAY_MS = 500;
Servo myServo;
void setup() {
// Сразу после attach() библиотека выдаёт импульс 1500 мкс, и вал встаёт
// в среднее положение. Диапазон импульсов по умолчанию 544-2400 мкс.
// Если в крайних положениях вал упирается в ограничитель и серво гудит,
// сузьте его, например: myServo.attach(SERVO_PIN, 600, 2300);
myServo.attach(SERVO_PIN);
delay(1000);
}
void loop() {
// От 0 до 180 градусов
for (int angle = MIN_ANGLE; angle <= MAX_ANGLE; angle++) {
myServo.write(angle);
delay(STEP_DELAY_MS);
}
delay(END_DELAY_MS);
// И обратно от 180 до 0 градусов
for (int angle = MAX_ANGLE; angle >= MIN_ANGLE; angle--) {
myServo.write(angle);
delay(STEP_DELAY_MS);
}
delay(END_DELAY_MS);
}
Результат
Вал серводвигателя плавно поворачивается от 0° до 180°, ненадолго замирает, затем возвращается обратно, и так по кругу. Задержка 15 мс на каждый градус даёт серво время дойти до заданного положения, поэтому поворот получается плавным; для более быстрого движения задержку уменьшают, для более медленного — увеличивают.
Пример 2: управление из Монитора порта
Этот скетч нужен, чтобы подобрать настоящие границы диапазона у вашего экземпляра. В Мониторе порта (скорость 115200 бод, окончание строки «Новая строка») вводят число и нажимают Enter: от 0 до 180 — это угол в градусах, от 500 до 2500 — ширина импульса в микросекундах. Начните с 1500 (середина) и двигайтесь к краям шагами по 50-100 мкс. Как только вал упрётся в ограничитель и серво загудит, вернитесь на один шаг назад: найденные значения можно передать в attach(пин, минимум, максимум).
#include <Servo.h>
/*
SG90: управление из Монитора порта.
Введите число и нажмите Enter:
от 0 до 180 - угол в градусах;
от 500 до 2500 - ширина импульса в микросекундах.
Микросекунды удобны, чтобы найти настоящие крайние положения своего
серво: начните с 1500 (середина) и меняйте значение по 50-100. Как только
вал упрётся в ограничитель и начнёт гудеть, вернитесь на шаг назад.
Монитор порта: скорость 115200 бод, окончание строки "Новая строка".
*/
const uint8_t SERVO_PIN = 9;
const int MIN_PULSE_US = 500;
const int MAX_PULSE_US = 2500;
Servo myServo;
void setup() {
Serial.begin(115200);
// Расширяем допустимый диапазон импульсов, чтобы библиотека не обрезала
// значения от 500 до 544 мкс и от 2400 до 2500 мкс
myServo.attach(SERVO_PIN, MIN_PULSE_US, MAX_PULSE_US);
Serial.println(F("Введите угол 0-180 или импульс 500-2500 мкс"));
}
void loop() {
if (Serial.available() == 0) {
return;
}
// Читаем строку до символа конца строки в небольшой буфер
char line[8];
uint8_t length = Serial.readBytesUntil('\n', line, sizeof(line) - 1);
line[length] = '\0';
if (length == 0) {
return;
}
long value = atol(line);
if (value >= 0 && value <= 180) {
myServo.write((int)value);
Serial.print(F("Угол: "));
Serial.print(value);
Serial.println(F("°"));
} else if (value >= MIN_PULSE_US && value <= MAX_PULSE_US) {
myServo.writeMicroseconds((int)value);
Serial.print(F("Импульс: "));
Serial.print(value);
Serial.println(F(" мкс"));
} else {
Serial.println(F("Ошибка: нужно число 0-180 или 500-2500"));
}
}
Не оставляйте вал в упоре дольше пары секунд: серво давит на ограничитель, потребляет повышенный ток и греется.
Применение
- Роборуки и манипуляторы с несколькими степенями свободы;
- Поворотные платформы для камер (пан-тилт механизмы);
- Рулевое управление в радиоуправляемых моделях и роботах-машинках;
- Автоматические дверцы, заслонки, дозаторы корма для животных;
- Учебные и демонстрационные проекты по основам робототехники.
SG90 и похожие серводвигатели
Электрически и программно полностью совместимы с SG90 следующие модели, отличающиеся конструктивным исполнением:
| Модель | Отличие от SG90 |
|---|---|
| MG90S | Металлические шестерни редуктора вместо пластиковых — выше износостойкость и момент, тот же корпус и сигнал |
| SG90 continuous rotation | Модифицированная версия без ограничения угла — вращается непрерывно, сигнал задаёт не угол, а скорость/направление (аналогично DC-мотору) |
| MG996R | Серводвигатель стандартного размера с заметно большим моментом (~9-11 кгс·см), для более тяжёлых нагрузок |
Ограничения
- Небольшой момент (1,8 кгс·см, у некоторых клонов — 1,2) ограничивает полезную нагрузку — для более тяжёлых механизмов нужны серводвигатели стандартного размера;
- Пластиковый редуктор изнашивается быстрее металлического при частой/тяжёлой нагрузке;
- Серводвигатель не сообщает микроконтроллеру свою текущую позицию — обратная связь замкнута только внутри самого серво, внешнему контроллеру положение неизвестно без дополнительных датчиков;
- У дешёвых клонов часто встречается заметный люфт и дрожание (jitter) в районе центрального положения из-за недорогого потенциометра обратной связи;
- Угол поворота ограничен ~180° — для непрерывного вращения нужна отдельная модификация (continuous rotation) или шаговый/DC-мотор;
- Если вал упёрся в ограничитель или механизм заклинило, серводвигатель продолжает давить на нагрузку, потребляет повышенный ток и быстро перегревается — подобное состояние долго держать нельзя.







