【uHandPi树莓派5机械手掌】扩展板API接口总汇

:backhand_index_pointing_down: 本篇主角长这样

适用于产品: 幻尔科技 uHandPi 树莓派5机械手掌

涉及模块: 树莓派5扩展板A款

一、Board 类初始化

引用扩展板SDK

import ros_robot_controller_sdk as rrc #引用扩展版通讯协议

创建串口通信对象,连接幻尔(Hiwonder)树莓派5扩展板(Servo Board),后续你就可以通过 board 对象发送指令:

board = rrc.Board(device=“/dev/ttyAMA0”, baudrate=1000000, timeout=5)

参数 类型 默认值 说明
device str /dev/ttyAMA0 串口设备路径
baudrate int 1000000 波特率
timeout int 5 串口超时时间(秒)

-–

二、系统通用接口

2.1 enable_reception(enable=True) — 开启数据接收

调用 `get_imu()`、`get_button()` 等读取接口前,必须先调用此方法开启数据接收。

board.enable_reception() # 开启接收

board.enable_reception(False) # 关闭接收

参数 类型 说明
enable bool True 开启,False 关闭,默认 True

-–

2.2 get_battery() — 读取电池电压

返回电池电压值,单位毫伏(mV);无数据时返回 `None`。需先调用 `enable_reception()`。

示例代码:

board.enable_reception() #开启接收

voltage = board.get_battery() #读取电压存入voltage变量

if voltage is not None:  #判断是否有读出电压值,有则打印电压

    print(f"电压: {voltage} mV")
返回值 类型 说明
电压值 int 单位 mV,例如 7400 表示 7.4V
无数据 None 队列为空或未开启接收时返回

-–

三、RGB 灯控制

3.1 `set_rgb(pixels)` — 设置 RGB 灯颜色

同时设置一个或多个 RGB 灯的颜色。扩展板上共有 2 颗 RGB 灯,编号为 1、2。


# 1号灯红色,2号灯绿色

board.set_rgb([[1, 255, 0, 0], [2, 0, 255, 0]])

# 所有灯关闭

board.set_rgb([[1, 0, 0, 0], [2, 0, 0, 0]])

# 两灯同时设为黄色

board.set_rgb([[1, 255, 255, 0], [2, 255, 255, 0]])

参数 类型 说明
pixels list 嵌套列表,每个子列表格式为 [index, R, G, B]
index int 灯编号,从 1 开始(最大 2)
R int 红色分量,范围 0~255
G int 绿色分量,范围 0~255
B int 蓝色分量,范围 0~255

-–

四、LED 控制

4.1 set_led(on_time, off_time, repeat=1, led_id=1) — 控制板载 LED 闪烁


board.set_led(0.1, 0.9, 3)   # 亮0.1s,灭0.9s,重复3次

board.set_led(0.5, 0.5, 0)   # 持续闪烁(repeat=0 表示无限循环)

board.set_led(1.0, 0.0, 1)   # 常亮1秒

参数 类型 说明
on_time float 亮灯时长(秒)
off_time float 灭灯时长(秒)
repeat int 重复次数,0 表示无限循环,默认 1
led_id int LED 编号,默认 1

-–

五、蜂鸣器控制

5.1 set_buzzer(freq, on_time, off_time, repeat=1) — 控制蜂鸣器


board.set_buzzer(1900, 0.1, 0.9, 1)  # 1900Hz,响0.1s,停0.9s,执行1次

board.set_buzzer(1000, 0.5, 0.5, 0)  # 1000Hz,持续循环

board.set_buzzer(1000, 0.0, 0.0, 1)  # 关闭蜂鸣器

参数 类型 说明
freq int 蜂鸣频率(Hz),常用值 1000~3000
on_time float 响声持续时长(秒),0.0 时关闭
off_time float 停止时长(秒)
repeat int 重复次数,0 表示无限循环,默认 1

-–

六、直流电机控制

扩展板支持最多 4 路 直流电机,编号 `1~4`。

6.1 `set_motor_duty(dutys)` — 按占空比设置电机速度


board.set_motor_duty([[1, 35]])                              # 1号电机35%占空比正转

board.set_motor_duty([[1, -50]])                             # 1号电机50%占空比反转

board.set_motor_duty([[1, 35], [2, -35], [3, 35], [4, -35]]) # 同时控制4个电机

