Skip to content

Bus Servo Python SDK Development Guide

版本 GitHub 开发资源包
v1.2026.0512 GitHub 点击下载

1. Overview

This SDK is developed based on the UART/RS485 Communication Protocol for Fashion Star bus servo. It provides Python APIs and supports the full range of servo models.

2. Preparation

2.1 Physical Wiring

Complete the hardware connection between the servo and the computer in the following order:

  1. Connect the servo to the adapter board with a data cable.
  2. Connect the external power supply for the servo.
  3. Connect the adapter board to the computer with a USB cable.

Physical Wiring

Warning

  • The adapter board input voltage must match the power input range of the servo. Otherwise, voltage protection will be triggered and the device cannot operate normally.
  • Please download and install the USB-to-TTL module driver. Driver mirror: https://file.wch.cn/download/file?id=5.

2.2 Bus Servo Configuration Software

2.3 Installation

pip install fashionstar-uart-sdk

3. Create a Bus Servo Manager

  • In normal use, import the following dependencies first:
import time
import serial
import fashionstar_uart_sdk as uservo
  • Then create a serial port object and specify the related parameters:
SERVO_PORT_NAME =  '/dev/ttyUSB0'  
SERVO_BAUDRATE = 115200 
SERVO_ID = 0  # servo id

# uart init
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,parity=serial.PARITY_NONE, stopbits=1,bytesize=8,timeout=0)
control = uservo.UartServoManager(uart)

4. Servo Communication Check

4.1 API - ping

Call the ping() function of servo to perform servo communication detection and determine whether the servo is online.

Function Prototype

def ping(self, servo_id:int):

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • is_online: whether the Servo is online

5. Servo Damping Mode

5.1 API - set_damping

Set the servo to damping mode.

Function Prototype

def set_damping(self, servo_id, power=0):

Input Parameters

  • servo_id: Servo ID
  • power: Servo power, in mW

Output Parameters

  • None

5.2 Example Source Code

'''
伺服总线舵机
> Python SDK 舵机阻尼模式 <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2023/03/13
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
sys.path.append("../../src")
# 导入依赖
import time
import serial
from uservo import UartServoManager

# 参数配置
# 角度定义
SERVO_PORT_NAME =  'COM7' # 舵机串口号
SERVO_BAUDRATE = 115200 # 舵机的波特率
SERVO_ID = 0  # 舵机的ID号

# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart)

power = 500 # 阻尼模式下的功率, 单位mW
uservo.set_damping(SERVO_ID, power)

6. Servo Angle Query

6.1 API - query_servo_angle

Function Prototype

def query_servo_angle(self, servo_id):

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • angle: Servo angle (single-turn / multi-turn)

Note

  • Whether the returned angle is in multi-turn mode or single-turn mode depends on whether the last angle command used to control the servo was single-turn or multi-turn. The default is single-turn.
  • To manually specify multi-turn or single-turn query, set uservo.servos[servo_id].is_mturn before querying:
    • is_mturn=True: return the multi-turn angle
    • is_mturn=False: return the single-turn angle

6.2 Example Source Code

Set the servo to damping mode. Rotate the servo and print the current angle every 1s.

example/query_servo_angle.py

'''
伺服总线舵机
> Python SDK舵机角度查询 Example <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2023/03/13
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
sys.path.append("../../src")
# 导入依赖
import time
import serial
from uservo import UartServoManager

# 参数配置
# 角度定义
SERVO_PORT_NAME =  'COM7' # 舵机串口号
SERVO_BAUDRATE = 115200 # 舵机的波特率
SERVO_ID = 0  # 舵机的ID号

# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart)

# 设置舵机为阻尼模式
uservo.set_damping(SERVO_ID, 200)

# 舵机角度查询
while True:
    angle = uservo.query_servo_angle(SERVO_ID)
    print("当前舵机角度: {:4.1f} °".format(angle), end='\r')
    time.sleep(1)

7. Set Servo Angle

7.1 API - set_servo_angle

Set the servo angle. This API includes six servo angle control modes and calls different commands through different input parameters.

Function Prototype

def set_servo_angle(self, servo_id:int, angle:float, is_mturn:bool=False, interval:float=None, velocity:float=None, t_acc:int=20, t_dec:int=20,  power:int=0, mean_dps:float=100.0):

