Bus Servo Python SDK Development Guide
| 版本 | GitHub | 开发资源包 |
|---|---|---|
| v1.2026.0512 | 点击下载 |
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:
- Connect the servo to the adapter board with a data cable.
- Connect the external power supply for the servo.
- Connect the adapter board to the computer with a USB cable.
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
- Refer to "bus servo configuration Software" to assign IDs or modify configuration parameters in advance.
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 IDpower: 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_mturnbefore querying:is_mturn=True: return the multi-turn angleis_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 usedinterval: interval, in msvelocity: target speed of the Servo, in dpst_acc: acceleration time during startup, in mst_dec: deceleration time when approaching the target, in mspower: power limit, in mWmean_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 IDaddress: 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 IDaddress: memory tablecontent: 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 IDservo_num: number of Servocommand_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 IDservo_num: number of Servocommand_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 IDservo_num: number of Servocommand_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 IDservo_num: number of Servocommand_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 IDservo_num: number of Servocommand_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 IDservo_num: number of Servocommand_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 IDservo_num: number of Servocommand_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 voltagecurrent: Servo currentvoltage: Servo powertemp: Servo temperaturestatus: Servo statusangle: 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 IDmethod: mode after stopping: 0x10 release torque; 0x11 hold torque; 0x12 enter damping statepower: 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
| 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.

