8Servos2 Unit

Servos8V2Unit 类通过 I2C 控制 Unit 8Servos2-I2C。设备提供 8 个可配置通道,支持 GPIO 输入、GPIO 输出、ADC、舵机、RGB 和 PWM 操作,同时提供电源监测和设备信息 API。

支持以下产品:

Unit 8Servos2-I2C

Constants

以下常量用于 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_NONEPULL_UPPULL_DOWN

备注

通道 0-3 共享一个 PWM 频率,通道 4-7 共享另一个 PWM 频率。设置任一通道的频率会改变同组所有通道的频率。选择舵机模式时,会将该通道所在共享频率组设置为 50 Hz。

UiFlow2 应用示例

舵机控制

在 UiFlow2 中打开 basic_8servos_v2_servo_control_example.m5f2 项目。

本示例初始化 Unit 8Servos2-I2C 以控制舵机。按键 A 选择单个通道或全部通道,按键 B 和 C 以 10 度为步长增大或减小舵机角度。屏幕显示当前选中的通道和角度。

UiFlow2 代码块:

example.png

示例输出:

选中的舵机输出会转动到屏幕显示的角度。

MicroPython 应用示例

舵机控制

本示例初始化 Unit 8Servos2-I2C 以控制舵机。按键 A 选择单个通道或全部通道,按键 B 和 C 以 10 度为步长增大或减小舵机角度。

MicroPython 代码块:

  1# SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
  2#
  3# SPDX-License-Identifier: MIT
  4
  5import os, sys, io
  6import M5
  7from M5 import *
  8from hardware import Pin
  9from hardware import I2C
 10from unit import Servos8V2Unit
 11
 12
 13label_title = None
 14label_channel = None
 15label_angle = None
 16label_sel = None
 17label_increase = None
 18label_decrease = None
 19i2c0 = None
 20servos8v2_0 = None
 21channel = None
 22angle = None
 23i = None
 24
 25
 26def btna_was_clicked_event(state):
 27    global \
 28        label_title, \
 29        label_channel, \
 30        label_angle, \
 31        label_sel, \
 32        label_increase, \
 33        label_decrease, \
 34        i2c0, \
 35        servos8v2_0, \
 36        channel, \
 37        angle, \
 38        i
 39    channel = (channel if isinstance(channel, (int, float)) else 0) + 1
 40    if channel >= 9:
 41        channel = 0
 42    if channel == 8:
 43        label_channel.setText(str("Channel: all"))
 44        for i in range(7):
 45            servos8v2_0.set_servo_angle(i, angle)
 46    else:
 47        label_channel.setText(str((str("Channel: ") + str(channel))))
 48        servos8v2_0.set_servo_angle(channel, angle)
 49
 50
 51def btnb_was_clicked_event(state):
 52    global \
 53        label_title, \
 54        label_channel, \
 55        label_angle, \
 56        label_sel, \
 57        label_increase, \
 58        label_decrease, \
 59        i2c0, \
 60        servos8v2_0, \
 61        channel, \
 62        angle, \
 63        i
 64    angle = angle + 10
 65    if angle >= 180:
 66        angle = 0
 67    if channel == 8:
 68        for i in range(7):
 69            servos8v2_0.set_servo_angle(i, angle)
 70    else:
 71        servos8v2_0.set_servo_angle(channel, angle)
 72    label_angle.setText(str((str("Angle: ") + str(angle))))
 73
 74
 75def btnc_was_clicked_event(state):
 76    global \
 77        label_title, \
 78        label_channel, \
 79        label_angle, \
 80        label_sel, \
 81        label_increase, \
 82        label_decrease, \
 83        i2c0, \
 84        servos8v2_0, \
 85        channel, \
 86        angle, \
 87        i
 88    angle = angle - 10
 89    if angle <= 0:
 90        angle = 180
 91    if channel == 8:
 92        for i in range(7):
 93            servos8v2_0.set_servo_angle(i, angle)
 94    else:
 95        servos8v2_0.set_servo_angle(channel, angle)
 96    label_angle.setText(str((str("Angle: ") + str(angle))))
 97
 98
 99def setup():