board.set_motor_duty([[1, 0], [2, 0], [3, 0], [4, 0]])       # 停止所有电机

参数 类型 说明
dutys list 嵌套列表,每项格式 [motor_id, duty]
motor_id int 电机编号,1~4
duty float 占空比,范围 -100~100,负值反转,0 停止

-–

6.2 `set_motor_speed(speeds)` — 按速度值设置电机


board.set_motor_speed([[1, 0.3], [2, -0.3]])   # 1号正转,2号反转

board.set_motor_speed([[1, 0], [2, 0]])        # 停止

参数 类型 说明
speeds list 嵌套列表,每项格式 [motor_id, speed]
motor_id int 电机编号,1~4
speed float 速度值,负值反转

-–

七、PWM 舵机控制

扩展板支持 4 路 PWM 舵机(从内到外编号 `1~4`),脉宽范围约 `500~2500` μs,中位为 `1500` μs。

7.1 `pwm_servo_set_position(duration, positions)` — 设置 PWM 舵机位置


board.pwm_servo_set_position(0.5, [[1, 1500]])              # 1号舵机到1500,用时0.5s

board.pwm_servo_set_position(1.0, [[1, 1000], [2, 2000]])   # 同时控制1、2号,用时1s

board.pwm_servo_set_position(1.0, [[1, 500]])               # 1号舵机转到最小角度

参数 类型 说明
duration float 运动时长(秒),值越小速度越快
positions list 嵌套列表,每项格式 [servo_id, pulse_width]
servo_id int 舵机编号,1~4
pulse_width int 脉宽值(μs),范围约 500~2500,中位 1500

-–

7.2 `pwm_servo_set_offset(servo_id, offset)` — 设置 PWM 舵机偏移

微调舵机中位偏差,用于校准安装误差。


board.pwm_servo_set_offset(1, 10)   # 1号舵机正偏移10

board.pwm_servo_set_offset(1, -5)   # 1号舵机负偏移5

board.pwm_servo_set_offset(1, 0)    # 清除偏移

参数 类型 说明
servo_id int 舵机编号,1~4
offset int 偏移量,有符号整数

-–

7.3 `pwm_servo_read_offset(servo_id)` — 读取 PWM 舵机偏移**

注意: 此接口为阻塞调用,会等待串口响应。


offset = board.pwm_servo_read_offset(1)

print("偏移:", offset)

参数 类型 说明
servo_id int 舵机编号

返回值: `int` 当前偏移量

-–

7.4 `pwm_servo_read_position(servo_id)` — 读取 PWM 舵机当前位置

注意: 此接口为阻塞调用,会等待串口响应。


pos = board.pwm_servo_read_position(1)

print("当前脉宽:", pos, "μs")

参数 类型 说明
servo_id int 舵机编号

返回值: `int` 当前脉宽值(μs)

八、总线舵机控制

总线舵机通过半双工串口总线通信,支持位置控制及状态读取。

角度值范围 `0~1000`(对应 0°~240°),舵机 ID 范围 `1~253`,`254` 为广播地址。

8.1 `bus_servo_set_position(duration, positions)` — 设置总线舵机位置


board.bus_servo_set_position(1.0, \[\[1, 500\], \[2, 500\]\])    # 1、2号到500,用时1s

board.bus_servo_set_position(0.5, \[\[1, 0\], \[2, 1000\]\])     # 快速运动到目标位置

board.bus_servo_set_position(2.0, \[\[1, 500\]\])               # 缓慢运动

参数 类型 说明
duration float 运动时长(秒),值越大越慢
positions list 嵌套列表,每项格式 [servo_id, angle]
servo_id int 舵机 ID,1~253
angle int 目标角度值,范围 0~1000

-–

8.2 `bus_servo_stop(servo_id)` — 立即停止总线舵机


board.bus_servo_stop([1, 2])   # 同时停止1、2号舵机

board.bus_servo_stop([1])      # 仅停止1号

参数 类型 说明
`servo_id` list 要停止的舵机 ID 列表

-–

8.3 `bus_servo_enable_torque(servo_id, enable)` — 开关舵机扭矩


board.bus_servo_enable_torque(1, True)   # 开启扭矩(舵机锁定位置)

board.bus_servo_enable_torque(1, False)  # 关闭扭矩(可手动转动舵机)

参数 类型 说明
`servo_id` int 舵机 ID
`enable` bool `True` 启用扭矩,`False` 禁用扭矩