Input Parameters

  • servo_id: ID of the Servo

  • angle: target angle (single-turn control range: [-180°, 180°]; multi-turn control range: [-368,640.0°, 368,640.0°])

  • is_mturn: whether multi-turn mode is used
  • interval: interval, in ms
  • velocity: target speed of the Servo, in dps
  • t_acc: acceleration time during startup, in ms
  • t_dec: deceleration time when approaching the target, in ms
  • power: power limit, in mW
  • mean_dps: average speed, in dps, used to estimate interval

Output Parameters

  • None

7.2 API - wait

Wait for all servo to reach the target angle.

Function Prototype

def wait(self, timeout=None):

Input Parameters

  • timeout: blocking wait timeout threshold, in ms

Output Parameters

  • None

7.3 Example Source Code

'''
伺服总线舵机
> 设置舵机角度 <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2023/03/13
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
sys.path.append("../../src")
# 导入依赖
import time
import struct
import serial
from uservo import UartServoManager

# 参数配置
# 角度定义
SERVO_PORT_NAME =  'COM6' # 舵机串口号
SERVO_BAUDRATE = 115200 # 舵机的波特率
SERVO_ID = 0  # 舵机的ID号

# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart, is_debug=True)

print("[单圈模式]设置舵机角度为90.0°")
uservo.set_servo_angle(SERVO_ID, 90.0, interval=0) # 设置舵机角度 极速模式
uservo.wait() # 等待舵机静止
print("-> {}".format(uservo.query_servo_angle(SERVO_ID)))

print("[单圈模式]设置舵机角度为-80.0°, 周期1000ms")
uservo.set_servo_angle(SERVO_ID, -80.0, interval=1000) # 设置舵机角度(指定周期 单位ms)
uservo.wait() # 等待舵机静止
print("-> {}".format(uservo.query_servo_angle(SERVO_ID)))

print("[单圈模式]设置舵机角度为70.0°, 设置转速为200 °/s, 加速时间100ms, 减速时间100ms")
uservo.set_servo_angle(SERVO_ID, 70.0, velocity=200.0, t_acc=100, t_dec=100) # 设置舵机角度(指定转速 单位°/s)
uservo.wait() # 等待舵机静止
print("-> {}".format(uservo.query_servo_angle(SERVO_ID)))


print("[单圈模式]设置舵机角度为-90.0°, 添加功率限制")
uservo.set_servo_angle(SERVO_ID, -90.0, power=400) # 设置舵机角度(指定功率 单位mW)
uservo.wait() # 等待舵机静止

#########################################################################################

print("[多圈模式]设置舵机角度为900.0°, 周期1000ms")
uservo.set_servo_angle(SERVO_ID, 900.0, interval=1000, is_mturn=True) # 设置舵机角度(指定周期 单位ms)
uservo.wait() # 等待舵机静止
print("-> {}".format(uservo.query_servo_angle(SERVO_ID)))

print("[多圈模式]设置舵机角度为-900.0°, 设置转速为200 °/s")
uservo.set_servo_angle(SERVO_ID, -900.0, velocity=200.0, t_acc=100, t_dec=100, is_mturn=True) # 设置舵机角度(指定转速 单位°/s) dps: degree per second
uservo.wait() # 等待舵机静止
print("-> {}".format(uservo.query_servo_angle(SERVO_ID)))

print("[多圈模式]设置舵机角度为-850.0°, 添加功率限制")
uservo.set_servo_angle(SERVO_ID, -850.0, power=400, is_mturn=True) # 设置舵机角度(指定功率 单位mW)
uservo.wait() # 等待舵机静止
print("-> {}".format(uservo.query_servo_angle(SERVO_ID)))

8. Clear Multi-Turn Count

This API is used to clear the multi-turn count and must be used when torque is released.

Function Prototype

def reset_multi_turn_angle(self, servo_id:int):

Input Parameters

  • servo_id: ID of the Servo

Output Parameters

  • None

9. User-Defined Parameter Modification

Note

Notes: To modify user-defined parameters, it is recommended to operate in the PC configuration software, which is more convenient and intuitive.

9.1 API - reset_user_data

Reset the user data table and restore default values.

Function Prototype

def reset_user_data(self, servo_id):

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • None

9.2 API - read_data

Read data.

Function Prototype

def read_data(self, servo_id, address):

Input Parameters

  • servo_id: Servo ID
  • address: memory table

Output Parameters

  • content: binary data stream of the value

9.3 API - write_data

Write data.

Function Prototype

def write_data(self, servo_id, address, content):

Input Parameters

  • servo_id: Servo ID
  • address: memory table
  • content: binary data stream of the value

Output Parameters

  • None

9.4 Example Source Code - Reset User Data Table

example/reset_user_data.py

'''
伺服总线舵机
> 内存表数据重置 <

