Программирование на Blockly
Документация по RoboIntellect SDK (RI SDK)
Функциональный RI SDK API исполнительных устройств

Исполнительное устройство Сервопривод

Сервопри́вод (от лат. servus — слуга, помощник), или следя́щий при́вод — механический привод с автоматической коррекцией состояния через внутреннюю отрицательную обратную связь, в соответствии с параметрами, заданными извне. Сервоприводом является любой тип механического привода (устройства, рабочего органа), имеющий в составе датчик (положения, скорости, усилия и т. п.) и блок управления приводом (электронную схему или механическую систему тяг), автоматически поддерживающий необходимые параметры на датчике (и, соответственно, на устройстве) согласно заданному внешнему значению (положению ручки управления или численному значению от других систем). Проще говоря, сервопривод является «автоматическим точным исполнителем» — получая на вход значение управляющего параметра (в режиме реального времени), он «своими силами» (основываясь на показаниях датчика) стремится создать и поддерживать это значение на выходе исполнительного элемента.

Устройство #

Конструкция современных сервоприводов довольно проста, но при этом весьма эффективна, так как позволяет обеспечить максимально точное управление движением. Сервопривод состоит из:

  • двигателя постоянного тока
  • шестерни редуктора
  • выходного вала
  • потенциометра
  • платы управления, на которую подается управляющий сигнал

This is an image

Двигатель и редуктор образуют привод. Редуктор используется для снижения скорости вращения двигателя, которую необходимо адаптировать для практического применения. К выходному валу редуктора крепится необходимая нагрузка. Это может быть качалка, вращающийся вал, тянущие или толкающие механизмы.

Для того, чтобы угол поворота превратить в электрический сигнал, необходим датчик. Его функции в сервоприводе постоянного тока с успехом выполняет потенциометр. Он выдает аналоговый сигнал (как правило, от 0 до 10 В) с дискретностью, ограниченной АЦП (аналогово-цифровым преобразователем), на который поступает этот сигнал.

Самой важной деталью сервопривода, пожалуй, является электронная плата сервоусилителя, которая принимает и анализирует управляющие импульсы, соотносит их с данными потенциометра, отвечает за запуск и выключение двигателя.

Подключить серводвигатель можно с помощью трех проводников. По двум из них подается питание к электродвигателю, а третий служит для прохождения сигналов управления, приводящих вал в определенное положение.

Широтно-импульсная модуляция — ШИМ #

Разберем понятие ШИМ на примере управления скоростью вращения двигателя постоянного тока. Поставим своей целью запустить мотор на 50% от его максимальной скорости. Пусть наш двигатель идеальный и чтобы достичь заданной скорости, нам нужно в единицу времени передавать на мотор в два раза меньше мощности. Как это сделать, не меняя источник питания?

Проведем мысленный эксперимент (а кто-то может и натуральный — ничего сложного). Возьмём мотор постоянного тока с массивным маховиком, закрепленным на валу (таким маховиком может служить колесо). Подадим питание от аккумулятора и мотор начнет набирать обороты. Через какое-то время, мотор достигнет номинальной мощности, а его ротор максимальной скорости вращения. Отключим питание, и мотор постепенно начнет замедляться вплоть до полной остановки.

Следующий опыт. Снова включим мотор, и когда его скорость достигнет половины от максимальной — выключим. Заметив, что скорость падает — снова включим. И так далее. Включая и выключая питание мотора, мы заставим ротор вращаться со скоростью, близкой к половине от максимальной!

Разумеется, в силу человеческой медлительности, мотор будет удерживать заданную скорость с некоторой погрешностью. Другими словами, скорость будет «плавать» вокруг заданного значения. Чтобы минимизировать эти отклонения, нам потребуется увеличить частоту переключений. Тут уже не обойтись без автоматики.

А как заставить мотор вращаться медленнее или быстрее? Количество переданной мотору энергии будет зависеть от отношения времени когда мотор включен — tвкл к времени когда он выключен — tвыкл.

Image

Так, для передачи мотору 50% мощности, tвкл будет равно tвыкл. Такой случай как раз изображен на графике. Чтобы мотор вращался еще медленнее, скажем с мощностью 25% от номинальной, придется время включения мотора уменьшить до этих самых 25% от общего периода управления T.

Image

Таким образом, имея возможность менять ширину импульсов, мы можем достаточно точно управлять скоростью вращения мотора.

Собственно, рассмотренный способ управления мощностью и называется широтно-импульсной модуляцией сигнала, а сокращённо — ШИМ. Теперь рассмотрим параметры которые характеризуют ШИМ сигнал и которые следует учитывать при написании программ для микроконтроллеров.

Коэффициент заполнения (duty cycle) #

Начнем с самого главного параметра — коэффициента заполнения D (он же duty cycle). Этот коэффициент равен отношению периода ШИМ сигнала к ширине импульса:

$$ D = T / t_{вкл} $$

Пример ШИМ сигнала для разных значений D:

Image

