Chain 8Servos2

Servos8V2Chain 类通过 ChainBus 控制 Unit 8Servos2-Chain。设备提供八个可配置通道,支持 GPIO 输入、GPIO 输出、ADC、舵机、RGB 和 PWM 功能,还提供电源监测、UID、固件版本、引导程序版本和设备类型相关 API。

支持以下产品:

Unit 8Servos2-Chain

常量

以下常量用于 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 代码块:

example.png

示例输出:

选定的舵机转动到设置的角度。

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)

基类:KeyChain

Unit 8Servos2-Chain 设备。

参数:
  • bus (ChainBus) – Chain 总线实例。

  • device_id (int) – 设备在 Chain 总线上的 ID。

UiFlow2 代码块:

init.png

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: 0x00

  • MODE_OUTPUT: 0x01

  • MODE_ADC: 0x02

  • MODE_SERVO: 0x03

  • MODE_RGB: 0x04

  • MODE_PWM: 0x05

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

指定通道的模式。

返回类型:

int

UiFlow2 代码块:

get_channel_mode.png

MicroPython 代码块:

mode = servos8v2_0.get_channel_mode(0)
set_channel_mode(channel, mode)

设置指定通道的模式。

通道模式值:

  • MODE_INPUT: 0x00

  • MODE_OUTPUT: 0x01

  • MODE_ADC: 0x02

  • MODE_SERVO: 0x03

  • MODE_RGB: 0x04

  • MODE_PWM: 0x05

当通道设置为 MODE_SERVO 时,驱动会自动将其共享频率组设置为 50 Hz。通道 0-3 共享一个频率,通道 4-7 共享另一个频率。

参数:
  • channel (int) – 通道编号,范围为 0 到 7。

  • mode (int) – 要设置的通道模式。

返回:

操作成功时返回 True,否则返回 False。

返回类型:

bool

UiFlow2 代码块:

set_channel_mode.png

MicroPython 代码块:

servos8v2_0.set_channel_mode(0, Servos8V2Chain.MODE_SERVO)
set_input_pull(channel, pull)

设置指定通道的输入上下拉配置。

参数:
  • channel (int) – 通道编号,范围为 0 到 7。

  • pull (int) – 上下拉配置,可使用 PULL_NONE、PULL_UP 或 PULL_DOWN。

返回:

操作成功时返回 True,否则返回 False。

返回类型:

bool

UiFlow2 代码块:

set_input_pull.png

MicroPython 代码块:

servos8v2_0.set_input_pull(0, Servos8V2Chain.PULL_UP)
get_input_pull(channel)

获取指定通道的输入上下拉配置。

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

指定通道的上下拉配置。

返回类型:

int

UiFlow2 代码块:

get_input_pull.png

MicroPython 代码块:

pull = servos8v2_0.get_input_pull(0)
get_gpio_input_value(channel)

获取指定通道的 GPIO 输入电平。

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

True 表示高电平,False 表示低电平。

返回类型:

bool

UiFlow2 代码块:

get_gpio_input_value.png

MicroPython 代码块:

level = servos8v2_0.get_gpio_input_value(0)
set_gpio_output_value(channel, value)

设置指定通道的 GPIO 输出电平。

参数:
  • channel (int) – 通道编号,范围为 0 到 7。

  • value (bool) – 输出值,False 表示低电平,True 表示高电平。

返回:

操作成功时返回 True,否则返回 False。

返回类型:

bool

UiFlow2 代码块:

set_gpio_output_value.png

MicroPython 代码块:

servos8v2_0.set_gpio_output_value(0, True)
get_gpio_output_value(channel)

获取指定通道的 GPIO 输出电平。

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

True 表示高电平,False 表示低电平。

返回类型:

bool

UiFlow2 代码块:

get_gpio_output_value.png

MicroPython 代码块:

level = servos8v2_0.get_gpio_output_value(0)
get_adc_input(channel)

获取指定通道的 12 位 ADC 输入值。

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

ADC 值,范围为 0 到 4095。

返回类型:

int

UiFlow2 代码块:

get_adc_input.png

MicroPython 代码块:

adc = servos8v2_0.get_adc_input(0)
set_servo_angle(channel, angle)

设置指定通道的舵机角度。

参数:
  • channel (int) – 通道编号,范围为 0 到 7。

  • angle (int) – 舵机角度,范围为 0 到 180 度。

返回:

操作成功时返回 True,否则返回 False。

返回类型:

bool

UiFlow2 代码块:

set_servo_angle.png

MicroPython 代码块:

servos8v2_0.set_servo_angle(0, 90)
get_servo_angle(channel)

获取指定通道的舵机角度。

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

舵机角度,范围为 0 到 180 度。

返回类型:

int

UiFlow2 代码块:

get_servo_angle.png

MicroPython 代码块:

angle = servos8v2_0.get_servo_angle(0)
set_rgb_config(channel, count, refresh=False)

设置指定通道的 WS2812 灯珠数量和刷新标志。

参数:
  • channel (int) – 通道编号,范围为 0 到 7。

  • count (int) – WS2812 灯珠数量,范围为 0 到 16。

  • refresh (bool) – 是否触发 RGB 刷新,默认为 False。

返回:

操作成功时返回 True,否则返回 False。

返回类型:

bool

UiFlow2 代码块:

set_rgb_config.png

MicroPython 代码块:

servos8v2_0.set_rgb_config(0, 4, refresh=True)
get_rgb_config(channel)

获取指定通道的原始 WS2812 配置值。

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

原始 RGB 配置字节。

返回类型:

int

UiFlow2 代码块:

get_rgb_config.png

MicroPython 代码块:

config = servos8v2_0.get_rgb_config(0)
get_rgb_count(channel)

获取指定通道配置的 WS2812 灯珠数量。

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

WS2812 灯珠数量,范围为 0 到 16。

返回类型:

int

UiFlow2 代码块:

get_rgb_count.png

MicroPython 代码块:

count = servos8v2_0.get_rgb_count(0)
refresh_rgb(channel)

触发指定通道的 WS2812 刷新。

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

操作成功时返回 True,否则返回 False。

返回类型:

bool

UiFlow2 代码块:

refresh_rgb.png

MicroPython 代码块:

servos8v2_0.refresh_rgb(0)
set_rgb_buffer(index, color)

设置一个 WS2812 颜色缓冲区条目。

参数:
  • index (int) – WS2812 颜色缓冲区索引,范围为 0 到 15。

  • color (int) – 0xRRGGBB 格式的 RGB888 颜色值。

返回:

操作成功时返回 True,否则返回 False。

返回类型:

bool

UiFlow2 代码块:

set_rgb_buffer.png

MicroPython 代码块:

servos8v2_0.set_rgb_buffer(0, 0xFF0000)
get_rgb_buffer(index)

获取一个 WS2812 颜色缓冲区条目。

参数:

index (int) – WS2812 颜色缓冲区索引,范围为 0 到 15。

返回:

0xRRGGBB 格式的 RGB888 颜色值。

返回类型:

int

UiFlow2 代码块:

get_rgb_buffer.png

MicroPython 代码块:

color = servos8v2_0.get_rgb_buffer(0)
set_pwm_duty(channel, duty)

设置指定通道的 PWM 占空比。

参数:
  • channel (int) – 通道编号,范围为 0 到 7。

  • duty (int) – PWM 占空比,范围为 0 到 100。

返回:

操作成功时返回 True,否则返回 False。

返回类型:

bool

UiFlow2 代码块:

set_pwm_duty.png

MicroPython 代码块:

servos8v2_0.set_pwm_duty(0, 50)
get_pwm_duty(channel)

获取指定通道的 PWM 占空比。

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

PWM 占空比,范围为 0 到 100。

返回类型:

int

UiFlow2 代码块:

get_pwm_duty.png

MicroPython 代码块:

duty = servos8v2_0.get_pwm_duty(0)
set_pwm_freq(channel, freq)

设置指定通道的 PWM 频率。

通道 0-3 共享一个频率,通道 4-7 共享另一个频率。设置任一通道的频率会改变同组所有通道的频率。

参数:
  • channel (int) – 通道编号,范围为 0 到 7。

  • freq (int) – PWM 频率,单位为 Hz,范围为 1 到 65535。

返回:

操作成功时返回 True,否则返回 False。

返回类型:

bool

UiFlow2 代码块:

set_pwm_freq.png

MicroPython 代码块:

servos8v2_0.set_pwm_freq(0, 1000)
get_pwm_freq(channel)

获取指定通道的 PWM 频率。

通道 0-3 共享一个频率,通道 4-7 共享另一个频率。返回值为该通道所在组的共享频率。

参数:

channel (int) – 通道编号,范围为 0 到 7。

返回:

PWM 频率,单位为 Hz。

返回类型:

int

UiFlow2 代码块:

get_pwm_freq.png

MicroPython 代码块:

freq = servos8v2_0.get_pwm_freq(0)
get_reference_voltage()

获取参考电压。

返回:

参考电压,单位为 mV。

返回类型:

int

UiFlow2 代码块:

get_reference_voltage.png

MicroPython 代码块:

voltage = servos8v2_0.get_reference_voltage()
get_grove_voltage()

获取 Grove 端口电压。

返回:

Grove 端口电压,单位为 mV。

返回类型:

int

UiFlow2 代码块:

get_grove_voltage.png

MicroPython 代码块:

voltage = servos8v2_0.get_grove_voltage()
get_dc_voltage()

获取直流输入电压。

返回:

直流输入电压,单位为 mV。

返回类型:

int

UiFlow2 代码块:

get_dc_voltage.png

MicroPython 代码块:

voltage = servos8v2_0.get_dc_voltage()
get_current()

获取系统电流。

返回:

系统电流,单位为 mA。

返回类型:

int

UiFlow2 代码块:

get_current.png

MicroPython 代码块:

current = servos8v2_0.get_current()
get_uid(uid_type=0)

获取设备 UID。

参数:

uid_type (int) – UID 类型。0 表示 4 字节 UID,1 表示 12 字节 UID,默认为 0。

返回:

由 UID 字节组成的元组。获取失败时返回空元组。

返回类型:

tuple

UiFlow2 代码块:

get_uid.png

MicroPython 代码块:

uid = servos8v2_0.get_uid(0)
get_bootloader_version()

获取引导程序版本。

返回:

引导程序版本,获取失败时返回 None。

返回类型:

int

UiFlow2 代码块:

get_bootloader_version.png

MicroPython 代码块:

version = servos8v2_0.get_bootloader_version()
get_firmware_version()

获取固件版本。

返回:

固件版本。

返回类型:

int

UiFlow2 代码块:

get_firmware_version.png

MicroPython 代码块:

version = servos8v2_0.get_firmware_version()
get_device_type()

获取 Chain 设备类型。

返回:

设备类型。Unit 8Servos2-Chain 的设备类型为 0x000C。

返回类型:

int

UiFlow2 代码块:

get_device_type.png

MicroPython 代码块:

device_type = servos8v2_0.get_device_type()