注意事项: 重置内存表这个指令比较特殊, 舵机ID也会被重置为0
因此测试该指令的时候, 最好只接一颗舵机。
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2023/03/13
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
sys.path.append("../../src")
# 导入依赖
import time
import struct
import serial
from uservo import UartServoManager

# 参数配置
# 角度定义
SERVO_PORT_NAME =  'COM7' # 舵机串口号
SERVO_BAUDRATE = 115200 # 舵机的波特率
SERVO_ID = 0  # 舵机的ID号

# 数据表定义
ADDRESS_SOFTSTART = 49 # 上电缓启动地址位
SOFTSTART_OPEN = 1 # 上电缓启动-开启
SOFTSTART_CLOSE = 0 # 上电缓启动-关闭

# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart, is_debug=True)
# 重置用户数据
uservo.reset_user_data(SERVO_ID)


# 舵机扫描
print("开始进行舵机扫描")
uservo.scan_servo()
servo_list = list(uservo.servos.keys())
print("舵机扫描结束, 舵机列表: {}".format(servo_list))

if SERVO_ID not in servo_list:
    print("指定的SERVO_ID无效, 请修改舵机ID列表")
    exit(-1)

print("重置舵机内存表: 舵机ID = {}".format(SERVO_ID))
uservo.reset_user_data(SERVO_ID)

print("重新进行舵机扫描")
uservo.scan_servo()
servo_list = list(uservo.servos.keys())
print("舵机扫描结束, 舵机列表: {}".format(servo_list))

9.5 Example Source Code - Read Memory Table

example/read_data.py

'''
伺服总线舵机
> 内存表数据读取 <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2023/03/13
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
sys.path.append("../../src")
# 导入依赖
import time
import struct
import serial
from uservo import UartServoManager

# 参数配置
# 角度定义
SERVO_PORT_NAME =  'COM7' # 舵机串口号
SERVO_BAUDRATE = 115200 # 舵机的波特率
SERVO_ID = 0  # 舵机的ID号
# 数据表定义
ADDRESS_VOLTAGE = 1 # 总线电压值的地址

# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart)

# 内存表读取
# 注: 因为每个数据位数据格式各不相同
# 因此读取得到的是字节流
voltage_bytes = uservo.read_data(SERVO_ID, ADDRESS_VOLTAGE)
# 数据解析
# 电压的数据格式为uint16_t,单位: mV
# 关于struct的用法,请参阅官方手册: https://docs.python.org/3/library/struct.html
voltage = struct.unpack('<H', voltage_bytes)

print("总线电压 {} mV".format(voltage))

9.6 Example Source Code - Write Memory Table

example/write_data.py

'''
伺服总线舵机
> 内存表数据写入 <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2023/03/13
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
sys.path.append("../../src")
# 导入依赖
import time
import struct
import serial
from uservo import UartServoManager

# 参数配置
# 角度定义
SERVO_PORT_NAME =  'COM7' # 舵机串口号
SERVO_BAUDRATE = 115200 # 舵机的波特率
SERVO_ID = 0  # 舵机的ID号

# 数据表定义
ADDRESS_SOFTSTART = 49 # 上电缓启动地址位
SOFTSTART_OPEN = 1 # 上电缓启动-开启
SOFTSTART_CLOSE = 0 # 上电缓启动-关闭

# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart)

# 内存表写入
# 注: 在写入之前,需要查阅手册确保该数据位可写
# 缓启动数据类型 uint8_t, 首先构造数据位
softstart_bytes = struct.pack('<B', SOFTSTART_OPEN)
# 将数据写入内存表
ret = uservo.write_data(SERVO_ID, ADDRESS_SOFTSTART, softstart_bytes)
# 打印日志
print("缓启动数据写入是否成功: {}".format(ret))

10. System Status Query

10.1 API - query_voltage

Query the current voltage.

Function Prototype

def query_voltage(self, servo_id)

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • voltage: voltage, in V

