В предыдущем разделе уже обсуждалось определение сервоприводов, здесь только повторим, что сервоприводом является любой тип механического привода, имеющий в составе датчик (положения, скорости, усилия и т.п.) и блок управления приводом, автоматически поддерживающий необходимые параметры на датчике и устройстве согласно заданному внешнему значению.
Сервоприводы постоянного вращения — это моторы, которые поддерживают скорость вращения вала в любом направлении без ограничений по углу поворота. Для управления мотором необходимо подавать особый сигнал 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 | Выполняет вращение сервопривода с заданным процентом от максимальной скорости до тех пор, пока не будет вызвана метод остановки, иная команда или не сработает заданный таймаут |