Chain 8Servos2
Servos8V2Chain 类通过 ChainBus 控制 Unit 8Servos2-Chain。设备提供八个可配置通道,支持 GPIO 输入、GPIO 输出、ADC、舵机、RGB 和 PWM 功能,还提供电源监测、UID、固件版本、引导程序版本和设备类型相关 API。
支持以下产品:
常量
以下常量用于 set_channel_mode():
MODE_INPUT:GPIO 输入模式。MODE_OUTPUT:GPIO 输出模式。MODE_ADC:ADC 输入模式。MODE_SERVO:舵机控制模式。MODE_RGB:用于 WS2812 灯珠的 RGB 输出模式。MODE_PWM:PWM 占空比输出模式。
调用 set_input_pull() 时可使用 PULL_NONE、PULL_UP 或 PULL_DOWN。
备注
通道 0-3 共享一个 PWM 频率,通道 4-7 共享另一个 PWM 频率。设置任一通道的频率会改变同组所有通道的频率。选择舵机模式时,会将该通道所在共享频率组设置为 50 Hz。
UiFlow2 应用示例
舵机控制
初始化 Unit 8Servos2-Chain,将一个通道设为舵机模式,并设置其角度。
UiFlow2 代码块:
示例输出:
选定的舵机转动到设置的角度。
MicroPython 应用示例
基本控制
本示例读取 Unit 8Servos2-Chain 的设备信息和电源数据,然后依次控制各通道的舵机在 0 到 180 度之间转动。
MicroPython 代码块:
1# SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD 2# 3# SPDX-License-Identifier: MIT 4 5import M5 6from M5 import * 7from chain import ChainBus 8from chain import Servos8V2Chain 9import time 10 11 12title = None 13label_angle = None 14label_timer = None 15label_power = None 16label_state = None 17bus2 = None 18servos8v2_0 = None 19last_move = 0 20position = 0 21 22ANGLES = (45, 135) 23 24 25def require_ok(result, action): 26 if not result: 27 raise RuntimeError(action + " failed") 28 29 30def setup(): 31 global title, label_angle, label_timer, label_power, label_state 32 global bus2, servos8v2_0, last_move 33 34 M5.begin() 35 Widgets.setRotation(0) 36 Widgets.fillScreen(0x222222) 37 title = Widgets.Title("Chain 8Servos2 Servo", 3, 0xFFFFFF, 0x0055AA, Widgets.FONTS.DejaVu18) 38 label_angle = Widgets.Label( 39 "All channels: 90 deg", 10, 58, 1.0, 0x17E6CF, 0x222222, Widgets.FONTS.DejaVu18 40 ) 41 label_timer = Widgets.Label( 42 "Servo PWM: 50 Hz", 10, 98, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18 43 ) 44 label_power = Widgets.Label( 45 "Use external servo power", 10, 138, 1.0, 0xFFD166, 0x222222, Widgets.FONTS.DejaVu18 46 ) 47 label_state = Widgets.Label( 48 "Sweeps 45 <-> 135 deg", 10, 178, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18 49 ) 50 51 bus2 = ChainBus(2, tx=21, rx=22) 52 servos8v2_0 = Servos8V2Chain(bus2, 1) 53 for channel in range(8): 54 require_ok( 55 servos8v2_0.set_channel_mode(channel, Servos8V2Chain.MODE_SERVO), 56 "set IO%d servo mode" % channel, 57 ) 58 for channel in range(8): 59 require_ok(servos8v2_0.set_servo_angle(channel, 90), "center servo %d" % channel) 60 modes = tuple(servos8v2_0.get_channel_mode(channel) for channel in range(8)) 61 freqs = ( 62 servos8v2_0.get_pwm_freq(0), 63 servos8v2_0.get_pwm_freq(4), 64 ) 65 label_timer.setText("PWM groups: %d / %d Hz" % freqs) 66 label_state.setText("Mode: %s" % ("OK" if modes == (3,) * 8 else str(modes))) 67 last_move = time.ticks_ms() 68 print("Chain 8Servos2: modes =", modes, "PWM groups =", freqs) 69 print("Chain 8Servos2: all channels centered at 90 degrees") 70 71 72def loop(): 73 global last_move, position 74 75 M5.update() 76 if time.ticks_diff(time.ticks_ms(), last_move) < 1500: 77 return 78 last_move = time.ticks_ms() 79 angle = ANGLES[position] 80 position = (position + 1) % len(ANGLES) 81 for channel in range(8): 82 require_ok(servos8v2_0.set_servo_angle(channel, angle), "set servo %d angle" % channel) 83 label_angle.setText("All channels: %d deg" % angle) 84 print("Servo angle:", angle) 85 86 87if __name__ == "__main__": 88 try: 89 setup() 90 while True: 91 loop() 92 except (Exception, KeyboardInterrupt) as e: 93 try: 94 if bus2 is not None: 95 bus2.deinit() 96 from utility import print_error_msg 97 98 print_error_msg(e) 99 except ImportError: 100 print("please update to latest firmware")
示例输出:
串口控制台输出设备信息和电源数据,各个已连接的舵机按测试顺序转动。
API参考
Servos8V2Chain
- class chain.servos8_v2.Servos8V2Chain(bus, device_id)
基类:
KeyChainUnit 8Servos2-Chain 设备。
UiFlow2 代码块:

MicroPython 代码块:
from chain import ChainBus from chain import Servos8V2Chain bus2 = ChainBus(2, tx=21, rx=22) servos8v2_0 = Servos8V2Chain(bus2, 1)
通用 Chain 设备方法请参阅
KeyChain。- get_channel_mode(channel)
获取指定通道的当前模式。
通道模式值:
MODE_INPUT:0x00MODE_OUTPUT:0x01MODE_ADC:0x02MODE_SERVO:0x03MODE_RGB:0x04MODE_PWM:0x05
UiFlow2 代码块:

MicroPython 代码块:
mode = servos8v2_0.get_channel_mode(0)
- set_channel_mode(channel, mode)
设置指定通道的模式。
通道模式值:
MODE_INPUT:0x00MODE_OUTPUT:0x01MODE_ADC:0x02MODE_SERVO:0x03MODE_RGB:0x04MODE_PWM:0x05
当通道设置为
MODE_SERVO时,驱动会自动将其共享频率组设置为 50 Hz。通道 0-3 共享一个频率,通道 4-7 共享另一个频率。UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.set_channel_mode(0, Servos8V2Chain.MODE_SERVO)
- set_input_pull(channel, pull)
设置指定通道的输入上下拉配置。
- 参数:
- 返回:
操作成功时返回 True,否则返回 False。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.set_input_pull(0, Servos8V2Chain.PULL_UP)
- get_input_pull(channel)
获取指定通道的输入上下拉配置。
UiFlow2 代码块:

MicroPython 代码块:
pull = servos8v2_0.get_input_pull(0)
- get_gpio_input_value(channel)
获取指定通道的 GPIO 输入电平。
UiFlow2 代码块:

MicroPython 代码块:
level = servos8v2_0.get_gpio_input_value(0)
- set_gpio_output_value(channel, value)
设置指定通道的 GPIO 输出电平。
- 参数:
- 返回:
操作成功时返回 True,否则返回 False。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.set_gpio_output_value(0, True)
- get_gpio_output_value(channel)
获取指定通道的 GPIO 输出电平。
UiFlow2 代码块:

MicroPython 代码块:
level = servos8v2_0.get_gpio_output_value(0)
- get_adc_input(channel)
获取指定通道的 12 位 ADC 输入值。
UiFlow2 代码块:

MicroPython 代码块:
adc = servos8v2_0.get_adc_input(0)
- set_servo_angle(channel, angle)
设置指定通道的舵机角度。
- 参数:
- 返回:
操作成功时返回 True,否则返回 False。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.set_servo_angle(0, 90)
- get_servo_angle(channel)
获取指定通道的舵机角度。
UiFlow2 代码块:

MicroPython 代码块:
angle = servos8v2_0.get_servo_angle(0)
- set_rgb_config(channel, count, refresh=False)
设置指定通道的 WS2812 灯珠数量和刷新标志。
- 参数:
- 返回:
操作成功时返回 True,否则返回 False。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.set_rgb_config(0, 4, refresh=True)
- get_rgb_config(channel)
获取指定通道的原始 WS2812 配置值。
UiFlow2 代码块:

MicroPython 代码块:
config = servos8v2_0.get_rgb_config(0)
- get_rgb_count(channel)
获取指定通道配置的 WS2812 灯珠数量。
UiFlow2 代码块:

MicroPython 代码块:
count = servos8v2_0.get_rgb_count(0)
- refresh_rgb(channel)
触发指定通道的 WS2812 刷新。
UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.refresh_rgb(0)
- set_rgb_buffer(index, color)
设置一个 WS2812 颜色缓冲区条目。
- 参数:
- 返回:
操作成功时返回 True,否则返回 False。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.set_rgb_buffer(0, 0xFF0000)
- get_rgb_buffer(index)
获取一个 WS2812 颜色缓冲区条目。
UiFlow2 代码块:

MicroPython 代码块:
color = servos8v2_0.get_rgb_buffer(0)
- set_pwm_duty(channel, duty)
设置指定通道的 PWM 占空比。
- 参数:
- 返回:
操作成功时返回 True,否则返回 False。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.set_pwm_duty(0, 50)
- get_pwm_duty(channel)
获取指定通道的 PWM 占空比。
UiFlow2 代码块:

MicroPython 代码块:
duty = servos8v2_0.get_pwm_duty(0)
- set_pwm_freq(channel, freq)
设置指定通道的 PWM 频率。
通道 0-3 共享一个频率,通道 4-7 共享另一个频率。设置任一通道的频率会改变同组所有通道的频率。
- 参数:
- 返回:
操作成功时返回 True,否则返回 False。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.set_pwm_freq(0, 1000)
- get_pwm_freq(channel)
获取指定通道的 PWM 频率。
通道 0-3 共享一个频率,通道 4-7 共享另一个频率。返回值为该通道所在组的共享频率。
UiFlow2 代码块:

MicroPython 代码块:
freq = servos8v2_0.get_pwm_freq(0)
- get_reference_voltage()
获取参考电压。
- 返回:
参考电压,单位为 mV。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
voltage = servos8v2_0.get_reference_voltage()
- get_grove_voltage()
获取 Grove 端口电压。
- 返回:
Grove 端口电压,单位为 mV。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
voltage = servos8v2_0.get_grove_voltage()
- get_dc_voltage()
获取直流输入电压。
- 返回:
直流输入电压,单位为 mV。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
voltage = servos8v2_0.get_dc_voltage()
- get_current()
获取系统电流。
- 返回:
系统电流,单位为 mA。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
current = servos8v2_0.get_current()
- get_uid(uid_type=0)
获取设备 UID。
- 参数:
uid_type (int) – UID 类型。0 表示 4 字节 UID,1 表示 12 字节 UID,默认为 0。
- 返回:
由 UID 字节组成的元组。获取失败时返回空元组。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
uid = servos8v2_0.get_uid(0)
- get_bootloader_version()
获取引导程序版本。
- 返回:
引导程序版本,获取失败时返回 None。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
version = servos8v2_0.get_bootloader_version()
- get_firmware_version()
获取固件版本。
- 返回:
固件版本。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
version = servos8v2_0.get_firmware_version()