10.2 API - query_current

Query the current.

Function Prototype

def query_current(self, servo_id):

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • power: Servo current, in A

10.3 API - query_power

Query the current power.

Function Prototype

def query_power(self, servo_id)

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • power: Servo power, in W

10.4 API - query_temperature

Query the current temperature of the servo.

Function Prototype

def query_temperature(self, servo_id)

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • temperature: temperature, ADC value

10.5 API - query_status

Query the current operating status of the servo.

#  舵机工作状态标志位
#  BIT[0] - 执行指令置1,执行完成后清零。
#  BIT[1] - 执行指令错误置1,在下次正确执行后清零。
#  BIT[2] - 堵转错误置1,解除堵转后清零。
#  BIT[3] - 电压过高置1,电压恢复正常后清零。
#  BIT[4] - 电压过低置1,电压恢复正常后清零。
#  BIT[5] - 电流错误置1,电流恢复正常后清零。
#  BIT[6] - 功率错误置1,功率恢复正常后清零。
#  BIT[7] - 温度错误置1,温度恢复正常后清零。

Function Prototype

def query_status(self, servo_id)

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • status: 8-bit operating status flags

10.6 Example Source Code

example/servo_status.py

'''
伺服总线舵机
> 读取舵机的状态信息 <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2023/03/13
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
import os
sys.path.append("../../src")
# sys.path.append(os.getcwd()+"\\src")

# 导入依赖
import time
import serial
from uservo import UartServoManager

# 参数配置
# 角度定义
SERVO_PORT_NAME =  'COM3' # 舵机串口号
SERVO_BAUDRATE = 115200 # 舵机的波特率
SERVO_ID = 0  # 舵机的ID号

# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart)

def log_servo_status():
    '''打印舵机状态'''
    # 读取温度
    voltage = uservo.query_voltage(SERVO_ID)
    # 读取电流
    current = uservo.query_current(SERVO_ID)
    # 读取功率
    power = uservo.query_power(SERVO_ID)
    # 读取温度
    temp = uservo.query_temperature(SERVO_ID)
    #  舵机工作状态标志位
    #  BIT[0] - 执行指令置1,执行完成后清零。
    #  BIT[1] - 执行指令错误置1,在下次正确执行后清零。
    #  BIT[2] - 堵转错误置1,解除堵转后清零。
    #  BIT[3] - 电压过高置1,电压恢复正常后清零。
    #  BIT[4] - 电压过低置1,电压恢复正常后清零。
    #  BIT[5] - 电流错误置1,电流恢复正常后清零。
    #  BIT[6] - 功率错误置1,功率恢复正常后清零。
    #  BIT[7] - 温度错误置1,温度恢复正常后清零。
    status = uservo.query_status(SERVO_ID)
    print("Voltage: {:4.1f}V; Current: {:4.1f}A; Power: {:4.1f}W; T: {:2.0f}; Status: {:08b}".format(voltage, current, power, temp,status), end='\r')

while True:
    uservo.set_servo_angle(SERVO_ID, 90)
    while not uservo.is_stop():
        log_servo_status()
        time.sleep(0.1)

    time.sleep(1)

    uservo.set_servo_angle(SERVO_ID, -90)
    while not uservo.is_stop():
        log_servo_status()
        time.sleep(0.1)

    time.sleep(1)

11. Servo Torque Release

Warning

  • In torque-release state, the servo still responds to commands.

11.1 API - disable_torque

Function Prototype

def disable_torque(self, servo_id:int):

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • None

12. Origin Setting

Warning

  • This applies only to servo using an absolute encoder (model suffix -M).
  • This API must be used when torque is released.

12.1 API - set_origin_point

Function Prototype

uservo.set_origin_point(self, servo_id:int):

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • None

12.2 Example Source Code

example/set_origin_point.py

'''
总线伺服舵机
> Python SDK设置舵机原点 Example <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2024/08/20
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import os
import sys
sys.path.append(os.getcwd()+"\\src")
# sys.path.append("../../src")
# 导入依赖
import time
import serial
from uservo import UartServoManager

# 参数配置
# 角度定义
SERVO_PORT_NAME =  'COM3' # 舵机串口号
SERVO_BAUDRATE = 115200 # 舵机的波特率
SERVO_ID = 0  # 舵机的ID号

# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart)

angle = uservo.query_servo_angle(SERVO_ID)

