Компоненты · 13 мин чтения

Сервопривод MG996R и Arduino: момент, ток, питание и код

Как пользоваться сервоприводом MG996R: момент 11 кг·см и ток 2,5 A при заторможенном валу, внешнее питание 5–6 V, конденсатор, диапазон 500–2500 µs, борьба с дрожанием, PCA9685 и SG90.

Сервопривод MG996R — стандартный выбор для тяжёлой работы в проектах на Arduino: у него металлические шестерни и момент до 11 кг·см при 6 V. При массе 55 г он поднимает плечо робота-манипулятора, открывает тяжёлую крышку или поворачивает крепление камеры pan-tilt. Но за такую силу приходится платить: под нагрузкой MG996R потребляет до 2,5 A. Поэтому, в отличие от SG90, его нельзя просто подключить к пину 5V на Arduino: нужны внешний источник 5–6 V, общая земля (GND) и конденсатор рядом с сервоприводом. Если пренебречь этими правилами, сервопривод дрожит, Arduino постоянно перезагружается, а компьютер может даже отключить USB-порт.

В этом руководстве разберём на реальных цифрах момент и ток MG996R, выбор источника питания, работу с диапазоном 500–2500 µs в библиотеке Servo, чтобы найти пределы именно твоего сервопривода, а также защиту от дрожания и перезагрузок. Затем перейдём к коду для ESP32 и Raspberry Pi Pico, модулю PCA9685, который управляет 16 сервоприводами по двум проводам, выбору сервоприводов для робота-манипулятора и сравнению с SG90 и MG90S.

Сервопривод MG996R с металлическими шестернями
MG996R: корпус 40,7 × 19,7 × 42,9 мм, металлические шестерни, два шарикоподшипника и выходной вал на 25 зубьев. Коричневый провод — GND, красный — плюс, оранжевый — сигнал.

Что такое сервопривод MG996R и как он работает?

MG996R — улучшенная версия старой модели MG995 от TowerPro: благодаря переработанной плате управления и шестерням он надёжнее встаёт в центр и имеет меньший люфт. Внутри корпуса находятся небольшой DC-мотор, металлический редуктор, который замедляет мотор и увеличивает момент, потенциометр, измеряющий угол выходного вала, и плата управления, которая всем этим руководит. Плата считывает ширину импульса, приходящего по сигнальному проводу каждые 20 мс (50 Hz), сравнивает заданный угол с углом, который показывает потенциометр, и вращает мотор, пока разница не исчезнет. Импульс около 1500 µs соответствует среднему положению; более короткие импульсы поворачивают вал в одну сторону, более длинные — в другую. Мёртвая зона 5 µs в даташите означает, что сервопривод не реагирует на изменения меньше этой величины. Как вообще устроены сервоприводы, мы подробно рассказали в статье Что такое сервопривод?.

ХарактеристикаЗначение
Рабочее напряжение4,8–7,2 V (на практике 5–6 V)
Момент при заторможенном валу9,4 кг·см (4,8 V), 11 кг·см (6 V) ≈ 0,92–1,08 Н·м
Скорость (на 60°)0,17 с (4,8 V), 0,14 с (6 V)
Ток покояОколо 10 mA (без нагрузки, вал неподвижен)
Рабочий ток500–900 mA (6 V, при движении)
Ток при заторможенном валу2,5 A (6 V)
Мёртвая зона5 µs
Угол поворотаОколо 120° при 1000–2000 µs, близко к 180° при 500–2500 µs (зависит от экземпляра)
Сигнал50 Hz (период 20 мс), положение задаётся шириной импульса
Шестерни и подшипникиМеталлические шестерни, два шарикоподшипника
Выходной вал25 зубьев (шлицы 25T)
Масса и размеры55 г, 40,7 × 19,7 × 42,9 мм
КабельОколо 30 см; коричневый — GND, красный — плюс, оранжевый — сигнал
Рабочая температура0–55 °C

Что такое момент? Как правильно читать значение в кг·см

Момент (крутящий момент) — это способность сервопривода поворачивать груз на определённом расстоянии от вала; он измеряется как сила × расстояние. 11 кг·см означает, что сервопривод удержит 11 кг в 1 см от вала или 1,1 кг в 10 см; при удвоении расстояния допустимый груз уменьшается вдвое. Чтобы перевести значение в ньютон-метры, умножь его на 0,098: 11 кг·см ≈ 1,08 Н·м. Ключевая деталь: в даташите указан момент при заторможенном валу, то есть предел, при котором вал останавливается, ток достигает пика, а сервопривод нагревается. При длительной работе нагрузка не больше половины этого значения не даёт сервоприводу перегреваться, уменьшает дрожание и продлевает жизнь шестерням.

Длина плеча (от вала до груза)Предел при заторможенном валу (6 V)Безопасная длительная нагрузка (50%)
2,5 см (конец качалки)4,4 кг2,2 кг
5 см2,2 кг1,1 кг
10 см1,1 кг550 г
15 смОколо 730 гОколо 365 г
20 см550 г275 г

