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

RI_SDK_sigmod_PWM_WriteRegBytes

Информация

RI_SDK - библиотека Robo Intellect Software Development Kit
sigmod - название группы устройств коннекторов
PWM - название устройства ШИМ
WriteRegBytes - название метода записи массива байт по указанному регистру

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

RI_SDK_sigmod_PWM_WriteRegBytes(descriptor, reg, buf, len, wroteBytesLen, errorText):errorCode

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

Запись массива байт в регистр.

Производит запись len байт из массива buf по регистру reg для ШИМ модулятора с дескриптором descriptor.

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

ПараметрТип для Shared objectТип для Golang gRPCОписание
descriptorint (тип C)int64Дескриптор компонента, в котором будет производиться запись
reguint8_t (тип C)uint8Регистр, по которому будет производиться запись
buf*long long unsigned[len] (тип C)[]byteУказатель на массив байт для записи
lenint (тип C)-Длина массива buf
wroteBytesLen*int (тип C)int64Указатель на количество записанных байтов
errorTextchar[1000] (тип C)stringТекст ошибки (передается как параметр, если происходит ошибка метод записывает в этот параметр текст ошибки)
errorCodeint (тип C)int64Код ошибки

Примеры

Пример №1 - Запись массива байт buf на ШИМ на 10 регистр

Результатом выполнения данного примера будет поворот сервопривода, который подключен в 1 порт (или 10 регистр), в положение 180 градусов.

# Запись массива байт buf на ШИМ по регистру 10 
# Перед записью конвертируем массив байт buf в тип c_ulonglong
b = c_ulonglong(int.from_bytes(buf, "little"))
errCode = lib.RI_SDK_sigmod_PWM_WriteRegBytes(pwm, 0x0a, b, len(buf), wroteBytesLen, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

Полный текст примера



from ctypes.util import find_library
import platform
import sys
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_DestroySDK.argtypes = [c_bool, c_char_p]
lib.RI_SDK_sigmod_PWM_WriteRegBytes.argtypes = [c_int, c_uint8, POINTER(c_ulonglong), c_int, POINTER(c_int), c_char_p]

def main():
errTextC = create_string_buffer(1000) # Текст ошибки. C type: char*
i2c = c_int()
pwm = c_int()
buf = bytes([0,0,244,1])
wroteBytesLen = 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)

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

# Запись массива байт buf на ШИМ по регистру 10
# Перед записью конвертируем массив байт buf в тип c_ulonglong
b = c_ulonglong(int.from_bytes(buf, "little"))
errCode = lib.RI_SDK_sigmod_PWM_WriteRegBytes(pwm, 0x0a, b, len(buf), wroteBytesLen, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("wroteBytes: ", wroteBytesLen.value)

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

print("Success")

main()



Пример №2 - Установка спящего режима для ШИМ (Sleep mode)

Согласно спецификации для установки спящего режима (Sleep mode) необходимо подать значение 1 на 0 регистр (0x00). После выполнения данного примера последующие программы не будут приводить к движению сервоприводы.

# Запись массива байт buf на ШИМ по регистру 0
# Перед записью конвертируем массив байт buf в тип c_ulonglong
b = c_ulonglong(int.from_bytes(buf, "little"))
errCode = lib.RI_SDK_sigmod_PWM_WriteRegBytes(pwm, 0x00, b, len(buf), wroteBytesLen, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

Полный текст примера



import sys
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_DestroySDK.argtypes = [c_bool, c_char_p]
lib.RI_SDK_sigmod_PWM_WriteRegBytes.argtypes = [c_int, c_uint8, POINTER(c_ulonglong), c_int, POINTER(c_int), c_char_p]

def main():
errTextC = create_string_buffer(1000) # Текст ошибки. C type: char*
i2c = c_int()
pwm = c_int()
buf = bytes([16])
wroteBytesLen = 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)

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

# Запись массива байт buf на ШИМ по регистру 0
# Перед записью конвертируем массив байт buf в тип c_ulonglong
b = c_ulonglong(int.from_bytes(buf, "little"))
errCode = lib.RI_SDK_sigmod_PWM_WriteRegBytes(pwm, 0x00, b, len(buf), wroteBytesLen, errTextC)
if errCode != 0:
print(errCode, errTextC.raw.decode())
sys.exit(2)

print("wroteBytes: ", wroteBytesLen.value)

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

print("Success")

main()