print("当前舵机角度: {:4.1f} °".format(angle), end='\n')

uservo.disable_torque(SERVO_ID)

uservo.set_origin_point(SERVO_ID)

time.sleep(1)

angle = uservo.query_servo_angle(SERVO_ID)

print("设置新的原点后舵机角度: {:4.1f} °".format(angle), end='\n')

13. Sync Commands

Note: Only applies to brushless magnetic encoder servo V316 and later versions.

Supported Command IDs

Packet ID Packet Name Function
8 MoveOnAngleMode(Rotate) Angle mode
11 MoveOnAngleModeExByInterval Angle mode (based on acceleration/deceleration time)
12 MoveOnAngleModeExByVelocity Angle mode (based on target speed)
13 MoveOnMultiTurnAngleMode(Rotate) Multi-turn angle control
14 MoveOnMultiTurnAngleModeExByInterval Multi-turn angle control (based on acceleration/deceleration time)
15 MoveOnMultiTurnAngleModeExByVelocity Multi-turn angle control (based on target speed)
22 Servo Monitor servo data monitoring

13.1 API - send_sync_angle

Function Prototype

def send_sync_angle(self, command_id, servo_num, command_data_list):

Input Parameters

  • command_id: command ID
  • servo_num: number of Servo
  • command_data_list: command data list

Output Parameters

  • None

13.2 API - send_sync_anglebyinterval

Function Prototype

def send_sync_anglebyinterval(self, command_id, servo_num, command_data_list):

Input Parameters

  • command_id: command ID
  • servo_num: number of Servo
  • command_data_list: command data list

Output Parameters

  • None

13.3 API - send_sync_anglebyvelocity

Function Prototype

def send_sync_anglebyvelocity(self, command_id, servo_num, command_data_list):

Input Parameters

  • command_id: command ID
  • servo_num: number of Servo
  • command_data_list: command data list

Output Parameters

  • None

13.4 API - send_sync_multiturnangle

Function Prototype

def send_sync_multiturnangle(self, command_id, servo_num, command_data_list):

Input Parameters

  • command_id: command ID
  • servo_num: number of Servo
  • command_data_list: command data list

Output Parameters

  • None

13.5 API - send_sync_multiturnanglebyinterval

Function Prototype

def send_sync_multiturnanglebyinterval(self, command_id, servo_num, command_data_list):

Input Parameters

  • command_id: command ID
  • servo_num: number of Servo
  • command_data_list: command data list

Output Parameters

  • None

13.6 API - send_sync_multiturnanglebyvelocity

Function Prototype

uservo.set_origin_point(self, servo_id:int):

Input Parameters

  • command_id: command ID
  • servo_num: number of Servo
  • command_data_list: command data list

Output Parameters

  • None

13.7 API - send_sync_servo_monitor

Function Prototype

def send_sync_servo_monitor(self, servo_ids):

Input Parameters

  • command_id: command ID
  • servo_num: number of Servo
  • command_data_list: command data list

Output Parameters

  • ID
  • Voltage
  • Current
  • Power
  • Temperature
  • Status
  • Angle
  • Turns

13.8 Example Source Code

example/sync_mode