Таблица учитывает только груз на конце плеча. В реальном механизме к моменту добавляются масса самого плеча, других сервоприводов, установленных на нём, и захвата: массу каждой детали нужно умножить на её расстояние от вала и всё сложить. Например, если на конце плеча длиной 15 см находятся захват массой 150 г и предмет массой 100 г, только они вдвоём дают 0,25 × 15 = 3,75 кг·см, а вместе с массой самого плеча сумма может дойти до 5 кг·см. Это чуть меньше половины момента MG996R при заторможенном валу на 6 V, так что выбор правильный. Расчёт момента по деталям с примером есть в руководстве Робот-манипулятор на Arduino.

Ток: почему MG996R нельзя питать от пина 5V на Arduino?

В покое без нагрузки MG996R потребляет всего около 10 mA (если он удерживает груз, ток растёт вместе с нагрузкой), но при движении ток поднимается до 0,5–0,9 A, а под нагрузкой на валу и в первые миллисекунды каждого старта приближается к 2,5 A. Когда Arduino Uno питается от USB, общий ток, который можно взять с пина 5V, ограничен предохранителем платы на 500 mA, и часть этого тока расходует сама плата. В момент старта сервопривода линия 5 V заметно проседает на несколько миллисекунд, процессор начинает работать нестабильно, и плата перезагружается. Компьютер тоже может на время отключить USB-порт, через который идёт слишком большой ток.

Провода — тоже часть проблемы. У тонких проводов-перемычек и контактов макетной платы сопротивление легко набирается до 0,2 Ω. Посчитай с помощью калькулятора закона Ома: при пиковом токе 2,5 A только в проводах теряется 2,5 × 0,2 = 0,5 V, поэтому от источника 5 V до сервопривода доходит 4,5 V, сервопривод слабеет и дрожит. К тому же контакты макетной платы рассчитаны примерно на 1 A. Подключай силовые провода MG996R не через макетную плату, а напрямую к винтовой клемме или к паяной распределительной шине и используй провод 20–22 AWG.

Количество сервоприводовПри движенииХудший случай (все заторможены)Рекомендуемый источник
1 MG996R0,5–0,9 A2,5 A5–6 V, не менее 3 A
2 сервопривода1–1,8 A5 A5–6 V, 5 A
4 сервопривода2–3,6 A10 A5–6 V, импульсный блок питания на 6–10 A
6 сервоприводов (робот-манипулятор)3–5,4 A15 A6 V, 10 A и код, который двигает сервоприводы по очереди
16 сервоприводов (PCA9685)8–14 A40 AНесколько отдельных линий 6 V или источник на 20 A и больше

Правильное питание: внешние 5–6 V, общая земля и конденсатор

  1. Выбери источник: возьми импульсный блок питания на 5 V или 6 V, который выдаёт ток из таблицы выше для нужного количества сервоприводов. Для переносных проектов хорошо подходят 4 NiMH-аккумулятора AA (4,8 V) или сборка 2S LiPo с понижающим стабилизатором (UBEC), настроенным на 6 V.
  2. Плюс — только на сервопривод: подключи плюс источника к красному проводу MG996R, а к пину 5V на Arduino его не подключай.
  3. Объедини земли: подключи минус источника и к коричневому проводу сервопривода, и к пину GND на Arduino. Сигнал — это напряжение, которое измеряется относительно GND, поэтому без общей земли сервопривод не понимает импульсы.
  4. Подключи сигнал: оранжевый провод — к пину D9 на Arduino Uno (GPIO 18 на ESP32, GP15 на Pico).
  5. Добавь конденсатор: поставь электролитический конденсатор 470–1000 µF / 16 V параллельно выводам питания сервопривода, как можно ближе к нему; вывод, отмеченный полосой на корпусе, идёт на минус. Если сервоприводов несколько, закладывай примерно 100 µF на каждый.
  6. Питай Arduino отдельно: запитай плату от USB или через гнездо питания (DC). Тогда просадки напряжения от сервопривода не доходят до процессора.
Не подключай сборку 2S LiPo (8,4 V при полном заряде) напрямую к MG996R: это превышает максимум 7,2 V и может сжечь плату управления. А батарейка-«крона» на 9 V вообще не способна выдать нужный ток. Электролитический конденсатор, подключённый наоборот, может нагреться и взорваться; его номинальное напряжение должно быть хотя бы вдвое выше напряжения линии (16 V для 6 V). Почему общая земля обязательна, мы объяснили в статье Что такое GND?, а как выбирать конденсаторы — в статье Что такое конденсатор?.
ПодключениеArduino UnoESP32Raspberry Pi Pico
Оранжевый провод (сигнал)D9GPIO 18GP15
Красный провод (плюс)Плюс внешнего источника 5–6 VПлюс внешнего источника 5–6 VПлюс внешнего источника 5–6 V
Коричневый провод (GND)Минус источника + GND ArduinoМинус источника + GND ESP32Минус источника + GND Pico
Конденсатор (470–1000 µF)Между плюсом и минусом сервоприводаМежду плюсом и минусом сервоприводаМежду плюсом и минусом сервопривода
Потенциометр (пример для ESP32)—Средний вывод — к GPIO 34, крайние — к 3V3 и GND—
Электролитические конденсаторы
Электролитический конденсатор отдаёт резкий ток, который нужен сервоприводу при старте, из собственного заряда, раньше, чем успевает отреагировать источник. Полоса на корпусе отмечает минусовой вывод; для MG996R хорошая отправная точка — 470–1000 µF / 16 V.
Если есть адаптер на 12 V, его выход можно понизить до 6 V с помощью модуля LM2596. Однако LM2596 выдаёт максимум 3 A и без радиатора греется уже примерно при 2 A, поэтому он подходит для одного MG996R, у которого ток при заторможенном валу (2,5 A) и так упирается в этот предел. Для большего числа сервоприводов выбирай преобразователь на 5 A и больше или сразу мощный блок питания на 5–6 V. В проектах с батарейным питанием время работы можно оценить с помощью калькулятора времени работы от батареи.

Библиотека Servo и диапазон 500–2500 µs

Библиотека Servo для Arduino устанавливается вместе с IDE. Когда в коде стоит servo.attach(9), библиотека по умолчанию использует диапазон 544–2400 µs и сопоставляет write(0) и write(180) этим двум границам; многие MG996R в таком диапазоне немного не доходят до 180 градусов. Чтобы расширить диапазон, напиши servo.attach(9, 500, 2500). Эта деталь важна, потому что writeMicroseconds() тоже не выходит за пределы, заданные в attach: если написать writeMicroseconds(2500), не указав пределы, библиотека молча урежет значение до 2400. Кроме того, write() воспринимает числа меньше 544 как угол, а большие — как микросекунды.

На Arduino Uno библиотека Servo поддерживает до 12 сервоприводов, а поскольку она использует Timer1, при подключённом сервоприводе analogWrite не работает на пинах 9 и 10. Механический предел у каждого MG996R тоже немного свой: по даташиту производителя со стандартными импульсами 1000–2000 µs угол поворота составляет около 120 градусов, а с расширенным диапазоном большинство экземпляров приближается к 180 градусам. Сервопривод, который толкают за предел, упирается во внутренний упор, потребляет ток заторможенного вала, гудит и нагревается. Поэтому первым делом найди безопасный диапазон импульсов своего сервопривода с помощью скетча ниже.

C++ (Arduino IDE)
1#include <Servo.h>
2
3const byte SERVO_PIN = 9;          // turuncu sinyal kablosu / orange signal wire
4Servo servo;
5int pulseUs = 1500;                // orta konum / center position
6
7void setup() {
8  Serial.begin(115200);
9  servo.writeMicroseconds(pulseUs);      // önce darbe, sonra attach / pulse first, then attach
10  servo.attach(SERVO_PIN, 500, 2500);    // aralığı genişlet / widen the range
11  Serial.println(F("500-2500 arasi bir deger yaz / type a value between 500 and 2500"));
12}
13
14void loop() {
15  if (Serial.available()) {
16    long value = Serial.parseInt();             // yazılan sayıyı oku / read the typed number
17    while (Serial.available()) Serial.read();   // satır sonunu temizle / clear the line ending
18    if (value >= 500 && value <= 2500) {
19      int step = (value > pulseUs) ? 10 : -10;  // 10 µs adımlarla yavaşça git / move slowly in 10 µs steps
20      while (abs(value - pulseUs) >= 10) {
21        pulseUs += step;
22        servo.writeMicroseconds(pulseUs);
23        delay(5);
24      }
25      pulseUs = value;
26      servo.writeMicroseconds(pulseUs);
27      Serial.print(F("Darbe / pulse: "));
28      Serial.print(pulseUs);
29      Serial.println(F(" us"));
30    }
31  }
32}
  1. Загрузи скетч, открой монитор порта на скорости 115200 бод и выбери конец строки New Line («Новая строка»).
  2. Введи 1500 — сервопривод встанет в среднее положение. Именно в этот момент надень качалку так, чтобы она смотрела в среднее положение механизма.
  3. Двигайся к нижнему пределу шагами по 50 µs, вводя значения вроде 1000, 800 и 700. Если сервопривод больше не поворачивается или начинает гудеть, вернись на 30–50 µs назад от последнего значения и запиши это число как MIN_US.
  4. Сделай то же самое для верхнего предела со значениями вроде 2000, 2200 и 2300 и найди MAX_US. Эти два числа понадобятся в следующих скетчах.

Плавное движение: код, который уменьшает броски тока и рывки

Одна команда вроде servo.write(160) бросает сервопривод к цели на полной скорости: при 6 V он проходит 60 градусов за 0,14 секунды. В это время мотор потребляет ток, близкий к току заторможенного вала, механизм дёргается, а удерживаемый предмет может упасть. Если разбить движение на маленькие шаги, уменьшатся и пики тока, и механические удары. Скетч ниже сдвигает сервопривод на 1 градус каждые 15 мс (около 67°/с), а поскольку он использует millis(), параллельно можно делать и другие дела.

C++ (Arduino IDE)
1#include <Servo.h>
2
3const byte SERVO_PIN = 9;
4const int MIN_US = 550;            // kalibrasyonda bulduğun alt sınır / lower limit from calibration
5const int MAX_US = 2450;           // kalibrasyonda bulduğun üst sınır / upper limit from calibration
6const byte STEP_MS = 15;           // derece başına süre: 15 ms ≈ 67°/sn / time per degree: 15 ms ≈ 67°/s
7
8const int POSES[] = {20, 160, 90, 45, 135};    // sırayla gidilecek açılar / angles to visit in order
9const byte POSE_COUNT = sizeof(POSES) / sizeof(POSES[0]);
10
11Servo servo;
12int current = 90;                  // şu anki açı / current angle
13int target = 90;                   // hedef açı / target angle
14byte poseIndex = 0;
15unsigned long lastStep = 0;
16unsigned long arrivedAt = 0;
17
18int angleToUs(int angle) {
19  return map(angle, 0, 180, MIN_US, MAX_US);   // açıyı darbeye çevir / angle to pulse width
20}
21
22void setup() {
23  servo.writeMicroseconds(angleToUs(current)); // önce konum, sonra attach / position first, then attach
24  servo.attach(SERVO_PIN, MIN_US, MAX_US);
25  arrivedAt = millis();
26}
27
28void loop() {
29  unsigned long now = millis();
30
31  // Hedefe 1 derecelik adımlarla yaklaş / approach the target in 1-degree steps
32  if (current != target && now - lastStep >= STEP_MS) {
33    lastStep = now;
34    current += (target > current) ? 1 : -1;
35    servo.writeMicroseconds(angleToUs(current));
36    if (current == target) arrivedAt = now;
37  }
38
39  // Hedefte 1 sn bekle, sonra sıradaki poza geç / wait 1 s at the target, then take the next pose
40  if (current == target && now - arrivedAt >= 1000) {
41    target = POSES[poseIndex];
42    poseIndex = (poseIndex + 1) % POSE_COUNT;
43  }
44
45  // Burada başka işler de yapılabilir / other tasks can run here too
46}

Функция angleToUs() переводит угол в диапазон между значениями MIN_US и MAX_US, найденными при калибровке, поэтому 0 и 180 градусов становятся реальными и безопасными крайними точками сервопривода. Без питания сервопривод не помнит своё положение и, получив первый импульс, сразу на полной скорости уходит в заданный угол. Если вызвать writeMicroseconds() до attach(), библиотека пропустит свой импульс 1500 µs по умолчанию и сразу отправит твой начальный угол; а если перед выключением возвращать механизм в ту же начальную позу, рывок при включении почти исчезнет. Скорость задаётся через STEP_MS: 30 мс дают медленное плавное движение, 5 мс — быстрое, но резкое. Чтобы управлять сервоприводом с помощью потенциометра, достаточно перевести показание в угол и записать его в переменную target.

Дрожание и перезагрузки Arduino: причины и решения

СимптомВероятная причинаРешение
Когда сервопривод начинает двигаться, Arduino перезагружается и USB-соединение пропадаетСервопривод питается от пина 5V на Arduino, и пусковой ток просаживает напряжениеВнешний источник 5–6 V, общая земля и конденсатор 470–1000 µF
Сервопривод дрожит или гудит в неподвижном состоянииСлабый источник, тонкие провода или нагрузка, близкая к моменту при заторможенном валуИспользуй толстые провода и конденсатор, укороти плечо или уменьши нагрузку
При управлении потенциометром постоянно подёргиваетсяШум в несколько единиц в аналоговом показанииДобавь сглаживающий фильтр и мёртвую зону в 2 градуса
Сервопривод двигается хаотично или вообще не реагируетНет соединения между GND внешнего источника и ArduinoПодключи минус источника к пину GND на Arduino
Гудит и греется в крайних положенияхДиапазон импульсов выходит за механический предел сервоприводаСузь MIN_US и MAX_US при калибровке
Подёргивается при работе с библиотеками NeoPixel, SoftwareSerial или ИКЭти библиотеки ненадолго отключают прерывания, и длительность импульса «плывёт»Перенеси сервопривод на PCA9685 или используй плату с аппаратным ШИМ
ESP32 выводит «Brownout detector was triggered» и перезагружаетсяСервопривод и ESP32 питаются от одного слабого источникаЗапитай сервопривод от отдельного источника и объедини земли
Щелчки и проскальзывание под нагрузкойСломан зуб шестерни или сорваны шлицы пластиковой качалкиЗамени комплект шестерён, используй металлическую качалку 25T и центральный винт
Момент намного ниже заявленногоНекачественная копия или низкое напряжение питанияПопробуй 6 V, покупай у надёжного продавца и оставляй запас 50%
Если сервоприводу не нужно удерживать груз, после выхода на цель можно отключить сигнал командой servo.detach(): сервопривод затихнет и почти перестанет потреблять ток. Но без сигнала пропадает и удерживающий момент, поэтому не используй detach в нагруженных суставах, например в плече робота-манипулятора. Все причины перезагрузок и диагностический скетч есть в статье Arduino постоянно перезагружается, а то же самое для ESP32 — в статье Ошибка brownout на ESP32.

Управление MG996R с ESP32

На ESP32 стандартная библиотека Servo для Arduino не работает: установи библиотеку ESP32Servo через «Менеджер библиотек». Пользоваться ею почти так же: период задаётся через setPeriodHertz(50), а пределы за рамками 500–2500 µs библиотека не принимает. Сигнальный выход ESP32 — 3,3 V, и подавляющее большинство MG996R воспринимает его без проблем; если твой сервопривод не реагирует или ведёт себя нестабильно, добавь на сигнальную линию преобразователь логических уровней. В примере ниже сервопривод поворачивается потенциометром, подключённым к GPIO 34. АЦП у ESP32 12-битный, поэтому показания лежат в диапазоне 0–4095 и немного шумят; именно поэтому в коде есть фильтрация и мёртвая зона.

C++ (Arduino IDE)
1#include <ESP32Servo.h>
2
3const int SERVO_PIN = 18;          // servo sinyali / servo signal
4const int POT_PIN = 34;            // pot orta bacağı (ADC1) / pot wiper (ADC1)
5const int MIN_US = 500;            // ESP32Servo bu aralığın dışına çıkmaz / ESP32Servo stays within 500–2500
6const int MAX_US = 2500;
7
8Servo servo;
9float smooth = 0;                  // süzülmüş pot değeri / filtered pot value
10int lastAngle = -1;
11
12void setup() {
13  Serial.begin(115200);
14  ESP32PWM::allocateTimer(0);              // servo için zamanlayıcı ayır / reserve a timer for the servo
15  servo.setPeriodHertz(50);                // 50 Hz = 20 ms periyot / 20 ms period
16  servo.attach(SERVO_PIN, MIN_US, MAX_US);
17  smooth = analogRead(POT_PIN);
18}
19
20void loop() {
21  smooth += (analogRead(POT_PIN) - smooth) * 0.1;   // ADC gürültüsünü süz / filter ADC noise
22  int angle = map((int)smooth, 0, 4095, 0, 180);    // 12 bit ADC: 0–4095
23  if (abs(angle - lastAngle) >= 2) {                // ölü bant: titremeyi keser / deadband stops jitter
24    servo.write(angle);
25    lastAngle = angle;
26    Serial.println(angle);
27  }
28  delay(20);
29}

MG996R с Raspberry Pi Pico (MicroPython)

На Raspberry Pi Pico дополнительная библиотека не нужна: настрой ШИМ на 50 Hz и задавай ширину импульса в наносекундах через duty_ns(); 500 µs — это 500 000 нс. Сигнал у Pico тоже 3,3 V. Не питай сервопривод от пина VBUS или VSYS на Pico: ток на этих пинах идёт от USB-порта компьютера, и пиковый ток MG996R перезагрузит Pico. Запитай сервопривод от внешнего источника и объедини земли. Код ниже плавно, градус за градусом, перемещает сервопривод между тремя положениями.

