Сервомотор (серводвигатель) – это двигатель, используемый для точного управления движениями устройства. Обычно он состоит из электродвигателя постоянного тока, схемы управления и механизма обратной связи. Механизм обратной связи необходим для получения информации о положении оси двигателя – она необходима схеме управления для управления двигателем. Сервомоторы находят широкое применение в робототехнике, станках с ЧПУ, 3D принтерах и других устройствах, где требуется точное управление каким либо механизмом.

В данной статье мы рассмотрим принципы работы сервомотора SG90 и его подключение к модулю ESP32. Также на нашем сайте мы рассматривали подключение серводвигателя к другим микроконтроллерам (платам):
- к микроконтроллеру AVR;
- к микроконтроллеру PIC;
- к плате Arduino Uno;
- к плате Arduino с использованием Matlab;
- к плате Raspberry Pi;
- к плате Raspberry Pi Pico;
- к плате MSP430G2;
- к плате STM32F103C8 (Blue Pill).
Необходимые компоненты
- Модуль ESP32 (купить на AliExpress).
- Сервомотор SG90 (купить на AliExpress).
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Как управлять углом поворота сервомотора?
Работа сервомотора состоит в управлении углом поворота оси в системе с замкнутым циклом управления и использовании механизма обратной связи (feedback) для настройки скорости и угла поворота оси.

Сервомотор SG90, который мы будем использовать в нашем проекте, представляет собой систему с замкнутым циклом управления. Чтобы управлять углом поворота его оси необходим сигнал ШИМ (широтно-импульсной модуляции) с частотой 50 Гц и изменяемым коэффициентом заполнения. Его плата управления настроена таким образом, чтобы принимать импульс каждые 20 мс, длина этого импульса определяет угол поворота оси сервомотора. Если импульс имеет длительность 1 мс, то ось сервомотора будет в нулевом положении (0 градусов). Импульс длительностью 1,5 мс повернет ось сервомотора на угол 90 градусов, а импульс длительностью 2 мс – на угол 180 градусов.
Компоненты сервомотора SG90
SG90 является одним из самых дешевых и распространенных серводвигателей, его компоненты показаны на следующем рисунке.

Как вы можете видеть из представленного рисунка, сервомотор SG90 состоит из понижающего редуктора, двигателя постоянного тока, потенциометра и платы управления. Потенциометр обеспечивает механизм обратной связи – текущая позиция оси сервомотора сравнивается с ее требуемой позицией.
Распиновка сервомотора SG90
Большинство сервомоторов, доступных в настоящее время на рынке, имеют 3 провода. Распиновка (назначение контактов) сервомотора SG90 представлена на следующем рисунке.

GND – контакт общего провода (земли).
VCC – контакт для подачи питающего напряжения на сервомотор.
Control – управляющий контакт сервомотора.
Наиболее часто задаваемые вопросы про сервомотор
Почему он называется сервомотором?
Сервомотор (серводвигатель) – это общий термин, используемый для обозначения конкретного вида линейных ли инкрементальных исполнительных механизмов. В основном, название сервомотор связывают с термином сервомеханизм, который обозначает что двигатель находится непрерывно под наблюдением для управления его движением.
Для чего используются сервомоторы?
Сервомоторы – это линейные исполнительные механизмы, которые могут поворачивать свою ось строго на определенный угол, поэтому используются в устройствах, в которых необходима точная регулировка положения какого либо механизма.
Сервомотор работает от постоянного (DC) или переменного тока (AC)?
Существует два типа сервомоторов – работающие от постоянного и переменного тока. Основное различие между ними заключается в способе подачи на них питания. Сервомоторы переменного тока получают питание от розетки, а сервомоторы постоянного тока – от батареек (аккумуляторов).
Какие существуют типы сервомоторов?
Сервомоторы выпускаются различных размеров трех основных типов: с позиционным вращением, непрерывным вращением и линейным вращением. Серводвигатели с позиционным вращением могут поворачиваться на 180 градусов. Они также имеют специальный механизм остановки в понижающем редукторе, играющий защитную функцию.
В чем разница между двигателем постоянного тока и сервомотором?
Сервомотор состоит из 4-х основных механизмов: двигателя постоянного тока, понижающего редуктора, датчика положения и схемы управления, а двигатель постоянного тока сам по себе является отдельным механизмом и не включает в себя никаких дополнительных компонентов.
Схема проекта
Схема подключения сервомотора SG90 к модулю ESP32 представлена на следующем рисунке.

Как видите, схема подключения достаточно проста. Необходимо подать питание на сервомотор, а его управляющий контакт подключить к любому цифровому контакту (GPIO pin) модуля ESP32.
Внешний вид собранной на макетной плате конструкции проекта показан на следующем рисунке.