'''
总线伺服舵机
> Python SDK同步指令 Example <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2024/12/23
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
sys.path.append("../../src")


import time
import serial
import struct
# 导入串口舵机管理器
from uservo import UartServoManager
# 设置日志输出模式为INFO
USERVO_PORT_NAME = 'COM3'
uart = serial.Serial(port=USERVO_PORT_NAME, baudrate=115200,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
srv_num = 6# 舵机个数
uservo = UartServoManager(uart, is_debug=True)


command_data_list1 = [
    struct.pack('<BhHH', 1, -400, 500, 10000),  # 同步命令角度模式控制
    struct.pack('<BhHH', 2, -400 ,500, 10000),  #id2+度数-40 +时间 +功率
]
uservo.send_sync_angle(8, 2, command_data_list1)
time.sleep(2.02)

command_data_list2 = [
    struct.pack('<BhHHHH', 1, 400, 500, 100, 100, 10000) , # 同步命令角度模式控制(基於加减速時間)
    struct.pack('<BhHHHH', 2, 400, 500, 100, 100, 10000) , #id2+度数40+总时间+启动加速时间+运动减速时间+功率
]
uservo.send_sync_anglebyinterval(11, 2, command_data_list2)
time.sleep(2.02)


command_data_list4 = [
    struct.pack('<BhHHHH', 1, 600, 500, 100, 100, 10000), # 同步命令角度模式控制 (基於速率的運動控制 )
    struct.pack('<BhHHHH', 2, 600, 500, 100, 100, 10000), # id2+度数60+时间+功率
]
uservo.send_sync_anglebyvelocity(12, 2, command_data_list4)
time.sleep(2.02)


command_data_list3 = [
    struct.pack('<BlLH', 1, 800, 1500, 10000)  ,# 同步命令多圈角度模式控制
    struct.pack('<BlLH', 2, 800 ,1500, 10000)  ,# id2+度数80 +时间 +功率
]
uservo.send_sync_multiturnangle(13, 2, command_data_list3)
time.sleep(2.02)



command_data_list5 = [
    struct.pack('<BlLHHH', 1, 10010, 1000, 100,100,10000)  ,# 多圈角度模式控制 (基於加減速時段的運動控制 )
    struct.pack('<BlLHHH', 2, 10010 ,1000,100,100, 10000)  ,# id2+度数1001+总时间+启动加速时间+运动减速时间+功率
]
uservo.send_sync_multiturnanglebyinterval(14, 2, command_data_list5)
time.sleep(2.02)



command_data_list6 = [
    struct.pack('<BlHHHH', 1, 12010, 3000,100 ,100,10000)  ,# 多圈角度模式控制(基於速率的運動控制)
    struct.pack('<BlHHHH', 2, 12010 ,3000, 100, 100, 10000)  ,# id2+度数1201+目标速度300dps+启动加速时间+运动减速时间+功率
]
uservo.send_sync_multiturnanglebyvelocity(15, 2, command_data_list6)

example/sync_monitor

'''
总线伺服舵机
> Python SDK同步命令-同步监控 Example <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2024/12/23
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
sys.path.append("../../src")
# 导入依赖
import time
import serial
from uservo import UartServoManager

# 参数配置
# 角度定义
SERVO_PORT_NAME =  'COM4' # 舵机串口号
SERVO_BAUDRATE = 115200 # 舵机的波特率
SERVO_ID = 0  # 舵机的ID号

# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart)

power = 500 # 阻尼模式下的功率, 单位mW
uservo.set_damping(SERVO_ID, power)



servo_ids = [5,6,2,76,17]  # 想要同步读取的舵机ID列表
servo_monitor_data = uservo.send_sync_servo_monitor(servo_ids)
for servo_id, info in servo_monitor_data.items():
    if info:
        print("舵机ID: {}, 电压: {:.2f} V, 电流: {:.2f} A, 功率: {:.2f} W, 温度: {:.2f} °C, 状态: {}, 角度: {:.2f} °, 圈数: {:.0f}"
              .format(servo_id, info.voltage / 1000, info.current / 1000, info.power / 1000, info.temp, info.status, info.angle, info.turn))

14. Async Commands

Note: Only applies to brushless magnetic encoder servo V316 and later versions.

14.1 API - begin_async

Start an async command. The next received command is cached. Only angle commands are supported.

Function Prototype

def begin_async(self):

Input Parameters

  • None

Output Parameters

  • None

14.2 API - end_async

End the async command and immediately execute the cached command. If the cancel parameter is not 0, the cached command is cleared.

Function Prototype

def end_async(self,cancel=0):

Input Parameters

  • cancel: whether to cancel

Output Parameters

  • None

14.3 Example Source Code

example/async_mode

