Motion Base
Atomic Motion Base 是一款专为 ATOM 系列控制器设计的舵机和直流电机驱动器。它内部集成了 STM32 控制芯片,并使用 I2C 通信进行控制。Atomic Motion Base 提供 4 路舵机通道和 2 路直流电机接口,方便用于需要控制多个舵机或电机的场景,如多舵机械臂或小车电机控制。
Atomic Motion Base v1.1 增加 INA266 实现电流,电压和功率检测。
支持以下产品:
UiFlow2 应用示例:
Motion Base
在 UiFlow2 上打开 atoms3_lite_motion_base_example.m5f2 项目。
此示例控制舵机旋转到指定角度,设置电机旋转。
UiFlow2 代码块:
示例输出:
无
Motion Base v1.1
在 UiFlow2 上打开 atoms3_motion_base_v1.1_example.m5f2 项目。
示例程序在按下屏幕按钮时切换电机的运行速度,屏幕显示当前的电流、电压和功率。
UiFlow2 代码块:
示例输出:
无
MicroPython 应用示例:
Motion Base
此示例控制舵机旋转到指定角度,设置电机旋转。
MicroPython 代码块:
1# SPDX-FileCopyrightText: 2024 M5Stack Technology CO LTD 2# 3# SPDX-License-Identifier: MIT 4 5import os, sys, io 6import M5 7from M5 import * 8from hardware import * 9from base import Motion 10 11 12i2c0 = None 13motion = None 14 15 16def setup(): 17 global i2c0, motion 18 19 M5.begin() 20 i2c0 = I2C(0, scl=Pin(39), sda=Pin(38), freq=100000) 21 motion = Motion(i2c0, 0x38) 22 motion.set_servo_angle(1, 70) 23 motion.set_motor_speed(1, 46) 24 print(motion.get_servo_angle(1)) 25 26 27def loop(): 28 global i2c0, motion 29 M5.update() 30 31 32if __name__ == "__main__": 33 try: 34 setup() 35 while True: 36 loop() 37 except (Exception, KeyboardInterrupt) as e: 38 try: 39 from utility import print_error_msg 40 41 print_error_msg(e) 42 except ImportError: 43 print("please update to latest firmware")
示例输出:
无
Motion Base v1.1
示例程序在按下屏幕按钮时切换电机的运行速度,屏幕显示当前的电流、电压和功率。
MicroPython 代码块:
1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD 2# 3# SPDX-License-Identifier: MIT 4 5import os, sys, io 6import M5 7from M5 import * 8from hardware import I2C 9from hardware import Pin 10from base import Motion 11import time 12 13 14label_speed = None 15title_e = None 16label_vol = None 17label_cur = None 18label_pow = None 19i2c0 = None 20motion = None 21speed = None 22voltage = None 23curent = None 24last_time = None 25power = None 26 27 28def btnA_wasClicked_event(state): 29 global \ 30 label_speed, \ 31 title_e, \ 32 label_vol, \ 33 label_cur, \ 34 label_pow, \ 35 i2c0, \ 36 motion, \ 37 speed, \ 38 voltage, \ 39 curent, \ 40 last_time, \ 41 power 42 speed = speed + 20 43 if speed > 120: 44 speed = 0 45 motion.set_motor_speed(1, speed) 46 label_speed.setText(str((str("speed: ") + str(speed)))) 47 48 49def setup(): 50 global \ 51 label_speed, \ 52 title_e, \ 53 label_vol, \ 54 label_cur, \ 55 label_pow, \ 56 i2c0, \ 57 motion, \ 58 speed, \ 59 voltage, \ 60 curent, \ 61 last_time, \ 62 power 63 M5.begin() 64 label_speed = Widgets.Label("speed:", 5, 27, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.DejaVu18) 65 title_e = Widgets.Title("Motor Ctrl", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18) 66 label_vol = Widgets.Label("vol:", 5, 55, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.DejaVu18) 67 label_cur = Widgets.Label("cur:", 5, 75, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.DejaVu18) 68 label_pow = Widgets.Label("pow:", 5, 95, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.DejaVu18) 69 BtnA.setCallback(type=BtnA.CB_TYPE.WAS_CLICKED, cb=btnA_wasClicked_event) 70 i2c0 = I2C(0, scl=Pin(39), sda=Pin(38), freq=100000) 71 motion = Motion(i2c0, 0x38) 72 last_time = time.ticks_us() 73 speed = 0 74 label_speed.setText(str((str("speed: ") + str(speed)))) 75 76 77def loop(): 78 global \ 79 label_speed, \ 80 title_e, \ 81 label_vol, \ 82 label_cur, \ 83 label_pow, \ 84 i2c0, \ 85 motion, \ 86 speed, \ 87 voltage, \ 88 curent, \ 89 last_time, \ 90 power 91 M5.update() 92 voltage = motion.read_voltage() 93 curent = motion.read_current() 94 power = motion.read_power() 95 label_vol.setText(str((str("vol: ") + str(voltage)))) 96 label_cur.setText(str((str("cur: ") + str(curent)))) 97 label_pow.setText(str((str("pow: ") + str(power)))) 98 99 100if __name__ == "__main__": 101 try: 102 setup() 103 while True: 104 loop() 105 except (Exception, KeyboardInterrupt) as e: 106 try: 107 from utility import print_error_msg 108 109 print_error_msg(e) 110 except ImportError: 111 print("please update to latest firmware")
示例输出:
无
API应用
Motion
- class base.motion.Motion(i2c, address=0x38)
创建一个 Motion 对象。
- 参数:
i2c (I2C) – 要使用的 I2C 端口。
address (int) – 设备地址,默认为 0x38。
UiFlow2 代码块:

MicroPython 代码块:
from base import Motion from machine import I2C i2c0 = I2C(0, scl=Pin(39), sda=Pin(38), freq=100000) motion = Motion(i2c0, 0x38)
- get_servo_angle(ch)
获取舵机角度。
UiFlow2 代码块:

MicroPython 代码块:
motion.get_servo_angle()
- set_servo_angle(ch, angle)
设置舵机角度。
UiFlow2 代码块:

MicroPython 代码块:
motion.set_servo_angle()
- get_servo_pulse(ch)
获取舵机控制信号的脉冲宽度。
UiFlow2 代码块:

MicroPython 代码块:
motion.get_servo_pulse()
- write_servo_pulse(ch, pulse)
写舵机控制信号脉冲宽度。
UiFlow2 代码块:

MicroPython 代码块:
motion.write_servo_pulse()
- get_motor_speed(ch)
获取电机转速。
UiFlow2 代码块:

MicroPython 代码块:
motion.get_motor_speed()
- set_motor_speed(ch, speed)
设置电机转速。
UiFlow2 代码块:

MicroPython 代码块:
motion.set_motor_speed()
- read_voltage()
读取电压(单位:V)。
- 返回:
电压值(以伏特为单位)。
- 返回类型:
备注
此方法仅在 Motion Base v1.1 及更高版本中支持。
UiFlow2 代码块:

MicroPython 代码块:
motion.read_voltage()
- read_current()
读取电流(单位:A)。
- 返回:
电流值(以安培为单位)。
- 返回类型:
备注
此方法仅在 Motion Base v1.1 及更高版本中支持。
UiFlow2 代码块:

MicroPython 代码块:
motion.read_current()