100    global \
101        label_title, \
102        label_channel, \
103        label_angle, \
104        label_sel, \
105        label_increase, \
106        label_decrease, \
107        i2c0, \
108        servos8v2_0, \
109        channel, \
110        angle, \
111        i
112
113    M5.begin()
114    Widgets.setRotation(1)
115    Widgets.fillScreen(0x000000)
116    label_title = Widgets.Label(
117        "Servo Control", 76, 2, 1.0, 0x1393E8, 0x000000, Widgets.FONTS.Montserrat24
118    )
119    label_channel = Widgets.Label(
120        "Channel: 1", 36, 77, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.Montserrat24
121    )
122    label_angle = Widgets.Label(
123        "Angle: 0", 40, 112, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.Montserrat24
124    )
125    label_sel = Widgets.Label(
126        "select", 43, 210, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.Montserrat16
127    )
128    label_increase = Widgets.Label(
129        "+10", 143, 210, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.Montserrat16
130    )
131    label_decrease = Widgets.Label(
132        "-10", 233, 210, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.Montserrat16
133    )
134
135    BtnA.setCallback(type=BtnA.CB_TYPE.WAS_CLICKED, cb=btna_was_clicked_event)
136    BtnB.setCallback(type=BtnB.CB_TYPE.WAS_CLICKED, cb=btnb_was_clicked_event)
137    BtnC.setCallback(type=BtnC.CB_TYPE.WAS_CLICKED, cb=btnc_was_clicked_event)
138
139    i2c0 = I2C(0, scl=Pin(22), sda=Pin(21), freq=100000)
140    servos8v2_0 = Servos8V2Unit(i2c0, 0x25)
141    channel = 0
142    angle = 0
143    for i in range(7):
144        servos8v2_0.set_channel_mode(i, Servos8V2Unit.MODE_SERVO)
145        servos8v2_0.set_servo_angle(i, 0)
146
147
148def loop():
149    global \
150        label_title, \
151        label_channel, \
152        label_angle, \
153        label_sel, \
154        label_increase, \
155        label_decrease, \
156        i2c0, \
157        servos8v2_0, \
158        channel, \
159        angle, \
160        i
161    M5.update()
162
163
164if __name__ == "__main__":
165    try:
166        setup()
167        while True:
168            loop()
169    except (Exception, KeyboardInterrupt) as e:
170        try:
171            from utility import print_error_msg
172
173            print_error_msg(e)
174        except ImportError:
175            print("please update to latest firmware")

示例输出:

屏幕显示当前选中的通道和角度;角度改变时,选中的舵机输出会随之转动。

API参考

Servos8V2Unit

class unit.servos8_v2.Servos8V2Unit(i2c, address=37)

基类:object

创建 Unit 8Servos2 对象。

参数:
  • i2c (machine.I2C | PAHUBUnit) – Unit 8Servos2 所连接的 I2C 总线。

  • address (int | list | tuple) – 设备的 I2C 地址,范围为 0x25 到 0x34,默认为 0x25。

  • i2c

  • address

抛出:

UnitError – 当 Unit 8Servos2 未连接时。

UiFlow2 代码块:

init.png

MicroPython 代码块:

from hardware import I2C, Pin
from unit import Servos8V2Unit

i2c0 = I2C(0, scl=Pin(22), sda=Pin(21), freq=100000)
servos8v2_0 = Servos8V2Unit(i2c0, 0x25)
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) – 要设置的通道模式。

返回类型:

None

UiFlow2 代码块:

set_channel_mode.png

MicroPython 代码块:

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

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

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

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

返回类型:

None

UiFlow2 代码块:

set_input_pull.png

MicroPython 代码块:

servos8v2_0.set_input_pull(0, Servos8V2Unit.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 表示高电平。

返回类型:

None

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 度。

返回类型:

None

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。

返回类型:

None

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。

返回类型:

None

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 颜色值。

返回类型:

None

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。

返回类型:

None

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。

返回类型:

None

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_firmware_version()

获取固件版本。

返回:

固件版本。

返回类型:

int

UiFlow2 代码块:

get_firmware_version.png

MicroPython 代码块:

version = servos8v2_0.get_firmware_version()
get_i2c_address()

获取当前 I2C 地址。

返回:

当前 I2C 地址。

返回类型:

int

UiFlow2 代码块:

get_i2c_address.png

MicroPython 代码块:

address = servos8v2_0.get_i2c_address()
get_uid()

获取 12 字节设备 UID。

返回:

包含 12 个 UID 字节的元组。

返回类型:

tuple

UiFlow2 代码块:

get_uid.png

MicroPython 代码块:

uid = servos8v2_0.get_uid()