В предыдущем разделе уже обсуждалось определение сервоприводов, здесь только повторим, что сервоприводом является любой тип механического привода, имеющий в составе датчик (положения, скорости, усилия и т.п.) и блок управления приводом, автоматически поддерживающий необходимые параметры на датчике и устройстве согласно заданному внешнему значению.
Сервоприводы постоянного вращения — это моторы, которые поддерживают скорость вращения вала в любом направлении без ограничений по углу поворота. Для управления мотором необходимо подавать особый сигнал PDM (Pulse Duration Modulation) — импульсы постоянной частоты и переменной ширины. Скорость вращения вала определяется шириной импульса. При поступлении с внешнего контроллера управляющего импульса начинка сервопривода генерирует свой сигнал мотору.
Использование ШИМ для вращения сервопривода
В сигнале PDM частота импульсов постоянна и равна 50 Гц, т. е. период подачи импульсов равен 20 мс. А вот ширина импульса изменяется, и именно от неё зависит направление и скорость вращения мотора. Принято считать, что рабочая ширина импульса лежит в пределах 544–2400 мкс.
Период импульсов | Ширина импульса | Положение сервопривода |
---|---|---|
20 мс | 544 мкс | Вал сервопривода вращается по часовой стрелке. |
20 мс | 1540 мкс | Вал сервопривода стоит на месте. |
20 мс | 2400 мкс | Вал сервопривода вращается против часовой стрелки. |
В разных приводах диапазон ширины импульсов и скорости поворота вала может отличатся от стандартного. Эти данные можно уточнить в характеристиках моделей.
Даже в рамках одной и той же модели сервопривода существует погрешность, допускаемая при производстве, которая приводит к тому, что рабочий диапазон длин импульсов отличается. Для точной работы каждый конкретный сервопривод должен быть откалиброван: путём экспериментов необходимо подобрать корректный диапазон, характерный именно для него.
Устройство
Конструкция современных сервоприводов довольно проста, но при этом весьма эффективна, так как позволяет обеспечить максимально точное управление движением. Сервопривод состоит из:
- двигателя постоянного тока
- шестерни редуктора
- выходного вала
- потенциометра
- платы управления, на которую подается управляющий сигнал
Двигатель и редуктор образуют привод. Редуктор используется для снижения скорости вращения двигателя, которую необходимо адаптировать для практического применения. К выходному валу редуктора крепится необходимая нагрузка. Это может быть качалка, вращающийся вал, тянущие или толкающие механизмы.
Для того, чтобы скорость вращения превратить в электрический сигнал, необходим датчик. Его функции в сервоприводе постоянного тока с успехом выполняет потенциометр. Он выдает аналоговый сигнал (как правило, от 0 до 10 В) с дискретностью, ограниченной АЦП (аналогово-цифровым преобразователем), на который поступает этот сигнал.
Самой важной деталью сервопривода, пожалуй, является электронная плата сервоусилителя, которая принимает и анализирует управляющие импульсы, соотносит их с данными потенциометра, отвечает за запуск и выключение двигателя.
Подключить серводвигатель можно с помощью трех проводников. По двум из них подается питание к электродвигателю, а третий служит для прохождения сигналов управления, приводящих вал в определенное положение.
- Сервопривод получает на вход значение управляющего параметра. В случае сервопривода вращения это направление и скорость вращения.
- Блок управления сравнивает это значение со значением на своём датчике.
- На основе результата сравнения привод производит некоторое действие: например, поворот, ускорение или замедление так, чтобы значение с внутреннего датчика стало как можно ближе к значению внешнего управляющего параметра.
Области применения
Как правило, сервоприводы постоянного тока используются в маломощных устройствах позиционирования. Классическая область их применения – любительская робототехника.
Сервоприводы непрерывного вращения используются для моделирования движения различных механизмов. На основе сервопривода можно собрать
Поддерживаемые модели и их характеристика
Внешний вид | Модель | Минимальный импульс по часовой стрелке, мкс(микросекунды) | Максимальный импульс по часовой стрелке, мкс(микросекунды) | Размер рабочего диапазона по часовой стрелке, мкс(микросекунды) | Минимальный импульс против часовой стрелки, мкс(микросекунды) | Максимальный импульс против часовой стрелки, мкс(микросекунды) | Размер рабочего диапазона против часовой стрелки, мкс(микросекунды) | Скорость поворота на 60° при 4.8 В (сек) | Скорость поворота на 60° при 6 В (сек) | Максимальная скорость при 4.8.V (градусов в секунду) | Максимальная скорость при 6V (градусов в секунду) | Рабочее напряжение (вольт) | Аналоговый / цифровой | Ссылки |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
mg996r | 415 | 1410 | 995 | 1540 | 2530 | 990 | 0,17 | 0,14 | 352,94 | 857,14 | 4,8 / 6 V | Цифровой | datasheet |
Скорость сервопривода измеряется интервалом времени, который требуется рычагу сервопривода, чтобы повернуться на 60°. Характеристика 0,1 с/60° означает, что сервопривод поворачивается на 60° за 0,1 с. Из неё несложно вычислить скорость в более привычной величине, оборотах в минуту, но так сложилось, что при описании сервоприводов чаще всего используют такую единицу.
Создание и инициализация
Для того, чтобы управлять сервоприводом вращения с помощью данной библиотеки необходимо создать и проинициализировать компонент по управлению сервоприводом.
Для этого необходимо последователь выполнить следующее:
- Подключить и проинициализировать библиотеку с помощью метода Risdk_InitSDK
- Создать компонент i2c коннектора с помощью метода Risdk_CreateComponent и проинициализировать его с помощью метода Risdk_connector_i2c_Init
- Открыть соединения по i2c коннектору с помощью метода Risdk_connector_i2c_Open
- Создать компонент ШИМ преобразователя методом Risdk_CreateComponent и проинициализировать его методом Risdk_sigmod_PWM_Init
- Методом Risdk_CreateComponent создать компонент управления сервоприводом вращения. В данный метод перым параметром необходимо указать тип компонента "servodrive_rotate"
- Проинициализировать компонент управления сервоприводом методом Risdk_exec_RServoDrive_Init
Ниже приведены примеры создания и инициализации компонента по управлнию сервоприводом для Golang и Python
Примеры создания и инициализации
Инициализация компонента управления сервоприводом на Golang
В данном примере осуществляется инициализация компонента по управлению сервоприводом. В полном примере описан полностью весь путь от подключения библиотеки до инициализации. Только после инициализации можно использовать остальные методы компонента
- Python
errTextC = c_char_p() # Текст ошибки. C type: char*
errCode = c_int
pin = 0 //пин к которому будет покдлючен сервопривод
rservo = c_int(0)
# Создание компонента сервопривода вращения модели mg996r
errCode = lib.RI_SDK_CreateModelComponent("executor".encode(), "servodrive_rotate".encode(), "mg996r".encode(), rservo, errTextC)
if errCode != 0:
return errCode, errTextC
# связываем сервопривод с ШИМ,передаем дескриптор сервопривода и ШИМ, d_pca - дескриптор ШИМ
errCode = lib.RI_SDK_LinkRServodriveToController(rservo, pwm, d_pca, errTextC)
if errCode != 0:
return errCode, errTextC
- C
int d_mg996r, errCode;
char errorText[1000];
int pin = 0; //пин к которому будет покдлючен сервопривод
//создание компонета сервопривода вращения
errCode = RI_SDK_CreateModelComponent("executor", "servodrive_rotate", "mg996r", &d_mg996r, errorText);
if (errCode != 0) {
printf("RI_SDK_CreateModelComponent errorText:%s\n", errorText);
return errCode;
}
//подключение сервопривода к контроллеру, d_pca - дескриптор ШИМ
errCode = RI_SDK_LinkRServodriveToController(d_mg996r, d_pca, pin, errorText);
if (errCode) {
printf("RI_SDK_LinkRServodriveToController errorText:%s\n", errorText);
return errCode;
}
- C++
int rservo, pwm, errCode;
char errorText[1000];
int pin = 0; //пин к которому будет покдлючен сервопривод
// Создание компонента сервопривода вращения модели mg90s
char servoGroup[] = "executor";
char servoDevice[] = "servodrive_rotate";
char servoModel[] = "mg996r";
errCode = RI_SDK_CreateModelComponent(servoGroup, servoDevice, servoModel, &rservo, errorText);
if (errCode != 0) {
printf("errorText:%s\n", errorText);
return errCode;
}
// Связывание ШИМ с сервоприводом
errCode = RI_SDK_LinkRServodriveToController(rservo, pwm, 0, errorText);
if (errCode != 0) {
printf("errorText:%s\n", errorText);
return errCode;
}
- Golang
var (
errorTextC [1000]C.char //текст ошибки. Передается как входной параметр,при возникновении ошибки в эту переменную будет записан текст ошибки
errCode C.int //код ошибки
d_mg996r C.int
pwm C.int
)
// создаем компонент сервопривода вращения с конкретной моделью как исполняемое устройство и получаем дескриптор сервопривода вращения
errCode = C.RI_SDK_CreateModelComponent(C.CString("executor"), C.CString("servodrive_rotate"), C.CString("mg996r"), d_mg996r, &errorTextC[0])
if errCode != 0 {
return fmt.Errorf("errorCode:%d - errorText:%s", errCode, C.GoString(&errorTextC[0]))
}
//связываем сервопривод с ШИМ,передаем дескриптор сервопривода и ШИМ, d_pca - дескриптор ШИМ
errCode = C.RI_SDK_LinkRServodriveToController(*d_mg996r, 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_mg996r int64 // дескриптор сервопривода вращения
pin int64 = 0 // пин к которому будет покдлючен сервопривод
)
// создаем компонент сервопривода вращения с конкретной моделью как исполняемое устройство и получаем дескриптор сервопривода вращения
d_mg996r, errorText, errCode, _ = client.RoboSdkApi.RI_SDK_CreateModelComponent("executor", "servodrive_rotate", "mg996r")
if errCode != 0 {
return fmt.Errorf("errorCode:%d - errorText:%s", errCode, errorText)
}
//связываем сервопривод с ШИМ,передаем дескрипторы сервопривода и ШИМ, d_pca - дескриптор ШИМ
errorText, errCode, _ = client.RoboSdkApi.RI_SDK_LinkRServodriveToController(d_mg996r, 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_mg996r = $ffi->new('int', 0); // Выделяем память на переменную с номером дескриптора
$pin=0; //пин к которому будет покдлючен сервопривод
// создаем компонент сервопривода вращения с конкретной моделью как исполняемое устройство и получаем дескриптор сервопривода вращения
$errCode = $ffi->RI_SDK_CreateModelComponent("executor", "servodrive_rotate", "mg996r", FFI::addr($d_mg996r), $errorText);
if ($errCode) {
return $errCode;
}
//связываем сервопривод с ШИМ,передаем дескриптор сервопривода и шим, d_pca - дескриптор ШИМ
$errCode = $ffi->RI_SDK_LinkRServodriveToController($d_mg996r->cdata, $d_pca->cdata, $pin, $errorText);
if ($errCode) {
return $errCode;
}
Название метода | Описание |
---|---|
RI_SDK_exec_RServoDrive_CustomDeviceInit | Инициализация кастомного сервопривода вращения |
RI_SDK_exec_RServoDrive_Stop | Прекращает подачу сигнала к сервоприводу вращения |
RI_SDK_exec_RServoDrive_GetState | Получение состояния сервопривода |
RI_SDK_exec_RServoDrive_RotateByPulse | Выполняет вращение сервопривода, заданное импульсом, до тех пор, пока не будет вызвана метод остановки или иная команда |
RI_SDK_exec_RServoDrive_RotateByPulseOverTime | Выполняет вращение сервопривода, заданное импульсом, до тех пор, пока не будет вызвана метод остановки, иная команда или не сработает заданный таймаут |
RI_SDK_exec_RServoDrive_RotateWithRelativeSpeed | Выполняет вращение сервопривода с заданным процентом от максимальной скорости до тех пор, пока не будет вызвана метод остановки или иная команда |
RI_SDK_exec_RServoDrive_RotateWithRelativeSpeedOverTime | Выполняет вращение сервопривода с заданным процентом от максимальной скорости до тех пор, пока не будет вызвана метод остановки, иная команда или не сработает заданный таймаут |