Сервопри́вод (от лат. servus — слуга, помощник), или следя́щий при́вод — механический привод с автоматической коррекцией состояния через внутреннюю отрицательную обратную связь, в соответствии с параметрами, заданными извне. Сервоприводом является любой тип механического привода (устройства, рабочего органа), имеющий в составе датчик (положения, скорости, усилия и т. п.) и блок управления приводом (электронную схему или механическую систему тяг), автоматически поддерживающий необходимые параметры на датчике (и, соответственно, на устройстве) согласно заданному внешнему значению (положению ручки управления или численному значению от других систем). Проще говоря, сервопривод является «автоматическим точным исполнителем» — получая на вход значение управляющего параметра (в режиме реального времени), он «своими силами» (основываясь на показаниях датчика) стремится создать и поддерживать это значение на выходе исполнительного элемента.
Устройство #
Конструкция современных сервоприводов довольно проста, но при этом весьма эффективна, так как позволяет обеспечить максимально точное управление движением. Сервопривод состоит из:
- двигателя постоянного тока
- шестерни редуктора
- выходного вала
- потенциометра
- платы управления, на которую подается управляющий сигнал
Двигатель и редуктор образуют привод. Редуктор используется для снижения скорости вращения двигателя, которую необходимо адаптировать для практического применения. К выходному валу редуктора крепится необходимая нагрузка. Это может быть качалка, вращающийся вал, тянущие или толкающие механизмы.
Для того, чтобы угол поворота превратить в электрический сигнал, необходим датчик. Его функции в сервоприводе постоянного тока с успехом выполняет потенциометр. Он выдает аналоговый сигнал (как правило, от 0 до 10 В) с дискретностью, ограниченной АЦП (аналогово-цифровым преобразователем), на который поступает этот сигнал.
Самой важной деталью сервопривода, пожалуй, является электронная плата сервоусилителя, которая принимает и анализирует управляющие импульсы, соотносит их с данными потенциометра, отвечает за запуск и выключение двигателя.
Подключить серводвигатель можно с помощью трех проводников. По двум из них подается питание к электродвигателю, а третий служит для прохождения сигналов управления, приводящих вал в определенное положение.
Широтно-импульсная модуляция — ШИМ #
Разберем понятие ШИМ на примере управления скоростью вращения двигателя постоянного тока. Поставим своей целью запустить мотор на 50% от его максимальной скорости. Пусть наш двигатель идеальный и чтобы достичь заданной скорости, нам нужно в единицу времени передавать на мотор в два раза меньше мощности. Как это сделать, не меняя источник питания?
Проведем мысленный эксперимент (а кто-то может и натуральный — ничего сложного). Возьмём мотор постоянного тока с массивным маховиком, закрепленным на валу (таким маховиком может служить колесо). Подадим питание от аккумулятора и мотор начнет набирать обороты. Через какое-то время, мотор достигнет номинальной мощности, а его ротор максимальной скорости вращения. Отключим питание, и мотор постепенно начнет замедляться вплоть до полной остановки.
Следующий опыт. Снова включим мотор, и когда его скорость достигнет половины от максимальной — выключим. Заметив, что скорость падает — снова включим. И так далее. Включая и выключая питание мотора, мы заставим ротор вращаться со скоростью, близкой к половине от максимальной!
Разумеется, в силу человеческой медлительности, мотор будет удерживать заданную скорость с некоторой погрешностью. Другими словами, скорость будет «плавать» вокруг заданного значения. Чтобы минимизировать эти отклонения, нам потребуется увеличить частоту переключений. Тут уже не обойтись без автоматики.
А как заставить мотор вращаться медленнее или быстрее? Количество переданной мотору энергии будет зависеть от отношения времени когда мотор включен — tвкл к времени когда он выключен — tвыкл.
Так, для передачи мотору 50% мощности, tвкл будет равно tвыкл. Такой случай как раз изображен на графике. Чтобы мотор вращался еще медленнее, скажем с мощностью 25% от номинальной, придется время включения мотора уменьшить до этих самых 25% от общего периода управления T.
Таким образом, имея возможность менять ширину импульсов, мы можем достаточно точно управлять скоростью вращения мотора.
Собственно, рассмотренный способ управления мощностью и называется широтно-импульсной модуляцией сигнала, а сокращённо — ШИМ. Теперь рассмотрим параметры которые характеризуют ШИМ сигнал и которые следует учитывать при написании программ для микроконтроллеров.
Коэффициент заполнения (duty cycle) #
Начнем с самого главного параметра — коэффициента заполнения D (он же duty cycle). Этот коэффициент равен отношению периода ШИМ сигнала к ширине импульса:
$$ D = T / t_{вкл} $$
Пример ШИМ сигнала для разных значений D:
Чем больше D, тем больше мощности мы передаем управляемому устройству, например, двигателю. Так, при D = 1 двигатель работает на 100% мощности, при D = 0,5 — наполовину мощности, при D = 0 — двигатель полностью отключен.
Кстати, кроме коэффициента заполнения для характеризации ШИМ применяют и другой параметр — скважность S. Эти два параметра связаны выражением:
$$ S = 1 / T $$
Скважность, как и коэффициент заполнения — величина безразмерная. В отличие от D, она может принимать значения от 1 до бесконечности. Но чаще всего, особенно в англоязычных источниках, используют именно D.
Частота ШИМ #
Частота ШИМ определяет период импульса — T (см картинку выше). Требования к этой частоте диктуются несколькими факторами, в зависимости от типа управляемого устройства.
В случае управления светодиодами одним из главных факторов становится видимость мерцания. Чем выше частота, тем менее заметно мерцание излучаемого света. Высокая частота также помогает снизить влияние температурных скачков, которые светодиоды не любят. На практике для светодиодов достаточно иметь частоту ШИМ в пределах 100-300 Гц.
С моторами постоянного тока дела обстоят немного иначе. С одной стороны, чем больше частота, тем более плавно и менее шумно работает мотор. С другой — на высоких частотах падает крутящий момент. Нужен баланс. Более подробно о моторах мы поговорим в одной из будущих статей, а пока рекомендуем для большинства DIY задач использовать частоту ШИМ 2кГц.
Плюс, общая проблема для всех случаев управления силовой нагрузкой — потери в цепях силовой коммутации (в транзисторах, и не только), которые увеличиваются с ростом частоты ШИМ. Чем больше частота, тем большее время транзисторы находятся в переходных состояниях, активно выделяя тепло и снижая эффективность системы.
Разрешение ШИМ #
Ещё один важный параметр — разрешение ШИМ сигнала. Этот параметр показывает, с какой точностью мы можем менять коэффициент заполнения. Чем больше разрешение, тем плавнее будет меняться мощность на управляемом устройстве.
Например, у платы Ардуино с базовыми настройками, разрешение ШИМ — 256. То есть мы можем изменять сигнал от 0 до 255 — не густо, но для большинства DIY задач хватает.
Использование ШИМ для вращения сервопривода #
Вращение выходного вала редуктора, связанного шестернями с сервоприводом, осуществляется путем запуска и остановки электродвигателя. Сам редуктор необходим для регулировки числа оборотов. Выходной вал может быть соединен с механизмами или устройствами, которыми необходимо управлять. Положение вала контролируется с помощью датчика обратной связи, способного преобразовывать угол поворота в электрические сигналы и на котором построен принцип работы всего устройства.
Этот датчик известен также, под названием энкодера или потенциометра. При повороте бегунка, его сопротивление будет изменяться. Изменения сопротивления находится в прямой пропорциональной зависимости с углом поворота энкодера. Данный принцип работы позволяет устанавливать и фиксировать механизмы в определенном положении.
Дополнительно каждый серводвигатель имеет электронную плату, обрабатывающую внешние сигналы, поступающие от потенциометра. Далее выполняется сравнение параметров, по результатам которого производится запуск или остановка электродвигателя. Следовательно, с помощью электронной платы поддерживается отрицательная обратная связь.
Принцип действия устройств основан на использовании импульсного сигнала, который имеет три важные характеристики – частоту повторения, минимальную и максимальную продолжительность. Именно продолжительность импульса определяет угол поворота двигателя.
Импульсные сигналы, получаемые сервоприводом, имеют стандартную частоту, а вот их продолжительность в зависимости от модели может составлять от 0,8 до 2,2 мс. Параллельно с поступлением управляющего импульса активируется работа генератора опорного импульса, который связан с потенциометром. Тот, в свою очередь, механически сопряжен с выходным валом и отвечает за корректирование его положения.
Электронная схема анализирует импульсы с учетом длительности и на основе разностной величины определяет разницу между ожидаемым (заданным) положением вала и реальным (измеренным при помощи потенциометра). Затем производится корректировка путем подачи напряжения на питание двигателя.
Если продолжительность опорного и управляющего импульсов совпадает, наступает так называемый нулевой момент. В это время двигатель сервопривода не работает, вал привода находится в исходном (неподвижном) положении.
При увеличении длительности управляющего импульса плата фиксирует разбежку показателей, двигатель получает напряжение и приходит в движение. В свою очередь, редуктор начинает воздействовать на выходной вал, который поворачивается таким образом, чтобы достигнуть увеличения продолжительности опорного импульса. Как только он сравняется с управляющим импульсом, двигатель прекратит свою работу.
При уменьшении длительности управляющего импульса происходит все то же самое, только с точностью до наоборот, так как двигатель начинает вращаться в обратную сторону. Как только импульсы сравнялись, двигатель останавливается.
Области применения #
Как правило, сервоприводы постоянного тока используются в маломощных устройствах позиционирования. Классическая область их применения – любительская робототехника.
Поддерживаемые модели и их характеристика #
Внешний вид | Модель | Минимальный импульс, мкс(микросекунды) | Максимальный импульс, мкс(микросекунды) | Размер рабочего диапазона, мкс(микросекунды) | Импульс для поворота на 180 градусов | Импульс для поворота на 1 градус, мкс(микросекунды) | Максимальный угол поворота (градус) | Скорость поворота на 60° при 4.8 В (сек) | Скорость поворота на 60° при 6 В (сек) | Максимальная скорость при 4.8.V (градусов в секунду) | Максимальная скорость при 6V (градусов в секунду) | Рабочее напряжение (вольт) | Аналоговый / цифровой | Ссылки | Примечание |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
mg90s | 267 | 2722 | 2455 | 2074 | 11,52 | 213,06 | 0,1 | 0,08 | 600 | 750 | 4,8 / 6 V | Аналоговый | datasheet | Есть другие режимы работы за рамками крайних положений | |
a0090 | 500 | 2400 | 1900 | 1700 | 9,44 | 201,17 | 0,09 | 0,07 | 666,66 | 428,57 | 4,8 / 6 V | Цифровой | datasheet | Запоминает последнее состояние в рамках рабочего диапазона | |
mg996 | 350 | 2550 | 2200 | 1800 | 10 | 220 | 0,17 | 0,14 | 352,94 | 857,14 | 4,8 / 6 V | Цифровой | datasheet | На одном сервоприводе минимальный импульс был 17500 | |
Corona DS929MG | 500 | 2450 | 1950 | 1800 | 10 | 195 | 0,11 | - | 545,45 | - | 4,8 / 6 V | Цифровой | datasheet | Жужит и нагревается при крайних положениях | |
Corona SB-9039 | 800 | 2100 | 1300 | 1800 | 10 | 130 | 0,14 | 0,13 | 428,57 | 461,53 | 4,8 V | Цифровой | datasheet | - | |
Corona DS843MG | 800 | 2200 | 1400 | 1600 | 8,88 | 157,5 | 0,12 | 0,1 | 500 | 600 | 4,8 / 6 V | Цифровой | datasheet | Запоминает последнее состояние в рамках рабочего диапазона | |
Corona DS238MG | 900 | 2100 | 1200 | 1550 | 8,61 | 139,35 | 0,15 | 0,14 | 400 | 428,57 | 4,8 / 6 V | Цифровой | datasheet | - |
Создание и инициализация #
Для того, чтобы управлять сервоприводом с помощью данной библиотеки необходимо создать и проинициализировать компонент по управлению сервоприводом.
Для этого необходимо последователь выполнить следующее:
- Подключить и проинициализировать библиотеку с помощью метода Risdk_InitSDK
- Создать компонент i2c коннектора с помощью метода Risdk_CreateComponent и проинициализировать его с помощью метода Risdk_connector_i2c_Init
- Открыть соединения по i2c коннектору с помощью метода Risdk_connector_i2c_Open
- Создать компонент ШИМ преобразователя методом Risdk_CreateComponent и проинициализировать его методом Risdk_sigmod_PWM_Init
- Методом Risdk_CreateComponent создать компонент управления сервоприводом. В данный метод перым параметром необходимо указать тип компонента "servodrive"
- Проинициализировать компонент управления сервоприводом методом Risdk_exec_ServoDrive_Init
Ниже приведены примеры создания и инициализации компонента по управлнию сервоприводом для Golang и Python
Примеры создания и инициализации #
Инициализация компонента управления сервоприводом на Golang #
В данном примере осуществляется инициализация компонента по управлению сервоприводом. В полном примере описан полностью весь путь от подключения библиотеки до инициализации. Только после инициализации можно использовать остальные методы компонента
- Python
errTextC = c_char_p() # Текст ошибки. C type: char*
errCode = c_int
pin = 0 //пин к которому будет покдлючен сервопривод
d_mg90s = c_int(0)
# создаем компонент сервопривода с конкретной моделью как исполняемое устройство и получаем дескриптор сервопривода
errCode = lib.RI_SDK_CreateModelComponent("executor".encode(), "servodrive".encode(), "mg90s".encode(), d_mg90s, errTextC)
if errCode != 0:
return errCode, errTextC
# связываем сервопривод с ШИМ,передаем дескриптор сервопривода и ШИМ, d_pca - дескриптор ШИМ
errCode = lib.RI_SDK_LinkServodriveToController(d_mg90s, d_pca, pin, errTextC)
if errCode != 0:
return errCode, errTextC
- C
int d_mg90s, errCode;
char errorText[1000];
int pin = 0; //пин к которому будет покдлючен сервопривод
//создание компонета сервопривода
errCode = RI_SDK_CreateModelComponent("executor", "executor", "mg90s", &d_mg90s, errorText);
if (errCode) {
printf("RI_SDK_CreateModelComponent errorText:%s\n", errorText);
return
errCode;
}
//подключение сервопривода к контроллеру, d_pca - дескриптор ШИМ
errCode = RI_SDK_LinkServodriveToController(d_mg90s, d_pca, pin, errorText);
if (errCode) {
printf("RI_SDK_LinkServodriveToController errorText:%s\n", errorText);
return
errCode;
}
- C++
int d_mg90s, errCode;
char errorText[1000];
int pin = 0; //пин к которому будет покдлючен сервопривод
//создание компонета сервопривода
errCode = RI_SDK_CreateModelComponent("executor", "executor", "mg90s", &d_mg90s, errorText);
if (errCode) {
printf("RI_SDK_CreateModelComponent errorText:%s\n", errorText);
return
errCode;
}
//подключение сервопривода к контроллеру, d_pca - дескриптор ШИМ
errCode = RI_SDK_LinkServodriveToController(d_mg90s, d_pca, pin, errorText);
if (errCode) {
printf("RI_SDK_LinkServodriveToController errorText:%s\n", errorText);
return
errCode;
}
- Golang
var (
errorTextC [1000]C.char //текст ошибки. Передается как входной параметр,при возникновении ошибки в эту переменную будет записан текст ошибки
errCode C.int //код ошибки
d_mg90s C.int
pwm C.int
)
// создаем компонент сервопривода с конкретной моделью как исполняемое устройство и получаем дескриптор сервопривода
errCode = C.RI_SDK_CreateModelComponent(C.CString("executor"), C.CString("servodrive"), C.CString("mg90s"), d_mg90s, &errorTextC[0])
if errCode != 0 {
return fmt.Errorf("errorCode:%d - errorText:%s", errCode, C.GoString(&errorTextC[0]))
}
//связываем сервопривод с ШИМ,передаем дескриптор сервопривода и ШИМ, d_pca - дескриптор ШИМ
errCode = C.RI_SDK_LinkServodriveToController(*d_mg90s, d_pca, C.int(0), &errorTextC[0])
if errCode != 0 {
return fmt.Errorf("errorCode:%d - errorText:%s", errCode, C.GoString(&errorTextC[0]))
}
- Golang gRPC
var (
errorText string // текст ошибки. Передается как входной параметр,при возникновении ошибки в эту переменную будет записан текст ошибки
errCode int64 // код ошибки
d_mg90s int64 //дескриптор сервопривода
pin int64 = 0 //пин к которому будет покдлючен сервопривод
)
// создаем компонент сервопривода с конкретной моделью как исполняемое устройство и получаем дескриптор сервопривода
d_mg90s, errorText, errCode, _ = client.RoboSdkApi.RI_SDK_CreateModelComponent("executor", "servodrive", "mg90s")
if errCode != 0 {
return fmt.Errorf("errorCode:%d - errorText:%s", errCode, errorText)
}
//связываем сервопривод с ШИМ,передаем дескрипторы сервопривода и ШИМ, d_pca - дескриптор ШИМ
errorText, errCode, _ = client.RoboSdkApi.RI_SDK_LinkServodriveToController(d_mg90s, d_pca, pin)
if errCode != 0 {
return fmt.Errorf("errorCode:%d - errorText:%s", errCode, errorText)
}
- PHP
$errorText = $ffi->new('char[1000]', 0); //выделяем память на строку с ошибкой. Передается как входной параметр,при возникновении ошибки в эту переменную будет записан текст ошибки
$errCode=0; //код ошибки
$d_mg90s = $ffi->new('int', 0); // Выделяем память на переменную с номером дескриптора
$pin=0; //пин к которому будет покдлючен сервопривод
// создаем компонент сервопривода с конкретной моделью как исполняемое устройство и получаем дескриптор сервопривода
$errCode = $ffi->RI_SDK_CreateModelComponent("executor", "servodrive", "mg90s", FFI::addr($d_mg90s), $errorText);
if ($errCode) {
return $errCode;
}
//связываем сервопривод с ШИМ,передаем дескриптор сервопривода и шим, d_pca - дескриптор ШИМ
$errCode = $ffi->RI_SDK_LinkServodriveToController($d_mg90s->cdata, $d_pca->cdata, $pin, $errorText);
if ($errCode) {
return $errCode;
}
Название метода | Описание |
---|---|
RISDK_exec_ServoDrive_CustomDeviceInit | Инициализация кастомного сервопривода |
RISDK_exec_ServoDrive_Stop | Прекращает подачу сигнала к сервоприводу |
RISDK_exec_ServoDrive_MinStepRotate | Выполняет поворот сервопривода на минимальный шаг |
RISDK_exec_ServoDrive_Turn | Выполняет поворот сервопривода на заданный угол с заданной угловой скоростью. Если угол положительный, поворот осуществляется по часовой стрелке, если отрицательный, то против часовой. |
RISDK_exec_ServoDrive_TurnByPulse | Абсолютный поворот. Угол задается через значение импульса |
RISDK_exec_ServoDrive_Rotate | Выполняет вращение сервопривода с заданной угловой скоростью до тех пор, пока не будет достигнут максимальный или минимальный угол сервопривода. |
RISDK_exec_ServoDrive_RotateWithRelativeSpeed | Выполняет вращение сервопривода с заданным процентом от максимальной скорости до тех пор, пока не будет достигнут максимальный или минимальный угол сервопривода |
RISDK_exec_ServoDrive_TurnWithRelativeSpeed | Выполняет поворот сервопривода на заданный угол с заданным процентом от максимальной скорости. Если угол положительный, поворот осуществляется по часовой стрелке, если отрицательный, то против часовой. |
RISDK_exec_ServoDrive_GetCurrentAngle | Возвращает текущий угол сервопривода |
RISDK_exec_ServoDrive_GetState | Получение состояния сервопривода |
RI_SDK_exec_ServoDrive_SetPositionToMidWorkingRange | Поворот сервопривода в середину рабочего диапазона |