Объяснение кода программы
Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.
Прежде чем приступать к написанию программы вам необходимо скачать библиотеку esp32 servo motor и установить ее в Arduino IDE.
Первым делом в коде программы подключим библиотеку Servo.h и создадим объект для работы с сервомотором. Затем объявим переменную pos, в которой будем хранить информацию о положении оси сервомотора.
|
1 2 3 4 |
#include <Servo.h> Servo myservo; // create servo object to control a servo // twelve servo objects can be created on most boards int pos = 0; |
В функции setup() мы с помощью метода attach "прикрепим" сервомотор к контакту 26 модуля ESP32.
|
1 2 3 |
void setup() { myservo.attach(26); // attaches the servo on pin 13 to the servo object } |
В функции void loop() мы запрограммируем два цикла, в одном из которых мы будем поворачивать ось сервомотора от 0 до 180 градусов, а в другом – от 180 градусов до 0. Этот процесс будет продолжаться бесконечно до тех пор пока на наш проект подается питание.
|
1 2 3 4 5 6 7 8 9 10 11 |
void loop() { for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } } |
Тестирование работы проекта
На следующем видео показано тестирование работы нашего проекта. Как мы запрограммировали в коде программы, ось сервомотора будет сначала поворачиваться от 0 до 180 градусов, а потом от 180 градусов до 0.
Возможные проблемы при работе с сервомотором
Иногда сервомоторы не очень хорошо работают если они запитываются от модуля ESP32. Поскольку вначале работы сервомотор потребляет достаточно большой ток, то возникающий при этом импульс тока может сбросить микроконтроллер или даже повредить его. Для решения этой проблемы можно использовать включение электролитического конденсатора большой емкости (470 - 1000 мкФ) между контактами GND и 5V модуля ESP32. В данном случае конденсатор будет играть роль своеобразного хранилища и будет защищать модуль во время потребления сервомотором большого тока. У подобного конденсатора два вывода - более длинный необходимо подключить к контакту 5V модуля ESP32, а более короткий - к общему проводу модуля.
Исходный код программы
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <Servo.h> Servo myservo; // создаем объект для управления сервомотором // twelve servo objects can be created on most boards int pos = 0; // переменная для хранения позиции оси сервомотора void setup() { myservo.attach(26); // attaches the servo on pin 13 to the servo object } void loop() { for (pos = 0; pos <= 180; pos += 1) { // позиция изменяется от 0 до 180 градусов // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // ждем 15ms чтобы сервомотор успел повернуть свою ось } for (pos = 180; pos >= 0; pos -= 1) { // позиция изменяется от 180 до 0 градусов myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // ждем 15ms чтобы сервомотор успел повернуть свою ось } } |




Всем привет!
А не нужен ли токоограничивающий резистор?
Что пишут:
У сервы ток около 650 мА.
Для микроконтроллера ESP32, на базе которого построена NodeMCU 32, максимально допустимый ток на один вывод составляет 40 мА.
Добрый вечер.
Нет, в данном проекте токоограничивающий резистор в сигнальной линии не нужен. Ваше опасение по поводу тока 650 мА и предела в 40 мА для ESP32 основано на смешении двух разных цепей.
Почему резистор не нужен: разделение силовой и сигнальной цепей
Вы путаете силовую цепь (питание двигателя) и сигнальную цепь (управление).
Силовая цепь (VCC и GND): Серводвигатель SG90 действительно потребляет значительный ток (вплоть до 650 мА и более при нагрузке или старте). Этот ток течёт от источника питания (в статье используется пин 5V платы ESP32) через обмотки двигателя на землю. Этот ток не проходит через сигнальный вывод GPIO.
Сигнальная цепь (управляющий провод): На управляющий контакт сервопривода подаётся только сигнал ШИМ (PWM). Вход управления сервопривода имеет высокое сопротивление. Потребляемый им ток ничтожно мал (обычно менее 1 мА) . Он не идёт на питание двигателя, а лишь служит командой для внутренней схемы управления.
Поэтому управляющий сигнал с вывода ESP32 (максимум 40 мА) управляет лишь «мозгом» сервопривода, а не его «мышцами» (двигателем). Резистор здесь не только не нужен, но и может быть вреден: он может ослабить сигнал, если вход сервопривода имеет недостаточное сопротивление, что приведёт к сбоям в работе.
Главная проблема проекта и её решение
Хотя резистор в сигнальной линии не нужен, в статье справедливо отмечена реальная проблема: питание сервопривода напрямую от платы ESP32 (особенно от порта USB) — плохая практика. В момент старта или под нагрузкой сервопривод создаёт импульсный бросок тока, который может вызвать просадку напряжения питания и перезагрузку ESP32.
Правильное решение (как указано в статье):
Установите электролитический конденсатор большой ёмкости (470–1000 мкФ) между контактами 5V и GND как можно ближе к сервоприводу (или к пину питания платы). Конденсатор работает как буфер, сглаживая пиковые броски тока и защищая микроконтроллер от перезагрузки.
Рекомендация: Для надёжной работы лучше всего использовать отдельный источник питания 5V (например, блок питания или DC-DC преобразователь) для сервопривода. При этом GND сервопривода и GND ESP32 должны быть соединены, а сигнальный провод идёт от ESP32 к сервоприводу.
А если с гитхаба по ссылке в описании качать библиотеку, то вообще нужно писать в коде #include «ESP32_Servo.h»
Пардон, имел ввиду эту библиотеку. Она нормально с есп работает:
https://github.com/jkb-git/ESP32Servo
Подключать библиотеку в коде с помощью #include обязательно нужно иначе как основной код программы узнает про эту библиотеку
Выдает ошибку что библиотека Servo не для есп32
А вы ESP32 корректно в Arduino IDE добавили? У статьи уже более 2к просмотров, а больше почему то никто на эту проблему не пожаловался
#include "ESP32Servo.h"