Сервомотор (серводвигатель) – это двигатель, используемый для точного управления движениями устройства. Обычно он состоит из электродвигателя постоянного тока, схемы управления и механизма обратной связи. Механизм обратной связи необходим для получения информации о положении оси двигателя – она необходима схеме управления для управления двигателем. Сервомоторы находят широкое применение в робототехнике, станках с ЧПУ, 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 чтобы сервомотор успел повернуть свою ось } } |
Выдает ошибку что библиотека Servo не для есп32
А вы ESP32 корректно в Arduino IDE добавили? У статьи уже более 2к просмотров, а больше почему то никто на эту проблему не пожаловался
#include "ESP32Servo.h"