Перейти к основному содержимому

RI_SDK_exec_RServoDrive_RotateByPulse

Информация

RISDK - библиотека Robo Intellect Software Development Kit
exec - группа исполнителей
RServoDrive - подгруппа сервоприводов вращения
RotateByPulse - название метода вращения сервопривода по импульсу

Сигнатура функции:

RI_SDK_exec_RServoDrive_RotateByPulse(descriptor, pulse, errorText):errorCode

Описание метода

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

Дает команду сервоприводу с дескриптором descriptor вращаться до тех пор, пока не будет вызвана функция остановки. Направление и скорость вращения задается параметром pulse, соответствующее значению управляющего импульса. Параметр async устанавливает режим выполнения команды - асинхронный или синхронный.

Размер рабочего диапазона для mg996r - по часовой стрелке 1020 мкс (от 400 до 1420 мкс), против часовой стрелки 1020 мкс (от 1540 до 2560 мкс). Максимальная скорость при вращении по часовой стрелке достигается при минимальном значении из рабочего диапазона, для вращения против часовой наоборот, минимальное значение из рабочего диапазона вращает сервопривод с минимальной скоростью. Для управляющего сигнала между диапазонами вращение не происходит.

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

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

Параметры и возвращаемые значения

ПараметрТип для Shared objectТип для Golang gRPCОписание
descriptorint (тип C)int64Дескриптор сервопривода
pulseint (тип C)int64Значение импульса (мкс)
asyncbool (тип C)boolПризнак асинхронного выполнения команды
errorTextchar[1000] (тип C)stringТекст ошибки (передается как параметр, если происходит ошибка метод записывает в этот параметр текст ошибки)
errorCodeint (тип C)int64Код ошибки

Примеры

Пример №1 - Вращение сервопривода против часовой стрелки

В данном примере осуществляется вращение сервопривода против часовой стрелки с максимальной скоростью, соответствующее максимальному значению управляющего импульса для поворота против часовой стрелки (2520 микросекунд).

# Вращение сервопривода против часовой стрелки в асинхронном режиме
errCode = lib.RI_SDK_exec_RServoDrive_RotateByPulse(rservo, 2520, True, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Остановим выполнение программы на 3 секунды чтобы увидеть вращение
time.sleep(3)
# Продолжим выполнение программы и удаление библиотеки остановит вращение
Полный текст примера

from ctypes.util import find_library
import platform
import sys
import time
from ctypes import *

# Подключаем внешнюю библиотеку для работы с SDK
platform = platform.system()
if platform == "Windows":
libName = "librisdk.dll"
if platform == "Linux":
libName = "librisdk.so"

pathLib = find_library(libName)
lib = cdll.LoadLibrary(pathLib)


# Указываем типы аргументов для функций библиотеки RI_SDK
lib.RI_SDK_InitSDK.argtypes = [c_int, c_char_p]
lib.RI_SDK_CreateModelComponent.argtypes = [c_char_p, c_char_p, c_char_p, POINTER(c_int), c_char_p]
lib.RI_SDK_LinkPWMToController.argtypes = [c_int, c_int, c_uint8, c_char_p]
lib.RI_SDK_LinkRServodriveToController.argtypes = [c_int, c_int, c_int, c_char_p]
lib.RI_SDK_DestroySDK.argtypes = [c_bool, c_char_p]
lib.RI_SDK_exec_RServoDrive_RotateByPulse.argtypes = [c_int, c_int, c_bool, c_char_p]

def main():
errTextC = create_string_buffer(1000) # Текст ошибки. C type: char*
i2c = c_int()
pwm = c_int()
rservo = c_int()

# Инициализация библиотеки RI SDK с уровнем логирования 3
errCode = lib.RI_SDK_InitSDK(3, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Создание компонента i2c адаптера модели ch341
errCode = lib.RI_SDK_CreateModelComponent("connector".encode(), "i2c_adapter".encode(), "ch341".encode(), i2c, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("i2c: ", i2c.value)

# Создание компонента ШИМ модели pca9685
errCode = lib.RI_SDK_CreateModelComponent("connector".encode(), "pwm".encode(), "pca9685".encode(), pwm, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("pwm: ", pwm.value)

# Создание компонента сервопривода модели mg996r
errCode = lib.RI_SDK_CreateModelComponent("executor".encode(), "servodrive_rotate".encode(), "mg996r".encode(), rservo, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("servodrive rotate: ", rservo.value)

# Связывание i2c с ШИМ
errCode = lib.RI_SDK_LinkPWMToController(pwm, i2c, 0x40, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Связывание ШИМ с сервоприводом
errCode = lib.RI_SDK_LinkRServodriveToController(rservo, pwm, 0, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Вращение сервопривода против часовой стрелки в асинхронном режиме
errCode = lib.RI_SDK_exec_RServoDrive_RotateByPulse(rservo, 2520, True, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

# Остановим выполнение программы на 3 секунды чтобы увидеть вращение
time.sleep(3)
# Продолжим выполнение программы и удаление библиотеки остановит вращение

# Удаление библиотеки со всеми компонентами
errCode = lib.RI_SDK_DestroySDK(True, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("Success")

main()