Управление сервоприводом с Arduino: основы
Подключаем сервопривод к Arduino и управляем им с помощью потенциометра или автоматической развёртки — два готовых примера с пояснениями.
Библиотека Servo Library — удобный и надёжный инструмент для управления сервоприводами. В этом уроке разберём два классических примера, которые подойдут для любой платы Arduino.
Первый пример — Knob — управляет положением RC-сервопривода (servo motor) с помощью потенциометра. Второй — Sweep — автоматически поворачивает вал сервопривода туда и обратно на 180 градусов.
Подробнее о возможностях библиотеки можно узнать в Servo GitHub repository.
Что понадобится
- Плата Arduino
- Сервопривод
- Потенциометр 10 кОм
- Провода для подключения
- Конденсаторы
- Внешний источник питания
Питание сервопривода
Сервоприводы потребляют очень разное количество энергии — всё зависит от размера мотора и нагрузки. Типичный небольшой сервопривод, например Feetech Mini Servo Motor, в режиме ожидания потребляет от 5 до 6 mA при напряжении 4,8–6 В. В покое это немного.
Как только мотор начинает двигаться, потребление тока резко возрастает. Если добавить нагрузку или заблокировать вал, ток растёт ещё сильнее — в таком режиме потребление может достигать 800 mA.
Такой ток небезопасно брать напрямую с пинов Arduino: это почти наверняка повредит плату. Поэтому сервопривод нужно питать от внешнего источника. Выбор источника зависит от конкретного мотора — всегда смотрите спецификацию и обращайте внимание на следующие параметры:
- диапазон рабочего напряжения
- ток холостого хода — потребление в состоянии покоя
- рабочий ток — потребление при свободном движении
- ток стопорения — потребление при максимальной нагрузке или заблокированном вале
Для сервопривода с питанием 4,8–6 В подойдёт адаптер 5 В / 1 А: обрежьте кабель и подключите провода к сервоприводу через макетную плату.
_Note что USB обычные USB-зарядки ограничены 500 mA (USB 2.0) или 900 mA (USB 3.0)._
Если проект должен быть мобильным, используйте аккумуляторы. Для стабильных 5 В хорошо подходят два аккумулятора 18650 Li-Ion вместе с понижающим DC-DC преобразователем (step-down). Без него напряжение двух таких банок составит около 7,4 В, что выходит за пределы допустимого для большинства сервоприводов.
_If вы используете более мощные или несколько сервоприводов — обязательно пересчитайте требования по току._
Зачем нужен конденсатор
Конденсаторы настоятельно рекомендуются при питании сервоприводов. Они сглаживают скачки напряжения, которые возникают при резком изменении нагрузки, снижают электрические помехи и делают работу мотора более стабильной.
При использовании Feetech Mini Servo Motor рекомендуется поставить конденсатор ёмкостью 100 мкФ.

Электролитический конденсатор: обозначение отрицательного и положительного выводов. Отрицательный вывод (−) часто отмечен белой полосой, положительный (+) — более длинной ножкой.
_Because некоторые конденсаторы полярные (имеют строго определённое направление подключения). Перед установкой проверьте маркировку: белая полоска, знак «+» или более длинный вывод. Совместите полярность конденсатора с полярностью в цепи и не превышайте допустимое напряжение. Неправильное подключение может привести к протечке электролита или разрушению компонента._
Подробнее о конденсаторах читайте here.
Схема подключения
Сервопривод имеет три провода: питание, земля и сигнал.
- Красный провод — питание, подключается к положительному полюсу (+) источника питания.
- Чёрный или коричневый провод — земля, подключается к отрицательному полюсу (−).
- Жёлтый или оранжевый провод — сигнал, подключается к пину PWM на плате. В обоих примерах используется пин 9.
Практическое замечание: землю внешнего источника питания обязательно соедините с
GNDArduino. Без общей земли сигнальный провод сервопривода не будет работать корректно — это одна из самых частых ошибок новичков.
Схема для примера Knob
Для примера Knob подключите потенциометр так: два крайних вывода — к питанию (+5V) и земле, средний вывод (движок) — к пину A0 на плате. Сервопривод подключите согласно схеме ниже.

Схема «Knob» (потенциометр): подключение сервопривода и потенциометра к Arduino Uno с внешним источником питания.
Схема для примера Sweep
Для примера Sweep потенциометр не нужен. Подключите только сервопривод согласно схеме ниже.

Схема «Sweep»: подключение сервопривода к Arduino Uno с внешним источником питания.
Примеры кода
Knob — управление сервоприводом через потенциометр
Программа считывает аналоговое значение с потенциометра (пин A0) и преобразует его в угол поворота сервопривода от 0 до 180 градусов. Поворачивайте ручку — вал сервопривода будет следовать за ней в реальном времени.
#include <Servo.h>
Servo myservo; // создаём объект servo для управления сервоприводом
int potpin = 0; // аналоговый пин для подключения потенциометра
int val; // переменная для хранения значения с аналогового пина
void setup() {
myservo.attach(9); // подключаем сервопривод на пине 9 к объекту servo
}
void loop() {
val = analogRead(potpin); // считываем значение потенциометра (от 0 до 1023)
val = map(val, 0, 1023, 0, 180); // масштабируем значение для использования с сервоприводом (от 0 до 180)
myservo.write(val); // устанавливаем положение сервопривода согласно масштабированному значению
delay(15); // ждём, пока сервопривод достигнет позиции
}
Sweep — автоматическая развёртка на 180 градусов
Программа плавно поворачивает вал сервопривода от 0° до 180° и обратно в бесконечном цикле. Никакого дополнительного управления не требуется — удобно для проверки исправности мотора и диапазона его движения.
#include <Servo.h>
Servo myservo; // создаём объект servo для управления сервоприводом
// на большинстве плат можно создать до двенадцати объектов servo
int pos = 0; // переменная для хранения позиции сервопривода
void setup() {
myservo.attach(9); // подключаем сервопривод на пине 9 к объекту servo
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // движение от 0 до 180 градусов
// с шагом 1 градус
myservo.write(pos); // отправляем сервопривод в позицию, заданную переменной 'pos'
delay(15); // ждём 15 мс, пока сервопривод достигнет позиции
}
for (pos = 180; pos >= 0; pos -= 1) { // движение от 180 до 0 градусов
myservo.write(pos); // отправляем сервопривод в позицию, заданную переменной 'pos'
delay(15); // ждём 15 мс, пока сервопривод достигнет позиции
}
}
Типичные ошибки
- Сервопривод дёргается или не удерживает позицию — скорее всего, недостаточно тока от источника питания. Проверьте, что блок питания рассчитан на нужный ток.
- Arduino перезагружается при движении сервопривода — сервопривод питается от пина 5V платы и тянет слишком много тока. Переведите питание мотора на внешний источник.
- Нет общей земли — сервопривод не реагирует на сигнал, хотя питание есть. Убедитесь, что
GNDвнешнего источника иGNDArduino соединены. - Конденсатор подключён с обратной полярностью — это может повредить как конденсатор, так и остальную схему. Всегда проверяйте маркировку перед подключением.
Как проверить результат
Для примера Knob: медленно поворачивайте потенциометр — вал сервопривода должен плавно следовать за ним. Если движение рывками, попробуйте добавить небольшую задержку (delay(15)) после вызова write().
Для примера Sweep: после загрузки скетча сервопривод должен сразу начать двигаться туда и обратно без каких-либо дополнительных действий.