Motion Base

Atomic Motion Base 是一款专为 ATOM 系列控制器设计的舵机和直流电机驱动器。它内部集成了 STM32 控制芯片,并使用 I2C 通信进行控制。Atomic Motion Base 提供 4 路舵机通道和 2 路直流电机接口,方便用于需要控制多个舵机或电机的场景,如多舵机械臂或小车电机控制。

Atomic Motion Base v1.1 增加 INA266 实现电流,电压和功率检测。

支持以下产品:

Motion

Motion Base v1.1

UiFlow2 应用示例:

Motion Base

在 UiFlow2 上打开 atoms3_lite_motion_base_example.m5f2 项目。

此示例控制舵机旋转到指定角度,设置电机旋转。

UiFlow2 代码块:

example.png

示例输出:

Motion Base v1.1

在 UiFlow2 上打开 atoms3_motion_base_v1.1_example.m5f2 项目。

示例程序在按下屏幕按钮时切换电机的运行速度,屏幕显示当前的电流、电压和功率。

UiFlow2 代码块:

motion_base_v1.1_example.png

示例输出:

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

__init__.png

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)

获取舵机角度。

参数:

ch (int) – 舵机通道,范围:1~4。

返回:

指定通道舵机的角度,范围:0~180。

返回类型:

int

UiFlow2 代码块:

get_servo_angle.png

MicroPython 代码块:

motion.get_servo_angle()
set_servo_angle(ch, angle)

设置舵机角度。

参数:
  • ch (int) – 舵机通道,范围:1~4。

  • angle (int) – 舵机角度,范围:0~180。

UiFlow2 代码块:

set_servo_angle.png

MicroPython 代码块:

motion.set_servo_angle()
get_servo_pulse(ch)

获取舵机控制信号的脉冲宽度。

参数:

ch (int) – 舵机通道,范围:1~4。

返回:

指定通道舵机控制信号的脉冲宽度,范围:500~2500 (us)。

返回类型:

int

UiFlow2 代码块:

get_servo_pulse.png

MicroPython 代码块:

motion.get_servo_pulse()
write_servo_pulse(ch, pulse)

写舵机控制信号脉冲宽度。

参数:
  • ch (int) – 舵机通道,范围:1~4。

  • pulse (int) – 舵机控制信号脉冲宽度,范围:500~2500 (us)。

UiFlow2 代码块:

write_servo_pulse.png

MicroPython 代码块:

motion.write_servo_pulse()
get_motor_speed(ch)

获取电机转速。

参数:

ch (int) – 电机通道,范围:1~2。

返回:

指定通道电机的转速,范围:-127~127。

返回类型:

int

UiFlow2 代码块:

get_motor_speed.png

MicroPython 代码块:

motion.get_motor_speed()
set_motor_speed(ch, speed)

设置电机转速。

参数:
  • ch (int) – 电机通道,范围:1~2。

  • speed (int) – 电机转速,范围:-127~127。

UiFlow2 代码块:

set_motor_speed.png

MicroPython 代码块:

motion.set_motor_speed()
read_voltage()

读取电压(单位:V)。

返回:

电压值(以伏特为单位)。

返回类型:

float

备注

此方法仅在 Motion Base v1.1 及更高版本中支持。

UiFlow2 代码块:

read_voltage.png

MicroPython 代码块:

motion.read_voltage()
read_current()

读取电流(单位:A)。

返回:

电流值(以安培为单位)。

返回类型:

float

备注

此方法仅在 Motion Base v1.1 及更高版本中支持。

UiFlow2 代码块:

read_current.png

MicroPython 代码块:

motion.read_current()
read_power()

读取功率(单位:W)。

返回:

功率值(以瓦特为单位)。

返回类型:

float

备注

此方法仅在 Motion Base v1.1 及更高版本中支持。

UiFlow2 代码块:

read_power.png

MicroPython 代码块:

motion.read_power()