8Servos2 Unit
Servos8V2Unit 类通过 I2C 控制 Unit 8Servos2-I2C。设备提供 8 个可配置通道,支持 GPIO 输入、GPIO 输出、ADC、舵机、RGB 和 PWM 操作,同时提供电源监测和设备信息 API。
支持以下产品:
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_NONE、PULL_UP 或 PULL_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 代码块:
示例输出:
选中的舵机输出会转动到屏幕显示的角度。
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 代码块:

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: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, Servos8V2Unit.MODE_SERVO)
- set_input_pull(channel, pull)
设置指定通道的输入上下拉配置。
- 参数:
- 返回类型:
None
UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.set_input_pull(0, Servos8V2Unit.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 输出电平。
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)
设置指定通道的舵机角度。
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 灯珠数量和刷新标志。
- 参数:
- 返回类型:
None
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 刷新。
- 参数:
channel (int) – 通道编号,范围为 0 到 7。
- 返回类型:
None
UiFlow2 代码块:

MicroPython 代码块:
servos8v2_0.refresh_rgb(0)
- set_rgb_buffer(index, color)
设置一个 WS2812 颜色缓冲区条目。
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 占空比。
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 共享另一个频率。设置任一通道的频率会改变同组所有通道的频率。
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_firmware_version()
获取固件版本。
- 返回:
固件版本。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
version = servos8v2_0.get_firmware_version()
- get_i2c_address()
获取当前 I2C 地址。
- 返回:
当前 I2C 地址。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
address = servos8v2_0.get_i2c_address()


