Сервопривод SG90

SG90 — миниатюрный аналоговый серводвигатель (micro servo), один из самых распространённых исполнительных механизмов в любительской робототехнике. Изначально выпускался компанией TowerPro, сейчас производится множеством фабрик под тем же названием и почти идентичными характеристиками. В отличие от обычного DC-мотора, серводвигатель удерживает заданный угол поворота вала и не требует от микроконтроллера постоянного управления — достаточно один раз задать нужное положение импульсом ШИМ.

Серводвигатель SG90 (TowerPro Micro Servo 9g) с качалкой и трёхпроводным шлейфом

Основные характеристики 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 мм.

Габаритный чертёж серводвигателя SG90: корпус 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 мкс определяет минимальное изменение ширины импульса, которое серво ещё способно отличить — более мелкие изменения не вызывают движения.

Сигнал управления серводвигателем SG90: период 20 мс (частота 50 Гц), ширина импульса от 1 до 2 мс, уровень 4,8 В

На рисунке из даташита показан управляющий сигнал: период 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 В)
Оранжевый / жёлтыйУправляющий сигнал (ШИМ)
Назначение проводов SG90: оранжевый - сигнал ШИМ, красный - питание плюс, коричневый - земля

Цвета проводов у разных производителей немного отличаются, поэтому смотрите на расположение разъёма: как правило, средний провод это плюс питания, а сигнальный провод светлее остальных.

Подключение к Arduino

Arduino UnoSG90
5VVCC (красный)
GNDGND (коричневый/чёрный)
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-мотор;
  • Если вал упёрся в ограничитель или механизм заклинило, серводвигатель продолжает давить на нагрузку, потребляет повышенный ток и быстро перегревается — подобное состояние долго держать нельзя.

Материалы и Datasheet

Оставьте комментарий

Отправляя комментарий, вы соглашаетесь с обработкой ваших данных (имя, адрес электронной почты, текст комментария) в соответствии с политикой конфиденциальности.