4EncoderMotor Driver Unit

本库通过 I2C 控制 Unit 4EncoderMotor Driver,支持四路电机的开环 PWM 控制、位置控制、速度控制以及编码器反馈。

支持以下产品:

Unit 4EncoderMotor Driver

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 代码块:

m5cores3_unit_4encoder_motor_driver_basic_example.png

示例输出:

将 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 地址。

参数:
  • i2c (I2C | PAHUBUnit) – 已初始化的 I2C 总线或兼容的 PAHUB 端口。

  • address (int) – 7 位 I2C 地址,范围为 0x08~0x77,默认值为 0x24。

UiFlow2 代码块:

init.png

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)

设置一路电机的控制模式。

参数:
  • channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

  • mode (int) – 使用 MODE_OPEN_LOOP、MODE_POSITION 或 MODE_SPEED。

返回:

None.

UiFlow2 代码块:

set_motor_mode.png

motor_mode_option.png

get_motor_mode(channel)

获取一路电机的控制模式。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

当前模式,范围为 0~2。

返回类型:

int

UiFlow2 代码块:

get_motor_mode.png

set_motor_pwm_duty(channel, percent)

设置指定电机在开环模式下的 PWM 控制值。

参数:
  • channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

  • percent (int or float) – PWM 控制值,范围为 -100~100。正负表示相反的转动方向,绝对值表示占空比百分数,0 表示停止输出。

返回:

None.

UiFlow2 代码块:

set_motor_pwm_duty.png

get_motor_pwm_duty(channel)

获取指定电机在开环模式下的 PWM 设置值。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

PWM 设置值,范围为 -100~100。正负表示相反的转动方向,绝对值表示占空比百分数。

返回类型:

int

UiFlow2 代码块:

get_motor_pwm_duty.png

read_motor_speed(channel)

读取指定电机当前的速度读数。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

速度读数,可正可负,范围为 -127~127,固件每 20 ms 更新一次。该值未换算为转速(RPM),协议未提供相应的物理单位换算关系。

返回类型:

int

UiFlow2 代码块:

read_motor_speed.png

stop_motor(channel)

停止指定电机,并将其控制模式设为开环模式。

切换到开环模式前会先将 PWM 控制值清零,避免之前的位置或速度控制输出在模式切换后继续驱动电机。

参数:

channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

返回:

None.

UiFlow2 代码块:

stop_motor.png

enable_soft_start(channel)

在开环模式下启用一路电机的软启动和软停止。

各通道的软启动配置共同保存在 Unit 的 Flash 中。指定通道已启用时重复调用,不会更改已保存的设置。

参数:

channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

返回:

None.

UiFlow2 代码块:

enable_soft_start.png

disable_soft_start(channel)

在开环模式下禁用一路电机的软启动和软停止。

各通道的软启动配置共同保存在 Unit 的 Flash 中。指定通道已禁用时重复调用,不会更改已保存的设置。

参数:

channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

返回:

None.

UiFlow2 代码块:

disable_soft_start.png

is_soft_start_enabled(channel)

检查指定电机的软启动和软停止是否已启用。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

软启动和软停止已启用时返回 True。

返回类型:

bool

UiFlow2 代码块:

is_soft_start_enabled.png

read_encoder_count(channel)

读取指定电机的编码器计数,读取操作不会将计数清零。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

编码器计数,可正可负,范围为 -2147483648~2147483647。

返回类型:

int

UiFlow2 代码块:

read_encoder_count.png

set_encoder_count(channel, count)

设置一路电机的编码器计数。

参数:
  • channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

  • count (int) – 编码器计数,可正可负,范围为 -2147483648~2147483647。

返回:

None.

UiFlow2 代码块:

set_encoder_count.png

clear_encoder_count(channel)

将一路电机的编码器计数清零。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

None.

UiFlow2 代码块:

clear_encoder_count.png

set_encoder_mode(mode)

设置全局编码器相位顺序。

修改相位顺序后,设置会保存到 Unit 的 Flash 中,并立即触发 Unit 重启。本方法会等待 Unit 重新响应当前 I2C 地址后返回。请避免重复写入相同设置,以减少 Flash 写入次数。

参数:

mode (int) – 使用 ENCODER_MODE_AB 或 ENCODER_MODE_BA。

返回:

None.

UiFlow2 代码块:

set_encoder_mode.png

encoder_mode_option.png

get_encoder_mode()

获取全局编码器相位顺序。

返回:

使用 ENCODER_MODE_AB 或 ENCODER_MODE_BA。

返回类型:

int

UiFlow2 代码块:

get_encoder_mode.png

set_position_pid(channel, kp, ki, kd)

设置一路电机的位置环 PID 系数。

参数:
  • channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

  • kp (int) – 比例系数,范围为 0~255。

  • ki (int) – 积分系数,范围为 0~255。

  • kd (int) – 微分系数,范围为 0~255。

返回:

None.

UiFlow2 代码块:

set_position_pid.png

get_position_pid(channel)

获取一路电机的位置环 PID 系数。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

PID 系数元组 (kp, ki, kd),依次为比例、积分、微分系数,每项范围均为 0~255。

返回类型:

tuple

UiFlow2 代码块:

get_position_pid.png

set_position_target_count(channel, count)

设置位置控制的目标位置,以编码器计数为单位。

参数:
  • channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

  • count (int) – 目标位置,以编码器计数为单位,可正可负,范围为 -2147483648~2147483647。

返回:

None.

UiFlow2 代码块:

set_position_target_count.png

get_position_target_count(channel)

获取已设置的目标位置,以编码器计数为单位。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

目标位置,以编码器计数为单位,可正可负,范围为 -2147483648~2147483647。

返回类型:

int

UiFlow2 代码块:

get_position_target_count.png

set_position_speed_limit(channel, speed_limit)

设置位置控制时的速度上限。

参数:
  • channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

  • speed_limit (int) – 位置控制时的速度上限,范围为 0~127。

返回:

None.

UiFlow2 代码块:

set_position_speed_limit.png

get_position_speed_limit(channel)

获取位置控制时的速度上限设置。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

速度上限设置值,范围为 0~127。该值为设备使用的速度数值,单位不是转速(RPM)。

返回类型:

int

UiFlow2 代码块:

get_position_speed_limit.png

set_speed_pid(channel, kp, ki, kd)

设置一路电机的速度环 PID 系数。

参数:
  • channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

  • kp (int) – 比例系数,范围为 0~255。

  • ki (int) – 积分系数,范围为 0~255。

  • kd (int) – 微分系数,范围为 0~255。

返回:

None.

UiFlow2 代码块:

set_speed_pid.png

get_speed_pid(channel)

获取一路电机的速度环 PID 系数。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

PID 系数元组 (kp, ki, kd),依次为比例、积分、微分系数,每项范围均为 0~255。

返回类型:

tuple

UiFlow2 代码块:

get_speed_pid.png

set_speed_target(channel, speed)

设置指定电机的闭环速度控制目标。

参数:
  • channel (int) – 电机通道编号,范围为 0~3;使用 MOTOR_ALL 可对全部四路电机执行操作。

  • speed (int) – 目标速度设置值,可正可负,范围为 -127~127。

返回:

None.

UiFlow2 代码块:

set_speed_target.png

get_speed_target(channel)

获取已设置的闭环速度控制目标。

参数:

channel (int) – 电机通道编号,范围为 0~3。

返回:

目标速度设置值,可正可负,范围为 -127~127。

返回类型:

int

UiFlow2 代码块:

get_speed_target.png

set_rgb_color(color)

设置板载 RGB LED 颜色。

参数:

color (int) – 0xRRGGBB 格式的 RGB888 颜色,范围为 0x000000~0xFFFFFF。

返回:

None.

UiFlow2 代码块:

set_rgb_color.png

get_rgb_color()

获取板载 RGB LED 颜色。

返回:

0xRRGGBB 格式的 RGB888 颜色,范围为 0x000000~0xFFFFFF。

返回类型:

int

UiFlow2 代码块:

get_rgb_color.png

set_rgb_brightness(percent)

设置板载 RGB LED 亮度。

参数:

percent (int or float) – 亮度,单位为百分比,范围为 0~100。

返回:

None.

UiFlow2 代码块:

set_rgb_brightness.png

get_rgb_brightness()

获取板载 RGB LED 亮度。

返回:

亮度,单位为百分比,范围为 0~100。

返回类型:

int

UiFlow2 代码块:

get_rgb_brightness.png

read_input_voltage()

读取电机供电输入电压。

返回:

输入电压,单位为 V,范围取决于硬件供电。

返回类型:

float

UiFlow2 代码块:

read_input_voltage.png

read_input_voltage_adc()

读取电机供电电压的原始 12 位 ADC 采样值。

返回:

原始 ADC 采样值,范围为 0~4095。如需读取以 V 为单位的电压,请使用 read_input_voltage()。

返回类型:

int

UiFlow2 代码块:

read_input_voltage_adc.png

read_input_current()

读取电机供电输入总电流。

返回:

输入电流,单位为 A,范围取决于所连接的负载。

返回类型:

float

UiFlow2 代码块:

read_input_current.png

get_firmware_version()

读取 Unit 的固件版本值。

返回:

固件版本值,范围为 0~255。

返回类型:

int

UiFlow2 代码块:

get_firmware_version.png

get_uid()

获取设备的 12 字节 STM32 唯一标识符。

返回:

设备 UID,按协议顺序返回,长度固定为 12 字节。

返回类型:

bytes

UiFlow2 代码块:

get_uid.png

get_i2c_address()

从设备获取 Unit I2C 地址。

返回:

7 位 I2C 地址,接口支持的范围为 0x08~0x77。

返回类型:

int

UiFlow2 代码块:

get_i2c_address.png

set_i2c_address(address)

修改 Unit 的 I2C 地址,并更新当前驱动对象使用的地址。

新地址会保存到 Unit 的 Flash 中,并立即触发 Unit 重启。本方法会先等待至少 300 ms,再检测新地址,确认响应后更新驱动对象的地址。请避免不必要的调用,以减少 Flash 写入次数。

参数:

address (int) – 新的 7 位 I2C 地址,范围为 0x08~0x77。

返回:

None.

UiFlow2 代码块:

set_i2c_address.png