Чем больше 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 задач хватает.

Использование ШИМ для вращения сервопривода #

Вращение выходного вала редуктора, связанного шестернями с сервоприводом, осуществляется путем запуска и остановки электродвигателя. Сам редуктор необходим для регулировки числа оборотов. Выходной вал может быть соединен с механизмами или устройствами, которыми необходимо управлять. Положение вала контролируется с помощью датчика обратной связи, способного преобразовывать угол поворота в электрические сигналы и на котором построен принцип работы всего устройства.

Image

Этот датчик известен также, под названием энкодера или потенциометра. При повороте бегунка, его сопротивление будет изменяться. Изменения сопротивления находится в прямой пропорциональной зависимости с углом поворота энкодера. Данный принцип работы позволяет устанавливать и фиксировать механизмы в определенном положении.

Дополнительно каждый серводвигатель имеет электронную плату, обрабатывающую внешние сигналы, поступающие от потенциометра. Далее выполняется сравнение параметров, по результатам которого производится запуск или остановка электродвигателя. Следовательно, с помощью электронной платы поддерживается отрицательная обратная связь.

Принцип действия устройств основан на использовании импульсного сигнала, который имеет три важные характеристики – частоту повторения, минимальную и максимальную продолжительность. Именно продолжительность импульса определяет угол поворота двигателя.

Импульсные сигналы, получаемые сервоприводом, имеют стандартную частоту, а вот их продолжительность в зависимости от модели может составлять от 0,8 до 2,2 мс. Параллельно с поступлением управляющего импульса активируется работа генератора опорного импульса, который связан с потенциометром. Тот, в свою очередь, механически сопряжен с выходным валом и отвечает за корректирование его положения.

Электронная схема анализирует импульсы с учетом длительности и на основе разностной величины определяет разницу между ожидаемым (заданным) положением вала и реальным (измеренным при помощи потенциометра). Затем производится корректировка путем подачи напряжения на питание двигателя.

Если продолжительность опорного и управляющего импульсов совпадает, наступает так называемый нулевой момент. В это время двигатель сервопривода не работает, вал привода находится в исходном (неподвижном) положении.

При увеличении длительности управляющего импульса плата фиксирует разбежку показателей, двигатель получает напряжение и приходит в движение. В свою очередь, редуктор начинает воздействовать на выходной вал, который поворачивается таким образом, чтобы достигнуть увеличения продолжительности опорного импульса. Как только он сравняется с управляющим импульсом, двигатель прекратит свою работу.

При уменьшении длительности управляющего импульса происходит все то же самое, только с точностью до наоборот, так как двигатель начинает вращаться в обратную сторону. Как только импульсы сравнялись, двигатель останавливается.

Области применения #

Как правило, сервоприводы постоянного тока используются в маломощных устройствах позиционирования. Классическая область их применения – любительская робототехника.

Поддерживаемые модели и их характеристика #

Внешний вид Модель Минимальный импульс, мкс(микросекунды) Максимальный импульс, мкс(микросекунды) Размер рабочего диапазона, мкс(микросекунды) Импульс для поворота на 180 градусов Импульс для поворота на 1 градус, мкс(микросекунды) Максимальный угол поворота (градус) Скорость поворота на 60° при 4.8 В (сек) Скорость поворота на 60° при 6 В (сек) Максимальная скорость при 4.8.V (градусов в секунду) Максимальная скорость при 6V (градусов в секунду) Рабочее напряжение (вольт) Аналоговый / цифровой Ссылки Примечание
Image mg90s 267 2722 2455 2074 11,52 213,06 0,1 0,08 600 750 4,8 / 6 V Аналоговый datasheet Есть другие режимы работы за рамками крайних положений
Image a0090 500 2400 1900 1700 9,44 201,17 0,09 0,07 666,66 428,57 4,8 / 6 V Цифровой datasheet Запоминает последнее состояние в рамках рабочего диапазона
Image mg996 350 2550 2200 1800 10 220 0,17 0,14 352,94 857,14 4,8 / 6 V Цифровой datasheet На одном сервоприводе минимальный импульс был 17500
Image Corona DS929MG 500 2450 1950 1800 10 195 0,11 - 545,45 - 4,8 / 6 V Цифровой datasheet Жужит и нагревается при крайних положениях
Image Corona SB-9039 800 2100 1300 1800 10 130 0,14 0,13 428,57 461,53 4,8 V Цифровой datasheet -
Image Corona DS843MG 800 2200 1400 1600 8,88 157,5 0,12 0,1 500 600 4,8 / 6 V Цифровой datasheet Запоминает последнее состояние в рамках рабочего диапазона
Image 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 Поворот сервопривода в середину рабочего диапазона

187 просмотров0 комментариев

Комментарии (0)

Для участия в обсуждении Вы должны быть авторизованным пользователем
Разделы
Программирование на Blockly
Документация по RoboIntellect SDK (RI SDK)
Функциональный RI SDK API исполнительных устройств

Навигация

ВойтиРегистрация