4EncoderMotor Driver Unit
本库通过 I2C 控制 Unit 4EncoderMotor Driver,支持四路电机的开环 PWM 控制、位置控制、速度控制以及编码器反馈。
支持以下产品:
UiFlow2 应用示例
四路电机 PWM 控制
在 UiFlow2 中打开 m5cores3_unit_4encoder_motor_driver_basic_example.m5f2 项目。
使用 CoreS3 作为主机,将 Unit 连接到 Port A 端口(SDA=G2、SCL=G1,I2C 频率为 100 kHz)。Unit 的默认地址为 0x24。
m5ui 页面提供四个滑块和一个 STOP 触摸按键:
M1~M4 四个滑块分别控制对应电机的 PWM 占空比,范围为
0~100,单位为百分比;旁边的标签同步显示设置值。移动任一滑块时,Unit 的 RGB LED 变为绿色(0x009900)。按 STOP 停止全部四路电机,将 RGB LED 设为红色(
0xCC0000),并将四个显示值归零。滑块位置保持不变;再次移动某个滑块时,会重新设置对应电机的 PWM 控制值。
屏幕显示的是 PWM 设置值。本示例使用 0~100 的 PWM 控制值,不切换转动方向,也不读取编码器计数或实际速度。
备注
滑块初始值为 0,标签显示 00。程序启动时将四路电机切换到开环模式,并将 RGB LED 设为绿色,但不会设置初始 PWM 输出。若之前的程序仍有电机输出,请先按 STOP 停止电机,再调节滑块。运行前请接好电机电源,结束示例前请按 STOP 停止电机。
UiFlow2 代码块:
示例输出:
将 M1 滑块调到 40,M1 旁会显示
40,对应 PWM 占空比设为 40%。按 STOP 后,四路电机旁均显示0,Unit RGB LED 变为红色。
MicroPython 应用示例
四路电机 PWM 控制
使用上述接线,在 CoreS3 上运行相同示例。
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 * 8import m5ui 9import lvgl as lv 10from unit import Encoder4MotorDriverUnit 11from hardware import Pin 12from hardware import I2C 13 14 15page0 = None 16button_stop = None 17label_title = None 18label_m1 = None 19slider_m1 = None 20slider_m2 = None 21slider_m3 = None 22slider_m4 = None 23label_m4 = None 24label_m3 = None 25label_m2 = None 26label_v1 = None 27label_v4 = None 28label_v3 = None 29label_v2 = None 30i2c0 = None 31encoder4motordriver_0 = None 32speed1 = None 33speed2 = None 34speed3 = None 35speed4 = None 36speed = None 37 38 39def button_stop_short_clicked_event(event_struct): 40 global \ 41 page0, \ 42 button_stop, \ 43 label_title, \ 44 label_m1, \ 45 slider_m1, \ 46 slider_m2, \ 47 slider_m3, \ 48 slider_m4, \ 49 label_m4, \ 50 label_m3, \ 51 label_m2, \ 52 label_v1, \ 53 label_v4, \ 54 label_v3, \ 55 label_v2, \ 56 i2c0, \ 57 encoder4motordriver_0, \ 58 speed1, \ 59 speed2, \ 60 speed3, \ 61 speed4, \ 62 speed 63 encoder4motordriver_0.stop_motor(Encoder4MotorDriverUnit.MOTOR_ALL) 64 encoder4motordriver_0.set_rgb_color(0xCC0000) 65 speed1 = 0 66 speed2 = 0 67 speed3 = 0 68 speed4 = 0 69 label_v1.set_text(str(speed1)) 70 label_v2.set_text(str(speed2)) 71 label_v3.set_text(str(speed3)) 72 label_v4.set_text(str(speed4)) 73 74 75def slider_m1_value_changed_event(event_struct): 76 global \ 77 page0, \ 78 button_stop, \ 79 label_title, \ 80 label_m1, \ 81 slider_m1, \ 82 slider_m2, \ 83 slider_m3, \ 84 slider_m4, \ 85 label_m4, \ 86 label_m3, \ 87 label_m2, \ 88 label_v1, \ 89 label_v4, \ 90 label_v3, \ 91 label_v2, \ 92 i2c0, \ 93 encoder4motordriver_0, \ 94 speed1, \ 95 speed2, \ 96 speed3, \ 97 speed4, \ 98 speed 99 speed1 = slider_m1.get_value() 100 encoder4motordriver_0.set_motor_pwm_duty(Encoder4MotorDriverUnit.MOTOR_1, speed1) 101 label_v1.set_text(str(speed1)) 102 encoder4motordriver_0.set_rgb_color(0x009900) 103 104 105def slider_m2_value_changed_event(event_struct): 106 global \ 107 page0, \ 108 button_stop, \ 109 label_title, \ 110 label_m1, \ 111 slider_m1, \ 112 slider_m2, \ 113 slider_m3, \ 114 slider_m4, \ 115 label_m4, \ 116 label_m3, \ 117 label_m2, \ 118 label_v1, \ 119 label_v4, \ 120 label_v3, \ 121 label_v2, \ 122 i2c0, \ 123 encoder4motordriver_0, \ 124 speed1, \ 125 speed2, \ 126 speed3, \ 127 speed4, \ 128 speed 129 speed2 = slider_m2.get_value() 130 encoder4motordriver_0.set_motor_pwm_duty(Encoder4MotorDriverUnit.MOTOR_2, speed2) 131 label_v2.set_text(str(speed2)) 132 encoder4motordriver_0.set_rgb_color(0x009900) 133 134 135def slider_m3_value_changed_event(event_struct): 136 global \ 137 page0, \ 138 button_stop, \ 139 label_title, \ 140 label_m1, \ 141 slider_m1, \ 142 slider_m2, \ 143 slider_m3, \ 144 slider_m4, \ 145 label_m4, \ 146 label_m3, \ 147 label_m2, \ 148 label_v1, \ 149 label_v4, \ 150 label_v3, \ 151 label_v2, \ 152 i2c0, \ 153 encoder4motordriver_0, \ 154 speed1, \ 155 speed2, \ 156 speed3, \ 157 speed4, \ 158 speed 159 speed3 = slider_m3.get_value() 160 encoder4motordriver_0.set_motor_pwm_duty(Encoder4MotorDriverUnit.MOTOR_3, speed3) 161 label_v3.set_text(str(speed3)) 162 encoder4motordriver_0.set_rgb_color(0x009900) 163 164 165def slider_m4_value_changed_event(event_struct): 166 global \ 167 page0, \ 168 button_stop, \ 169 label_title, \ 170 label_m1, \ 171 slider_m1, \ 172 slider_m2, \ 173 slider_m3, \ 174 slider_m4, \ 175 label_m4, \ 176 label_m3, \ 177 label_m2, \ 178 label_v1, \ 179 label_v4, \ 180 label_v3, \ 181 label_v2, \ 182 i2c0, \ 183 encoder4motordriver_0, \ 184 speed1, \ 185 speed2, \ 186 speed3, \ 187 speed4, \ 188 speed 189 speed4 = slider_m4.get_value() 190 encoder4motordriver_0.set_motor_pwm_duty(Encoder4MotorDriverUnit.MOTOR_4, speed4) 191 label_v4.set_text(str(speed4)) 192 encoder4motordriver_0.set_rgb_color(0x009900) 193 194 195def button_stop_event_handler(event_struct): 196 global \ 197 page0, \ 198 button_stop, \ 199 label_title, \ 200 label_m1, \ 201 slider_m1, \ 202 slider_m2, \ 203 slider_m3, \ 204 slider_m4, \ 205 label_m4, \ 206 label_m3, \ 207 label_m2, \ 208 label_v1, \ 209 label_v4, \ 210 label_v3, \ 211 label_v2, \ 212 i2c0, \ 213 encoder4motordriver_0, \ 214 speed1, \ 215 speed2, \ 216 speed3, \ 217 speed4, \ 218 speed 219 event = event_struct.code 220 if event == lv.EVENT.SHORT_CLICKED and True: 221 button_stop_short_clicked_event(event_struct) 222 return 223 224 225def slider_m1_event_handler(event_struct): 226 global \ 227 page0, \ 228 button_stop, \ 229 label_title, \ 230 label_m1, \ 231 slider_m1, \ 232 slider_m2, \ 233 slider_m3, \ 234 slider_m4, \ 235 label_m4, \ 236 label_m3, \ 237 label_m2, \ 238 label_v1, \ 239 label_v4, \ 240 label_v3, \ 241 label_v2, \ 242 i2c0, \ 243 encoder4motordriver_0, \ 244 speed1, \ 245 speed2, \ 246 speed3, \ 247 speed4, \ 248 speed 249 event = event_struct.code 250 if event == lv.EVENT.VALUE_CHANGED and True: 251 slider_m1_value_changed_event(event_struct) 252 return 253 254 255def slider_m2_event_handler(event_struct): 256 global \ 257 page0, \ 258 button_stop, \ 259 label_title, \ 260 label_m1, \ 261 slider_m1, \ 262 slider_m2, \ 263 slider_m3, \ 264 slider_m4, \ 265 label_m4, \ 266 label_m3, \ 267 label_m2, \ 268 label_v1, \ 269 label_v4, \ 270 label_v3, \ 271 label_v2, \ 272 i2c0, \ 273 encoder4motordriver_0, \ 274 speed1, \ 275 speed2, \ 276 speed3, \ 277 speed4, \ 278 speed 279 event = event_struct.code 280 if event == lv.EVENT.VALUE_CHANGED and True: 281 slider_m2_value_changed_event(event_struct) 282 return 283 284 285def slider_m3_event_handler(event_struct): 286 global \ 287 page0, \ 288 button_stop, \ 289 label_title, \ 290 label_m1, \ 291 slider_m1, \ 292 slider_m2, \ 293 slider_m3, \ 294 slider_m4, \ 295 label_m4, \ 296 label_m3, \ 297 label_m2, \ 298 label_v1, \ 299 label_v4, \ 300 label_v3, \ 301 label_v2, \ 302 i2c0, \ 303 encoder4motordriver_0, \ 304 speed1, \ 305 speed2, \ 306 speed3, \ 307 speed4, \ 308 speed 309 event = event_struct.code 310 if event == lv.EVENT.VALUE_CHANGED and True: 311 slider_m3_value_changed_event(event_struct) 312 return 313 314 315def slider_m4_event_handler(event_struct): 316 global \ 317 page0, \ 318 button_stop, \ 319 label_title, \ 320 label_m1, \ 321 slider_m1, \ 322 slider_m2, \ 323 slider_m3, \ 324 slider_m4, \ 325 label_m4, \ 326 label_m3, \ 327 label_m2, \ 328 label_v1, \ 329 label_v4, \ 330 label_v3, \ 331 label_v2, \ 332 i2c0, \ 333 encoder4motordriver_0, \ 334 speed1, \ 335 speed2, \ 336 speed3, \ 337 speed4, \ 338 speed 339 event = event_struct.code 340 if event == lv.EVENT.VALUE_CHANGED and True: 341 slider_m4_value_changed_event(event_struct) 342 return 343 344 345def setup(): 346 global \ 347 page0, \ 348 button_stop, \ 349 label_title, \ 350 label_m1, \ 351 slider_m1, \ 352 slider_m2, \ 353 slider_m3, \ 354 slider_m4, \ 355 label_m4, \ 356 label_m3, \ 357 label_m2, \ 358 label_v1, \ 359 label_v4, \ 360 label_v3, \ 361 label_v2, \ 362 i2c0, \ 363 encoder4motordriver_0, \ 364 speed1, \ 365 speed2, \ 366 speed3, \ 367 speed4, \ 368 speed 369 370 M5.begin() 371 Widgets.setRotation(0) 372 m5ui.init() 373 page0 = m5ui.M5Page(bg_c=0x000000) 374 button_stop = m5ui.M5Button( 375 text="STOP", 376 x=112, 377 y=185, 378 bg_c=0xF32121, 379 text_c=0xFFFFFF, 380 font=lv.font_montserrat_24, 381 parent=page0, 382 ) 383 label_title = m5ui.M5Label( 384 "4Encoder Motor Control", 385 x=12, 386 y=5, 387 text_c=0x079EE1, 388 bg_c=0xFFFFFF, 389 bg_opa=0, 390 font=lv.font_montserrat_24, 391 parent=page0, 392 ) 393 label_m1 = m5ui.M5Label( 394 "M1", 395 x=4, 396 y=42, 397 text_c=0x079EE1, 398 bg_c=0xFFFFFF, 399 bg_opa=0, 400 font=lv.font_montserrat_24, 401 parent=page0, 402 ) 403 slider_m1 = m5ui.M5Slider( 404 x=55, 405 y=45, 406 w=205, 407 h=11, 408 mode=lv.slider.MODE.NORMAL, 409 min_value=0, 410 max_value=100, 411 value=0, 412 bg_c=0x2193F3, 413 color=0x2193F3, 414 parent=page0, 415 ) 416 slider_m2 = m5ui.M5Slider( 417 x=55, 418 y=76, 419 w=205, 420 h=11, 421 mode=lv.slider.MODE.NORMAL, 422 min_value=0, 423 max_value=100, 424 value=0, 425 bg_c=0x2193F3, 426 color=0x2193F3, 427 parent=page0, 428 ) 429 slider_m3 = m5ui.M5Slider( 430 x=56, 431 y=107, 432 w=205, 433 h=11, 434 mode=lv.slider.MODE.NORMAL, 435 min_value=0, 436 max_value=100, 437 value=0, 438 bg_c=0x2193F3, 439 color=0x2193F3, 440 parent=page0, 441 ) 442 slider_m4 = m5ui.M5Slider( 443 x=55, 444 y=139, 445 w=205, 446 h=11, 447 mode=lv.slider.MODE.NORMAL, 448 min_value=0, 449 max_value=100, 450 value=0, 451 bg_c=0x2193F3, 452 color=0x2193F3, 453 parent=page0, 454 ) 455 label_m4 = m5ui.M5Label( 456 "M4", 457 x=4, 458 y=136, 459 text_c=0x079EE1, 460 bg_c=0xFFFFFF, 461 bg_opa=0, 462 font=lv.font_montserrat_24, 463 parent=page0, 464 ) 465 label_m3 = m5ui.M5Label( 466 "M3", 467 x=3, 468 y=104, 469 text_c=0x079EE1, 470 bg_c=0xFFFFFF, 471 bg_opa=0, 472 font=lv.font_montserrat_24, 473 parent=page0, 474 ) 475 label_m2 = m5ui.M5Label( 476 "M2", 477 x=4, 478 y=73, 479 text_c=0x079EE1, 480 bg_c=0xFFFFFF, 481 bg_opa=0, 482 font=lv.font_montserrat_24, 483 parent=page0, 484 ) 485 label_v1 = m5ui.M5Label( 486 "00", 487 x=267, 488 y=42, 489 text_c=0x079EE1, 490 bg_c=0xFFFFFF, 491 bg_opa=0, 492 font=lv.font_montserrat_24, 493 parent=page0, 494 ) 495 label_v4 = m5ui.M5Label( 496 "00", 497 x=267, 498 y=136, 499 text_c=0x079EE1, 500 bg_c=0xFFFFFF, 501 bg_opa=0, 502 font=lv.font_montserrat_24, 503 parent=page0, 504 ) 505 label_v3 = m5ui.M5Label( 506 "00", 507 x=267, 508 y=104, 509 text_c=0x079EE1, 510 bg_c=0xFFFFFF, 511 bg_opa=0, 512 font=lv.font_montserrat_24, 513 parent=page0, 514 ) 515 label_v2 = m5ui.M5Label( 516 "00", 517 x=267, 518 y=73, 519 text_c=0x079EE1, 520 bg_c=0xFFFFFF, 521 bg_opa=0, 522 font=lv.font_montserrat_24, 523 parent=page0, 524 ) 525 526 button_stop.add_event_cb(button_stop_event_handler, lv.EVENT.ALL, None) 527 slider_m1.add_event_cb(slider_m1_event_handler, lv.EVENT.ALL, None) 528 slider_m2.add_event_cb(slider_m2_event_handler, lv.EVENT.ALL, None) 529 slider_m3.add_event_cb(slider_m3_event_handler, lv.EVENT.ALL, None) 530 slider_m4.add_event_cb(slider_m4_event_handler, lv.EVENT.ALL, None) 531 532 i2c0 = I2C(0, scl=Pin(1), sda=Pin(2), freq=100000) 533 encoder4motordriver_0 = Encoder4MotorDriverUnit(i2c0, 0x24) 534 page0.screen_load() 535 speed = 0 536 encoder4motordriver_0.set_motor_mode( 537 Encoder4MotorDriverUnit.MOTOR_ALL, Encoder4MotorDriverUnit.MODE_OPEN_LOOP 538 ) 539 encoder4motordriver_0.set_rgb_color(0x009900) 540 speed1 = 0 541 speed2 = 0 542 speed3 = 0 543 speed4 = 0 544 545 546def loop(): 547 global \ 548 page0, \ 549 button_stop, \ 550 label_title, \ 551 label_m1, \ 552 slider_m1, \ 553 slider_m2, \ 554 slider_m3, \ 555 slider_m4, \ 556 label_m4, \ 557 label_m3, \ 558 label_m2, \ 559 label_v1, \ 560 label_v4, \ 561 label_v3, \ 562 label_v2, \ 563 i2c0, \ 564 encoder4motordriver_0, \ 565 speed1, \ 566 speed2, \ 567 speed3, \ 568 speed4, \ 569 speed 570 M5.update() 571 572 573if __name__ == "__main__": 574 try: 575 setup() 576 while True: 577 loop() 578 except (Exception, KeyboardInterrupt) as e: 579 try: 580 m5ui.deinit() 581 from utility import print_error_msg 582 583 print_error_msg(e) 584 except ImportError: 585 print("please update to latest firmware")
示例输出:
四个滑块分别控制四路电机的 PWM 占空比;按 STOP 可停止全部四路电机。未检测到 Unit 时,程序会提示检查连接。
API参考
Encoder4MotorDriverUnit
- class unit.encoder4_motor_driver.Encoder4MotorDriverUnit(i2c, address=micropython.const)
基类:
object通过 I2C 控制 Unit 4EncoderMotor Driver。
Unit 支持四路电机的开环 PWM 控制、位置控制、速度控制、编码器反馈、软启动和软停止、RGB LED 控制及输入电压和电流监测。驱动使用传入的 I2C 总线,不会关闭该总线。未检测到指定地址时,请检查 Unit 的 Grove 接线、供电和 I2C 地址。
- 参数:
UiFlow2 代码块:

MicroPython 代码块:
from hardware import I2C, Pin from unit import Encoder4MotorDriverUnit i2c0 = I2C(0, scl=Pin(1), sda=Pin(2), freq=100000) unit_4enc_motor_driver = Encoder4MotorDriverUnit(i2c0, 0x24)
电机通道常量:
MOTOR_ALL = -1:依次对全部四路电机执行设置或控制操作。MOTOR_1 = 0、MOTOR_2 = 1、MOTOR_3 = 2、MOTOR_4 = 3:选择对应的一路电机。读取数据时需指定单个通道,通道编号为 0~3。
电机控制模式常量:
MODE_OPEN_LOOP = 0:开环 PWM 控制。MODE_POSITION = 1:位置控制。MODE_SPEED = 2:速度控制。
编码器相位常量:
ENCODER_MODE_AB = 0:AB 相位顺序。ENCODER_MODE_BA = 1:BA 相位顺序。
速度读数和闭环速度设置值的范围均为 -127~127,协议未提供其与转速(RPM)的换算关系。位置控制的速度上限范围为 0~127。启用软启动和软停止后,PWM 输出会逐渐变化,减轻电机启动、停止或调速时的机械冲击。
- set_motor_mode(channel, mode)
设置一路电机的控制模式。
- 参数:
- 返回:
None.
UiFlow2 代码块:


- get_motor_mode(channel)
获取一路电机的控制模式。
UiFlow2 代码块:

- set_motor_pwm_duty(channel, percent)
设置指定电机在开环模式下的 PWM 控制值。
- 参数:
- 返回:
None.
UiFlow2 代码块:

- get_motor_pwm_duty(channel)
获取指定电机在开环模式下的 PWM 设置值。
UiFlow2 代码块:

- read_motor_speed(channel)
读取指定电机当前的速度读数。
- 参数:
channel (int) – 电机通道编号,范围为 0~3。
- 返回:
速度读数,可正可负,范围为 -127~127,固件每 20 ms 更新一次。该值未换算为转速(RPM),协议未提供相应的物理单位换算关系。
- 返回类型:
UiFlow2 代码块:

- stop_motor(channel)
停止指定电机,并将其控制模式设为开环模式。
切换到开环模式前会先将 PWM 控制值清零,避免之前的位置或速度控制输出在模式切换后继续驱动电机。
- 参数:
channel (int) – 电机通道编号,范围为 0~3;使用
MOTOR_ALL可对全部四路电机执行操作。- 返回:
None.
UiFlow2 代码块:

- enable_soft_start(channel)
在开环模式下启用一路电机的软启动和软停止。
各通道的软启动配置共同保存在 Unit 的 Flash 中。指定通道已启用时重复调用,不会更改已保存的设置。
- 参数:
channel (int) – 电机通道编号,范围为 0~3;使用
MOTOR_ALL可对全部四路电机执行操作。- 返回:
None.
UiFlow2 代码块:

- disable_soft_start(channel)
在开环模式下禁用一路电机的软启动和软停止。
各通道的软启动配置共同保存在 Unit 的 Flash 中。指定通道已禁用时重复调用,不会更改已保存的设置。
- 参数:
channel (int) – 电机通道编号,范围为 0~3;使用
MOTOR_ALL可对全部四路电机执行操作。- 返回:
None.
UiFlow2 代码块:

- is_soft_start_enabled(channel)
检查指定电机的软启动和软停止是否已启用。
UiFlow2 代码块:

- read_encoder_count(channel)
读取指定电机的编码器计数,读取操作不会将计数清零。
UiFlow2 代码块:

- set_encoder_count(channel, count)
设置一路电机的编码器计数。
- 参数:
- 返回:
None.
UiFlow2 代码块:

- clear_encoder_count(channel)
将一路电机的编码器计数清零。
- 参数:
channel (int) – 电机通道编号,范围为 0~3。
- 返回:
None.
UiFlow2 代码块:

- set_encoder_mode(mode)
设置全局编码器相位顺序。
修改相位顺序后,设置会保存到 Unit 的 Flash 中,并立即触发 Unit 重启。本方法会等待 Unit 重新响应当前 I2C 地址后返回。请避免重复写入相同设置,以减少 Flash 写入次数。
- 参数:
mode (int) – 使用
ENCODER_MODE_AB或ENCODER_MODE_BA。- 返回:
None.
UiFlow2 代码块:


- set_position_pid(channel, kp, ki, kd)
设置一路电机的位置环 PID 系数。
- 参数:
- 返回:
None.
UiFlow2 代码块:

- get_position_pid(channel)
获取一路电机的位置环 PID 系数。
- 参数:
channel (int) – 电机通道编号,范围为 0~3。
- 返回:
PID 系数元组
(kp, ki, kd),依次为比例、积分、微分系数,每项范围均为 0~255。- 返回类型:
UiFlow2 代码块:

- set_position_target_count(channel, count)
设置位置控制的目标位置,以编码器计数为单位。
- 参数:
- 返回:
None.
UiFlow2 代码块:

- get_position_target_count(channel)
获取已设置的目标位置,以编码器计数为单位。
UiFlow2 代码块:

- set_position_speed_limit(channel, speed_limit)
设置位置控制时的速度上限。
- 参数:
- 返回:
None.
UiFlow2 代码块:

- get_position_speed_limit(channel)
获取位置控制时的速度上限设置。
UiFlow2 代码块:

- set_speed_pid(channel, kp, ki, kd)
设置一路电机的速度环 PID 系数。
- 参数:
- 返回:
None.
UiFlow2 代码块:

- get_speed_pid(channel)
获取一路电机的速度环 PID 系数。
- 参数:
channel (int) – 电机通道编号,范围为 0~3。
- 返回:
PID 系数元组
(kp, ki, kd),依次为比例、积分、微分系数,每项范围均为 0~255。- 返回类型:
UiFlow2 代码块:

- set_speed_target(channel, speed)
设置指定电机的闭环速度控制目标。
- 参数:
- 返回:
None.
UiFlow2 代码块:

- get_speed_target(channel)
获取已设置的闭环速度控制目标。
UiFlow2 代码块:

- set_rgb_color(color)
设置板载 RGB LED 颜色。
- 参数:
color (int) –
0xRRGGBB格式的 RGB888 颜色,范围为 0x000000~0xFFFFFF。- 返回:
None.
UiFlow2 代码块:

- get_rgb_color()
获取板载 RGB LED 颜色。
- 返回:
0xRRGGBB格式的 RGB888 颜色,范围为 0x000000~0xFFFFFF。- 返回类型:
UiFlow2 代码块:

- set_rgb_brightness(percent)
设置板载 RGB LED 亮度。
UiFlow2 代码块:

- read_input_voltage_adc()
读取电机供电电压的原始 12 位 ADC 采样值。
- 返回:
原始 ADC 采样值,范围为 0~4095。如需读取以 V 为单位的电压,请使用
read_input_voltage()。- 返回类型:
UiFlow2 代码块:










