Сервопривод 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 — улучшенная версия старой модели 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 MG996R | 0,5–0,9 A | 2,5 A | 5–6 V, не менее 3 A |
| 2 сервопривода | 1–1,8 A | 5 A | 5–6 V, 5 A |
| 4 сервопривода | 2–3,6 A | 10 A | 5–6 V, импульсный блок питания на 6–10 A |
| 6 сервоприводов (робот-манипулятор) | 3–5,4 A | 15 A | 6 V, 10 A и код, который двигает сервоприводы по очереди |
| 16 сервоприводов (PCA9685) | 8–14 A | 40 A | Несколько отдельных линий 6 V или источник на 20 A и больше |
Правильное питание: внешние 5–6 V, общая земля и конденсатор
- Выбери источник: возьми импульсный блок питания на 5 V или 6 V, который выдаёт ток из таблицы выше для нужного количества сервоприводов. Для переносных проектов хорошо подходят 4 NiMH-аккумулятора AA (4,8 V) или сборка 2S LiPo с понижающим стабилизатором (UBEC), настроенным на 6 V.
- Плюс — только на сервопривод: подключи плюс источника к красному проводу MG996R, а к пину 5V на Arduino его не подключай.
- Объедини земли: подключи минус источника и к коричневому проводу сервопривода, и к пину GND на Arduino. Сигнал — это напряжение, которое измеряется относительно GND, поэтому без общей земли сервопривод не понимает импульсы.
- Подключи сигнал: оранжевый провод — к пину D9 на Arduino Uno (GPIO 18 на ESP32, GP15 на Pico).
- Добавь конденсатор: поставь электролитический конденсатор 470–1000 µF / 16 V параллельно выводам питания сервопривода, как можно ближе к нему; вывод, отмеченный полосой на корпусе, идёт на минус. Если сервоприводов несколько, закладывай примерно 100 µF на каждый.
- Питай Arduino отдельно: запитай плату от USB или через гнездо питания (DC). Тогда просадки напряжения от сервопривода не доходят до процессора.
| Подключение | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| Оранжевый провод (сигнал) | D9 | GPIO 18 | GP15 |
| Красный провод (плюс) | Плюс внешнего источника 5–6 V | Плюс внешнего источника 5–6 V | Плюс внешнего источника 5–6 V |
| Коричневый провод (GND) | Минус источника + GND Arduino | Минус источника + GND ESP32 | Минус источника + GND Pico |
| Конденсатор (470–1000 µF) | Между плюсом и минусом сервопривода | Между плюсом и минусом сервопривода | Между плюсом и минусом сервопривода |
| Потенциометр (пример для ESP32) | — | Средний вывод — к GPIO 34, крайние — к 3V3 и GND | — |

Библиотека 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 градусам. Сервопривод, который толкают за предел, упирается во внутренний упор, потребляет ток заторможенного вала, гудит и нагревается. Поэтому первым делом найди безопасный диапазон импульсов своего сервопривода с помощью скетча ниже.
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}- Загрузи скетч, открой монитор порта на скорости 115200 бод и выбери конец строки New Line («Новая строка»).
- Введи 1500 — сервопривод встанет в среднее положение. Именно в этот момент надень качалку так, чтобы она смотрела в среднее положение механизма.
- Двигайся к нижнему пределу шагами по 50 µs, вводя значения вроде 1000, 800 и 700. Если сервопривод больше не поворачивается или начинает гудеть, вернись на 30–50 µs назад от последнего значения и запиши это число как MIN_US.
- Сделай то же самое для верхнего предела со значениями вроде 2000, 2200 и 2300 и найди MAX_US. Эти два числа понадобятся в следующих скетчах.
Плавное движение: код, который уменьшает броски тока и рывки
Одна команда вроде servo.write(160) бросает сервопривод к цели на полной скорости: при 6 V он проходит 60 градусов за 0,14 секунды. В это время мотор потребляет ток, близкий к току заторможенного вала, механизм дёргается, а удерживаемый предмет может упасть. Если разбить движение на маленькие шаги, уменьшатся и пики тока, и механические удары. Скетч ниже сдвигает сервопривод на 1 градус каждые 15 мс (около 67°/с), а поскольку он использует millis(), параллельно можно делать и другие дела.
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% |
Управление MG996R с ESP32
На ESP32 стандартная библиотека Servo для Arduino не работает: установи библиотеку ESP32Servo через «Менеджер библиотек». Пользоваться ею почти так же: период задаётся через setPeriodHertz(50), а пределы за рамками 500–2500 µs библиотека не принимает. Сигнальный выход ESP32 — 3,3 V, и подавляющее большинство MG996R воспринимает его без проблем; если твой сервопривод не реагирует или ведёт себя нестабильно, добавь на сигнальную линию преобразователь логических уровней. В примере ниже сервопривод поворачивается потенциометром, подключённым к GPIO 34. АЦП у ESP32 12-битный, поэтому показания лежат в диапазоне 0–4095 и немного шумят; именно поэтому в коде есть фильтрация и мёртвая зона.
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. Запитай сервопривод от внешнего источника и объедини земли. Код ниже плавно, градус за градусом, перемещает сервопривод между тремя положениями.
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.
| Пин PCA9685 | Arduino Uno | ESP32 | Raspberry Pi Pico |
|---|---|---|---|
| GND | GND | GND | GND |
| VCC (только питание микросхемы) | 5V | 3V3 | 3V3 |
| SDA | A4 | GPIO 21 | GP4 |
| SCL | A5 | GPIO 22 | GP5 |
| Клемма V+ (питание сервоприводов) | Внешние 5–6 V | Внешние 5–6 V | Внешние 5–6 V |
| OE | Не подключать | Не подключать | Не подключать |
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.
MG996R, SG90 и MG90S: сравнение
| Характеристика | SG90 | MG90S | MG996R |
|---|---|---|---|
| Момент при заторможенном валу | 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 V | 4,8–6 V | 4,8–7,2 V |
| Ток при заторможенном валу | Около 0,6–0,75 A | Около 0,7–1 A | 2,5 A (6 V) |
| От пина 5V на Arduino | Один сервопривод, лёгкая нагрузка | Один сервопривод, лёгкая нагрузка | Нет, только внешний источник |
| Типичное применение | Первые опыты, pan-tilt, захват | Запястье, захват, небольшие роботы | Плечо робота-манипулятора, тяжёлая крышка, рулевое управление |
Всё решают нагрузка и длина плеча. Если нужно поворачивать деталь массой в несколько граммов или просто поэкспериментировать, хватит SG90. Если нужен тот же размер, но с ударостойкими металлическими шестернями, бери MG90S. Если требуемый момент больше 1 кг·см, например нужно нести 100 г на конце плеча длиной 10 см, переходи на MG996R. Момент у MG996R примерно в пять раз больше, чем у SG90, но он медленнее, в шесть раз тяжелее и потребляет в три-четыре раза больше тока, так что питание и механическое крепление нужно планировать с учётом этого. Если и 11 кг·см не хватает, присмотрись к более крупным сервоприводам класса 20 кг·см, например DS3218.



Выбор сервоприводов для робота-манипулятора
- Основание: 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.
Что собрать после прочтения
Все проекты
Работа с сервоприводом
Рычаг маленького сервопривода по очереди поворачивается в три положения: до упора в начало, ровно на середину и до упора в конец, задерживаясь на каждой остановке на две секунды. Arduino сообщает мото

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

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

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

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

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

Робот, объезжающий препятствия
Как насчёт того, чтобы собрать умную машину, которая сама находит дорогу? Робот, объезжающий препятствия, постоянно осматривает всё вокруг благодаря ультразвуковому датчику спереди. Встретив препятств
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