'''
总线伺服舵机
> Python SDK异步指令 Example <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2024/12/23
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
sys.path.append("../../src")
# 导入依赖
import time
import struct
import serial
from uservo import UartServoManager

# 参数配置
# 角度定义
SERVO_PORT_NAME =  'COM6'       # 舵机串口号 请根据实际串口进行修改
SERVO_BAUDRATE = 115200         # 舵机的波特率 请根据实际波特率进行修改

SERVO_ID = 0       #舵机ID
# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart, is_debug=True)
uservo.begin_async()   #  开始异步命令
time.sleep(0.02)
SERVO_ID  = 0
uservo.set_servo_angle( 0, angle = 20.0, interval=0, power=10000) 
time.sleep(2.02)
uservo.end_async(0)    #  结束异步命令    0:執行; 1:取消

15. Data Monitoring

Note: Only applies to brushless magnetic encoder servo V316 and later versions.

15.1 API - query_servo_monitor

Get servo data.

Function Prototype

def query_servo_monitor(self,servo_id=0):

Input Parameters

  • servo_id: Servo ID

Output Parameters

  • voltage: Servo voltage
  • current: Servo current
  • voltage: Servo power
  • temp: Servo temperature
  • status: Servo status
  • angle: Servo angle (single-turn / multi-turn)
  • turn: turns

15.2 Example Source Code

example/servo_monitor

'''
总线伺服舵机
> Python SDK监控指令 Example <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2024/12/23
--------------------------------------------------
'''
# 添加uservo.py的系统路径
import sys
sys.path.append("../../src")
# 导入依赖
import time
import struct
import serial
from uservo import UartServoManager

# 参数配置
SERVO_PORT_NAME =  'COM5'       # 舵机串口号 请根据实际串口进行修改
SERVO_BAUDRATE = 115200         # 舵机的波特率 请根据实际波特率进行修改
servo_id = 0                    # 监控的舵机id号

# 初始化串口
uart = serial.Serial(port=SERVO_PORT_NAME, baudrate=SERVO_BAUDRATE,\
                     parity=serial.PARITY_NONE, stopbits=1,\
                     bytesize=8,timeout=0)
# 初始化舵机管理器
uservo = UartServoManager(uart, is_debug=True)
servo_info = uservo.query_servo_monitor(servo_id=0)
print("舵机 电压: {:.2f} V".format( servo_info["voltage"]/1000))         #单个参数

print("舵机 角度: {:.2f} °".format( servo_info["angle"] )) 
print("舵机电压: {:.2f}V, 电流: {:.2f}A, 功率: {:.2f}W, 温度: {:.2f}°C, 状态: {}, 角度: {:.2f}°, 圈数: {:.0f}"
          .format( servo_info["voltage"] / 1000, servo_info["current"] / 1000, servo_info["power"] / 1000, servo_info["temp"], servo_info["status"], servo_info["angle"], servo_info["turn"])) #多个参数

16. Control Mode Stop Command

Note: Only applies to brushless magnetic encoder servo V316 and later versions.

16.1 API - stop_on_control_mode

Make the servo keep a different state mode after stopping.

Function Prototype

def stop_on_control_mode(self,servo_id, method, power):

Input Parameters

  • servo_id: Servo ID
  • method: mode after stopping: 0x10 release torque; 0x11 hold torque; 0x12 enter damping state
  • power: holding power

Output Parameters

  • None

16.2 Example Source Code

example/stop_on_control_mode

'''
总线伺服舵机
> MicroPython SDK停止指令 Example <
--------------------------------------------------
 * 作者: 深圳市华馨京科技有限公司
 * 网站:https://fashionrobo.com/
 * 更新时间: 2024/12/23
--------------------------------------------------
'''
import ustruct
from machine import UART
from uservo import UartServoManager
import time


# 舵机ID编号: [0, 1, 2, ..., srv_num-1]
# 扫描舵机个数
servo_num = 4
# 舵机ID
servo_id = 0
# 舵机是否有多圈模式的功能
#servo_has_mturn_func = False
# 创建串口对象 使用串口2作为控制对象
# 波特率: 115200
# RX: gpio 16
# TX: gpio 17
uart = UART(2, baudrate=115200)
# 创建舵机管理器
uservo = UartServoManager(uart, srv_num=servo_num)
uservo.stop_on_control_mode(servo_id, method=0x10, power=500)
uservo.stop_on_control_mode(servo_id, method=0x11, power=500)
uservo.stop_on_control_mode(servo_id, method=0x12, power=500)

Appendix 1 - Temperature ADC Value Conversion Table

Note: formula for converting ADC to Celsius

ADC-to-Celsius Conversion Formula

Temperature (°C) ADC Temperature (°C) ADC Temperature (°C) ADC
50 1191 60 941 70 741
51 1164 61 918 71 723
52 1137 62 897 72 706
53 1110 63 876 73 689
54 1085 64 855 74 673
55 1059 65 835 75 657
56 1034 66 815 76 642
57 1010 67 796 77 627
58 986 68 777 78 612
59 963 69 759 79 598
  • The above is the 50-79°C temperature/ADC reference table.