-–

8.4 `bus_servo_set_id(servo_id_now, servo_id_new)` — 修改舵机 ID

注意: 修改前总线上只能接一颗舵机,否则会造成 ID 冲突。


board.bus_servo_set_id(254, 1)   # 将广播地址舵机的 ID 改为 1

board.bus_servo_set_id(1, 2)     # 将 1 号改为 2 号

参数 类型 说明
`servo_id_now` int 当前舵机 ID,`254` 为广播地址
`servo_id_new` int 新 ID,范围 `1~253`

-–

8.5 `bus_servo_set_offset(servo_id, offset)` — 设置舵机角度偏移


board.bus_servo_set_offset(1, -10)  # 临时设置偏移为-10

8.6 `bus_servo_save_offset(servo_id)` — 保存偏移到舵机 EEPRO


board.bus_servo_set_offset(1, -10)  # 先设置偏移

board.bus_servo_save_offset(1)      # 再保存,掉电不丢失

参数 类型 说明
`servo_id` int 舵机 ID
`offset` int 偏移量,有符号整数

-–

8.7 `bus_servo_set_angle_limit(servo_id, limit)` — 设置角度限制


board.bus_servo_set_angle_limit(1, [0, 1000])    # 全范围

board.bus_servo_set_angle_limit(1, [200, 800])   # 限制在200\~800之间

参数 类型 说明
`servo_id` int 舵机 ID
`limit` list `[最小角度, 最大角度]`,范围 `0~1000`

-–

8.8 `bus_servo_set_vin_limit(servo_id, limit)` — 设置输入电压保护限制


board.bus_servo_set_vin_limit(1, [4500, 14500])  # 限制 4.5V\~14.5V

参数 类型 说明
`servo_id` int 舵机 ID
`limit` list `[最低电压(mV), 最高电压(mV)]`

-–

8.9 `bus_servo_set_temp_limit(servo_id, limit)` — 设置温度保护限制


board.bus_servo_set_temp_limit(1, 85)   # 超过 85℃ 触发保护

参数 类型 说明
`servo_id` int 舵机 ID
`limit` int 最高温度限制(℃)

-–

8.10 读取总线舵机状态接口汇总

所有读取接口均为阻塞调用,需确保舵机已连接并调用过 `enable_reception()`。

方法 参数 返回值 说明
`bus_servo_read_id(servo_id=254)` 舵机 ID(默认广播) `[id]` 读取舵机 ID
`bus_servo_read_position(servo_id)` 舵机 ID `[angle]` (0~1000) 读取当前角度
`bus_servo_read_vin(servo_id)` 舵机 ID `[voltage_mV]` 读取输入电压(mV)
`bus_servo_read_temp(servo_id)` 舵机 ID `[temp_℃]` 读取当前温度(℃)
`bus_servo_read_offset(servo_id)` 舵机 ID `[offset]` 读取角度偏移
`bus_servo_read_angle_limit(servo_id)` 舵机 ID `[min, max]` 读取角度限制
`bus_servo_read_vin_limit(servo_id)` 舵机 ID `[min_mV, max_mV]` 读取电压限制
`bus_servo_read_temp_limit(servo_id)` 舵机 ID `[temp_℃]` 读取温度保护值
`bus_servo_read_torque_state(servo_id)` 舵机 ID `[state]` 读取扭矩开关状态

示例代码
board.enable_reception()

servo_id = board.bus_servo_read_id()\[0\]        # 先读取 ID

print("ID:",         board.bus_servo_read_id(servo_id))

print("角度:",        board.bus_servo_read_position(servo_id))

print("电压(mV):",   board.bus_servo_read_vin(servo_id))

print("温度(℃):",    board.bus_servo_read_temp(servo_id))

print("偏移:",        board.bus_servo_read_offset(servo_id))

print("角度限制:",    board.bus_servo_read_angle_limit(servo_id))

print("电压限制:",    board.bus_servo_read_vin_limit(servo_id))

print("温度限制:",    board.bus_servo_read_temp_limit(servo_id))

print("扭矩状态:",    board.bus_servo_read_torque_state(servo_id))

九、 资源下载

可通过以下途径获取:

:globe_with_meridians: 官方在线课程与资料库: 幻尔科技官网在线教程

:speech_balloon: 客服领取: 联系你购买设备的店铺客服(淘宝/京东/天猫客服),提供订单号即可免费领取资料。