MicroPython
1from machine import Pin, PWM
2import time
3
4MIN_NS = 500000                   # 500 µs = 0 derece / 0 degrees
5MAX_NS = 2500000                  # 2500 µs = 180 derece / 180 degrees
6
7servo = PWM(Pin(15))              # turuncu kablo GP15'e / orange wire to GP15
8servo.freq(50)                    # 50 Hz servo sinyali / 50 Hz servo signal
9
10def write_angle(angle):
11    angle = max(0, min(180, angle))                           # 0–180 ile sınırla / clamp to 0–180
12    servo.duty_ns(MIN_NS + (MAX_NS - MIN_NS) * angle // 180)  # açıyı darbeye çevir / angle to pulse
13
14def move_slow(start, end, ms_per_degree=15):
15    step = 1 if end > start else -1
16    for a in range(start, end + step, step):  # 1 derecelik adımlar / 1-degree steps
17        write_angle(a)
18        time.sleep_ms(ms_per_degree)
19
20write_angle(90)                   # ortadan başla / start at the center
21time.sleep(1)
22
23while True:
24    move_slow(90, 170)
25    time.sleep(1)
26    move_slow(170, 10)
27    time.sleep(1)
28    move_slow(10, 90)
29    time.sleep(1)

16 сервоприводов с PCA9685: много MG996R по двум проводам

Когда сервоприводов становится много или приходится работать с библиотеками, отключающими прерывания, жизнь упрощает модуль PCA9685. Эта плата — 16-канальный 12-битный ШИМ-генератор, который общается с Arduino по I2C всего по двум проводам, SDA и SCL. Поскольку импульсы формируются от собственного тактового генератора, сигнал остаётся стабильным, даже когда процессор занят другими делами. Адрес по умолчанию — 0x40; меняя адрес паяными перемычками A0–A5 на плате, к одной шине можно подключить 62 платы, то есть теоретически 992 сервопривода. На 50 Hz период 20 мс делится на 4096 шагов, и один шаг равен примерно 4,9 µs: 500 µs — это около 102 шагов, а 2500 µs — около 512.

Пин PCA9685Arduino UnoESP32Raspberry Pi Pico
GNDGNDGNDGND
VCC (только питание микросхемы)5V3V33V3
SDAA4GPIO 21GP4
SCLA5GPIO 22GP5
Клемма V+ (питание сервоприводов)Внешние 5–6 VВнешние 5–6 VВнешние 5–6 V
OEНе подключатьНе подключатьНе подключать
C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_PWMServoDriver.h>
3
4Adafruit_PWMServoDriver pca = Adafruit_PWMServoDriver(0x40);   // varsayılan adres / default address
5
6const byte SERVO_COUNT = 16;
7const uint16_t MIN_US = 500;       // kalibrasyonla daralt / narrow it after calibration
8const uint16_t MAX_US = 2500;
9
10uint16_t angleToUs(float angle) {
11  return MIN_US + (uint16_t)(angle * (MAX_US - MIN_US) / 180.0);
12}
13
14void setup() {
15  pca.begin();
16  pca.setOscillatorFrequency(27000000);   // kartın gerçek saatine yakın / close to the real board clock
17  pca.setPWMFreq(50);                     // servolar için 50 Hz / 50 Hz for servos
18  delay(10);
19  for (byte ch = 0; ch < SERVO_COUNT; ch++) {
20    pca.writeMicroseconds(ch, angleToUs(90));   // hepsini ortala / center them all
21    delay(200);                                 // sırayla başlat: akım darbesini dağıt / one by one: spread the current surge
22  }
23}
24
25void loop() {
26  // Dalga: her servo komşusundan biraz geride / wave: each servo slightly behind its neighbour
27  float t = millis() / 1000.0;
28  for (byte ch = 0; ch < SERVO_COUNT; ch++) {
29    float angle = 90 + 40 * sin(t * 2.0 - ch * 0.4);   // 50–130° arası / between 50° and 130°
30    pca.writeMicroseconds(ch, angleToUs(angle));
31  }
32  delay(20);
33}

Для работы скетча установи библиотеку Adafruit PWM Servo Driver через «Менеджер библиотек». Строка setOscillatorFrequency(27000000) важна: на бумаге внутренний генератор PCA9685 работает на 25 MHz, но в реальности его частота гуляет примерно от 23 до 27 MHz, а в примерах Adafruit используется 27 MHz. Без этой настройки импульсы, заданные через writeMicroseconds(), могут отклоняться на несколько процентов. Если в setup запускать сервоприводы по одному с интервалом 200 мс, все 16 не станут одновременно потреблять пусковой ток. Если у каждого сервопривода свои пределы, преврати MIN_US и MAX_US в массивы из 16 элементов и откалибруй каждый канал отдельно. Скетч без изменений работает и на ESP32, потому что там библиотека Wire по умолчанию использует GPIO 21 и 22.

У PCA9685 два отдельных входа питания: VCC питает только микросхему, а сервоприводы получают питание от входа V+ на винтовой клемме. Если V+ оставить свободным, плата будет видна на шине I2C, но сервоприводы не шелохнутся; никогда не питай V+ от пина 5V на Arduino. Тонкие дорожки печатной платы на дешёвых модулях не рассчитаны на десятки ампер: если сервоприводов MG996R больше 4–6, подключи их плюсовые и минусовые провода к толстой распределительной шине, а с платы бери только сигнал. Также добавь на линию V+ примерно 100 µF ёмкости на каждый сервопривод.

MG996R, SG90 и MG90S: сравнение

ХарактеристикаSG90MG90SMG996R
Момент при заторможенном валу1,8 кг·см (4,8 V)1,8 кг·см (4,8 V), 2,2 кг·см (6 V)9,4 кг·см (4,8 V), 11 кг·см (6 V)
Скорость (на 60°)0,10 с (4,8 V)0,10 с (4,8 V), 0,08 с (6 V)0,17 с (4,8 V), 0,14 с (6 V)
Масса9 г13,4 г55 г
Размеры22,2 × 11,8 × 31 мм22,8 × 12,2 × 28,5 мм40,7 × 19,7 × 42,9 мм
ШестерниПластиковыеМеталлическиеМеталлические, два подшипника
Рабочее напряжение4,8–6 V4,8–6 V4,8–7,2 V
Ток при заторможенном валуОколо 0,6–0,75 AОколо 0,7–1 A2,5 A (6 V)
От пина 5V на ArduinoОдин сервопривод, лёгкая нагрузкаОдин сервопривод, лёгкая нагрузкаНет, только внешний источник
Типичное применениеПервые опыты, pan-tilt, захватЗапястье, захват, небольшие роботыПлечо робота-манипулятора, тяжёлая крышка, рулевое управление

Всё решают нагрузка и длина плеча. Если нужно поворачивать деталь массой в несколько граммов или просто поэкспериментировать, хватит SG90. Если нужен тот же размер, но с ударостойкими металлическими шестернями, бери MG90S. Если требуемый момент больше 1 кг·см, например нужно нести 100 г на конце плеча длиной 10 см, переходи на MG996R. Момент у MG996R примерно в пять раз больше, чем у SG90, но он медленнее, в шесть раз тяжелее и потребляет в три-четыре раза больше тока, так что питание и механическое крепление нужно планировать с учётом этого. Если и 11 кг·см не хватает, присмотрись к более крупным сервоприводам класса 20 кг·см, например DS3218.

SG90
SG90
MG90S
MG90S
MG996R
MG996R

Выбор сервоприводов для робота-манипулятора

  • Основание: MG996R. Не нагружай вал сервопривода всем весом манипулятора: поставь в основание подшипник, чтобы сервоприводу оставалось только вращать его.
  • Плечо: это самый нагруженный сустав. Используй MG996R; если рука манипулятора длиннее 20 см, добавь сервопривод класса 20 кг·см или противовес.
  • Локоть: MG996R. Если перенести тяжёлый сервопривод на уровень плеча и двигать локоть через тягу, нагрузка на плечо уменьшится.
  • Запястье и поворот запястья: хватит MG90S; MG996R здесь лишь добавит вес, который придётся нести плечу.
  • Захват: SG90 или MG90S. Настрой угол закрытия на точку, где пальцы захвата только касаются предмета: сервопривод, который постоянно пытается сжать сильнее, потребляет ток заторможенного вала.
  • Крепление: надень металлическую качалку на вал MG996R с 25 зубьями и закрепи её центральным винтом; пластиковые качалки при таком моменте быстро срывает.

Идеи проектов с MG996R

  • Робот-манипулятор: рука на 6 сервоприводах с MG996R в основании, плече и локте и MG90S в запястье и захвате; как её собрать, рассказано в руководстве по роботу-манипулятору.
  • Камера pan-tilt: поворачивай модуль ESP32-CAM по горизонтали и вертикали двумя MG996R.
  • Солнечный трекер: определяй направление на свет четырьмя фоторезисторами (LDR) и поворачивай небольшую панель к солнцу с помощью MG996R; подробности в статье Солнечный трекер.
  • Умное мусорное ведро: умное мусорное ведро, которое открывает тяжёлую крышку, когда к нему подносят руку.
  • Дверной замок по карте: отодвигай засов с помощью MG996R, когда к RFID RC522 прикладывают нужную карту.
  • Кран с управлением джойстиком: небольшой кран или экскаватор, который двигается по двум осям с помощью джойстика.
  • Привод постоянного вращения: медленное, но мощное колесо на версии MG996R с вращением на 360 градусов; в чём разница, объясняется в статье Сервопривод на 360 градусов.

При правильном питании MG996R — выносливый и недорогой мотор, который легко справляется с задачами, непосильными для маленьких сервоприводов. Запомни правила: внешний источник 5–6 V, общая земля, конденсатор рядом с сервоприводом, откалиброванный диапазон импульсов и плавное движение, а при большом количестве сервоприводов — PCA9685. В приложении BlueGrays есть такие проекты, как «Управление сервоприводом потенциометром», «Управление сервоприводом джойстиком», «Дверной замок с RFID на ESP32» и «Хореография сервоприводов по кругу — анимации на 32 сервоприводах», и у каждого есть пошаговая схема подключения и готовый код.

Частые вопросы

Какой груз может поднять MG996R?

Момент MG996R при 6 V составляет 11 кг·см: это 11 кг в 1 см от вала или 1,1 кг в 10 см. Это предел при заторможенном валу, когда сервопривод останавливается, поэтому для длительной работы закладывай половину этого значения. Иначе говоря, на конце плеча длиной 10 см он спокойно удерживает около 500 г.

Какое напряжение нужно MG996R и можно ли подать 12 V?

По даташиту рабочий диапазон — 4,8–7,2 V; на практике используют 5 V или 6 V, причём при 6 V момент и скорость выше. 12 V или сборка 2S LiPo, которая при полном заряде даёт 8,4 V, сожгут плату управления сервопривода. Если источник выдаёт более высокое напряжение, понизь его до 6 V понижающим преобразователем, например LM2596.

Какой ток потребляет MG996R и какой нужен блок питания?

В покое без нагрузки — около 10 mA, при движении — 0,5–0,9 A, а под нагрузкой и при старте — до 2,5 A. Выбирай блок питания на 5–6 V, который выдаёт не меньше 3 A для одного сервопривода и 6–10 A для четырёх. Не забудь подключить минус источника к пину GND на Arduino.

MG996R поворачивается на 180 градусов? Есть ли версия на 360 градусов?

Стандартный MG996R — позиционный сервопривод: производитель указывает около 120 градусов при стандартных импульсах, а с диапазоном 500–2500 µs большинство экземпляров приближается к 180 градусам. Версия на 360 градусов, которая продаётся под тем же названием, не встаёт на заданный угол: она вращается непрерывно, меняя скорость и направление в зависимости от сигнала. При покупке проверь, что указано в объявлении: 180° или 360°.

Почему сервопривод MG996R дрожит или перезагружает Arduino?

Причина почти всегда в питании: когда сервопривод питается от пина 5V на Arduino, его пиковый ток просаживает напряжение, и плата перезагружается. Используй внешний источник 5–6 V, общую землю и конденсатор 470–1000 µF рядом с сервоприводом. Против дрожания в неподвижном состоянии помогают толстые провода, сглаживание показаний потенциометра и диапазон импульсов в пределах механических ограничений сервопривода.

Чем MG996R отличается от MG995?

Оба сервопривода одинакового размера и подключаются одинаково; MG996R — улучшенная версия MG995. Благодаря переработанной плате управления и шестерням у него уже мёртвая зона, стабильнее центровка и немного больше момент. Для новых проектов выбирай MG996R: он без переделок встаёт на место старого MG995.

Все проекты
Работа с сервоприводом
#35Новичок
Premium

Работа с сервоприводом

Рычаг маленького сервопривода по очереди поворачивается в три положения: до упора в начало, ровно на середину и до упора в конец, задерживаясь на каждой остановке на две секунды. Arduino сообщает мото

4.7(48)
67
Управление сервоприводом потенциометром
#36Новичок
Premium

Управление сервоприводом потенциометром

Когда ты поворачиваешь ручку потенциометра, рычаг сервопривода поворачивается вместе с ней: одно крайнее положение ручки — ноль градусов, другое — пол-оборота. Arduino всё время читает положение ручки

4.6(37)
52
Управление сервоприводом джойстиком
#60Средний
Premium

Управление сервоприводом джойстиком

Управляй двумя моторами джойстиком, как будто поворачиваешь камеру наблюдения. Наклони рычажок влево или вправо, и нижний сервопривод медленно поворачивается, наклони вверх или вниз — верхний сервопри

4.7(42)
58
Сервопривод на ESP32 (управление потенциометром)
#118Средний
Premium

Сервопривод на ESP32 (управление потенциометром)

В этом проекте сервопривод SG90 управляется потенциометром. Угол сервопривода задаётся сопоставлением аналогового значения потенциометра с диапазоном 0–180 градусов. Библиотека ESP32Servo формирует сигналы сервопривода на подходящих выходных пинах GPIO у ESP32; этот проект использует GPIO 18. Это базовый способ управления для роборук, подвесов камер и механизмов автоматических дверей.

4.3(29)
42
Дверной замок с RFID на ESP32 (RC522 + сервопривод + OLED + зуммер + светодиод)
#137Продвинутый
Premium

Дверной замок с RFID на ESP32 (RC522 + сервопривод + OLED + зуммер + светодиод)

Собираем умный дверной замок на ESP32, модуле RFID RC522, сервоприводе SG90, OLED-дисплее SSD1306, активном зуммере и 2 светодиодах. При поднесении карты её UID сравнивается со списком разрешённых карт в коде: если доступ разрешён, сервопривод поворачивается и открывает дверь (зелёный светодиод + 2 коротких сигнала), а через 5 секунд дверь снова запирается сама. При чужой карте загорается красный светодиод, звучат 3 быстрых сигнала, а прочитанный UID показывается на экране.

4.8(9)
15
Хореография сервоприводов по кругу — анимации на 32 сервоприводах
#102Продвинутый
Premium

Хореография сервоприводов по кругу — анимации на 32 сервоприводах

Визуальный анимационный проект на Arduino Mega с 32 сервоприводами, расставленными по кругу. Сервоприводы собраны в один массив и подключены к пинам 22–53 Mega; они показывают четыре движения: хаотичное дрожание на случайных углах, синхронный взмах всех сразу, плавную волну по кругу и, наконец, стрелку компаса, качающуюся влево и вправо. Эффект бегущей волны создаётся поворотом каждого сервопривода в зависимости от его расстояния до активного.

4.5(40)
62
Робот, объезжающий препятствия
#81Продвинутый
Premium

Робот, объезжающий препятствия

Как насчёт того, чтобы собрать умную машину, которая сама находит дорогу? Робот, объезжающий препятствия, постоянно осматривает всё вокруг благодаря ультразвуковому датчику спереди. Встретив препятств

5.0(38)
49