Roller485 Unit
支持以下产品:
Roller485 I2C 应用示例:
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 unit import Roller485Unit 10 11 12title0 = None 13label0 = None 14label1 = None 15label2 = None 16label3 = None 17label4 = None 18i2c1 = None 19roller485_0 = None 20 21 22output = None 23mode = None 24 25 26def btn_b_was_clicked_event(state): 27 global title0, label0, label1, label2, label3, label4, i2c1, roller485_0, output, mode 28 output = output ^ (0x01 << 0) 29 roller485_0.set_motor_output_state(output) 30 31 32def btn_a_was_clicked_event(state): 33 global title0, label0, label1, label2, label3, label4, i2c1, roller485_0, output, mode 34 mode = mode + 1 35 if mode > 4: 36 mode = 1 37 38 39def setup(): 40 global title0, label0, label1, label2, label3, label4, i2c1, roller485_0, output, mode 41 42 M5.begin() 43 Widgets.fillScreen(0x222222) 44 title0 = Widgets.Title("Roller485 I2C Example", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18) 45 label0 = Widgets.Label("mode:", 1, 63, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 46 label1 = Widgets.Label("motor state:", 2, 108, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 47 label2 = Widgets.Label("speed:", 2, 152, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 48 label3 = Widgets.Label("mode", 40, 215, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 49 label4 = Widgets.Label("on/off", 126, 215, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 50 51 BtnB.setCallback(type=BtnB.CB_TYPE.WAS_CLICKED, cb=btn_b_was_clicked_event) 52 BtnA.setCallback(type=BtnA.CB_TYPE.WAS_CLICKED, cb=btn_a_was_clicked_event) 53 54 i2c1 = I2C(1, scl=Pin(22), sda=Pin(21), freq=100000) 55 roller485_0 = Roller485Unit(i2c1, address=0x64, mode=Roller485Unit.I2C_MODE) 56 roller485_0.set_motor_output_state(0) 57 output = roller485_0.get_motor_output_state() 58 mode = roller485_0.get_motor_mode() 59 label0.setText(str((str("mode:") + str(mode)))) 60 label1.setText(str((str("motor state:") + str(output)))) 61 62 63def loop(): 64 global title0, label0, label1, label2, label3, label4, i2c1, roller485_0, output, mode 65 M5.update() 66 label0.setText(str((str("mode:") + str(mode)))) 67 label1.setText(str((str("motor state:") + str(output)))) 68 if mode == 1: 69 roller485_0.set_motor_speed(20000) 70 roller485_0.set_speed_max_current(400) 71 label2.setText(str((str("speed:") + str((roller485_0.get_motor_speed_readback()))))) 72 elif mode == 2: 73 roller485_0.set_motor_position(1000) 74 roller485_0.set_position_max_current(400) 75 label2.setText(str((str("position:") + str((roller485_0.get_motor_position_readback()))))) 76 elif mode == 3: 77 roller485_0.set_motor_max_current(400) 78 label2.setText(str((str("current:") + str((roller485_0.get_motor_current_readback()))))) 79 elif mode == 4: 80 label2.setText(str((str("encoder:") + str((roller485_0.get_encoder_value()))))) 81 roller485_0.set_motor_mode(mode) 82 83 84if __name__ == "__main__": 85 try: 86 setup() 87 while True: 88 loop() 89 except (Exception, KeyboardInterrupt) as e: 90 try: 91 from utility import print_error_msg 92 93 print_error_msg(e) 94 except ImportError: 95 print("please update to latest firmware")
Roller485 I2C UiFlow2 应用示例:
roller485_i2c_fire_example.m5f2
Roller485 RS485 应用示例:
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 unit import Roller485Unit 10from unit import RS485Unit 11 12 13title0 = None 14label0 = None 15label1 = None 16label2 = None 17label3 = None 18label4 = None 19rs485_0 = None 20roller485_0 = None 21 22 23output = None 24mode = None 25 26 27def btn_b_was_clicked_event(state): 28 global title0, label0, label1, label2, label3, label4, rs485_0, roller485_0, output, mode 29 output = output ^ (0x01 << 0) 30 roller485_0.set_motor_output_state(output) 31 32 33def btn_a_was_clicked_event(state): 34 global title0, label0, label1, label2, label3, label4, rs485_0, roller485_0, output, mode 35 mode = mode + 1 36 if mode > 4: 37 mode = 1 38 39 40def setup(): 41 global title0, label0, label1, label2, label3, label4, rs485_0, roller485_0, output, mode 42 43 M5.begin() 44 Widgets.fillScreen(0x222222) 45 title0 = Widgets.Title( 46 "Roller485 RS485 Example", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18 47 ) 48 label0 = Widgets.Label("mode:", 1, 63, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 49 label1 = Widgets.Label("motor state:", 2, 108, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 50 label2 = Widgets.Label("speed:", 2, 152, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 51 label3 = Widgets.Label("mode", 40, 215, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 52 label4 = Widgets.Label("on/off", 126, 215, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 53 54 BtnB.setCallback(type=BtnB.CB_TYPE.WAS_CLICKED, cb=btn_b_was_clicked_event) 55 BtnA.setCallback(type=BtnA.CB_TYPE.WAS_CLICKED, cb=btn_a_was_clicked_event) 56 57 rs485_0 = RS485Unit(2, port=(13, 15)) 58 rs485_0.init( 59 tx_pin=None, 60 rx_pin=None, 61 baudrate=115200, 62 data_bits=None, 63 stop_bits=None, 64 parity=None, 65 ctrl_pin=None, 66 ) 67 roller485_0 = Roller485Unit(rs485_0, address=0, mode=Roller485Unit.RS485_MODE) 68 roller485_0.set_motor_output_state(0) 69 output = 0 70 mode = roller485_0.get_motor_mode() 71 label0.setText(str((str("mode:") + str(mode)))) 72 label1.setText(str((str("motor state:") + str(output)))) 73 74 75def loop(): 76 global title0, label0, label1, label2, label3, label4, rs485_0, roller485_0, output, mode 77 M5.update() 78 label0.setText(str((str("mode:") + str(mode)))) 79 label1.setText(str((str("motor state:") + str(output)))) 80 if mode == 1: 81 roller485_0.set_motor_speed(20000) 82 roller485_0.set_speed_max_current(400) 83 label2.setText(str((str("speed:") + str((roller485_0.get_motor_speed_readback()))))) 84 elif mode == 2: 85 roller485_0.set_motor_position(1000) 86 roller485_0.set_position_max_current(400) 87 label2.setText(str((str("position:") + str((roller485_0.get_motor_position_readback()))))) 88 elif mode == 3: 89 roller485_0.set_motor_max_current(400) 90 label2.setText(str((str("current:") + str((roller485_0.get_motor_current_readback()))))) 91 elif mode == 4: 92 label2.setText(str((str("encoder:") + str((roller485_0.get_encoder_value()))))) 93 roller485_0.set_motor_mode(mode) 94 95 96if __name__ == "__main__": 97 try: 98 setup() 99 while True: 100 loop() 101 except (Exception, KeyboardInterrupt) as e: 102 try: 103 from utility import print_error_msg 104 105 print_error_msg(e) 106 except ImportError: 107 print("please update to latest firmware")
Roller485 RS485 UiFlow2 应用示例:
roller485_485_fire_example.m5f2
Roller485 RS485ToI2C 应用示例:
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 unit import Roller485Unit 10from unit import RS485Unit 11from unit import ENVUnit 12 13 14title0 = None 15label5 = None 16label0 = None 17label6 = None 18label1 = None 19label2 = None 20label3 = None 21label4 = None 22env2_0 = None 23rs485_0 = None 24roller485_0 = None 25 26 27output = None 28mode = None 29 30 31def btn_b_was_clicked_event(state): 32 global \ 33 title0, \ 34 label5, \ 35 label0, \ 36 label6, \ 37 label1, \ 38 label2, \ 39 label3, \ 40 label4, \ 41 env2_0, \ 42 rs485_0, \ 43 roller485_0, \ 44 output, \ 45 mode 46 output = output ^ (0x01 << 0) 47 roller485_0.set_motor_output_state(output) 48 49 50def btn_a_was_clicked_event(state): 51 global \ 52 title0, \ 53 label5, \ 54 label0, \ 55 label6, \ 56 label1, \ 57 label2, \ 58 label3, \ 59 label4, \ 60 env2_0, \ 61 rs485_0, \ 62 roller485_0, \ 63 output, \ 64 mode 65 mode = mode + 1 66 if mode > 4: 67 mode = 1 68 69 70def setup(): 71 global \ 72 title0, \ 73 label5, \ 74 label0, \ 75 label6, \ 76 label1, \ 77 label2, \ 78 label3, \ 79 label4, \ 80 env2_0, \ 81 rs485_0, \ 82 roller485_0, \ 83 output, \ 84 mode 85 86 M5.begin() 87 Widgets.fillScreen(0x222222) 88 title0 = Widgets.Title( 89 "Roller485 485ToI2C Example", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18 90 ) 91 label5 = Widgets.Label("temp:", 182, 66, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 92 label0 = Widgets.Label("mode:", 1, 63, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 93 label6 = Widgets.Label("humi:", 182, 131, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 94 label1 = Widgets.Label("motor state:", 2, 108, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 95 label2 = Widgets.Label("speed:", 2, 152, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 96 label3 = Widgets.Label("mode", 40, 215, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 97 label4 = Widgets.Label("on/off", 126, 215, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18) 98 99 BtnB.setCallback(type=BtnB.CB_TYPE.WAS_CLICKED, cb=btn_b_was_clicked_event) 100 BtnA.setCallback(type=BtnA.CB_TYPE.WAS_CLICKED, cb=btn_a_was_clicked_event) 101 102 rs485_0 = RS485Unit(2, port=(13, 15)) 103 rs485_0.init( 104 tx_pin=None, 105 rx_pin=None, 106 baudrate=115200, 107 data_bits=None, 108 stop_bits=None, 109 parity=None, 110 ctrl_pin=None, 111 ) 112 roller485_0 = Roller485Unit(rs485_0, address=0, mode=Roller485Unit.RS485_TO_I2C_MODE) 113 env2_0 = ENVUnit(i2c=roller485_0, type=2) 114 roller485_0.set_motor_output_state(0) 115 output = 0 116 mode = roller485_0.get_motor_mode() 117 label0.setText(str((str("mode:") + str(mode)))) 118 label1.setText(str((str("motor state:") + str(output)))) 119 120 121def loop(): 122 global \ 123 title0, \ 124 label5, \ 125 label0, \ 126 label6, \ 127 label1, \ 128 label2, \ 129 label3, \ 130 label4, \ 131 env2_0, \ 132 rs485_0, \ 133 roller485_0, \ 134 output, \ 135 mode 136 M5.update() 137 label0.setText(str((str("mode:") + str(mode)))) 138 label1.setText(str((str("motor state:") + str(output)))) 139 label5.setText(str((str("temp:") + str((env2_0.read_temperature()))))) 140 label6.setText(str((str("humi:") + str((env2_0.read_pressure()))))) 141 if mode == 1: 142 roller485_0.set_motor_speed(20000) 143 roller485_0.set_speed_max_current(400) 144 label2.setText(str((str("speed:") + str((roller485_0.get_motor_speed_readback()))))) 145 elif mode == 2: 146 roller485_0.set_motor_position(1000) 147 roller485_0.set_position_max_current(400) 148 label2.setText(str((str("position:") + str((roller485_0.get_motor_position_readback()))))) 149 elif mode == 3: 150 roller485_0.set_motor_max_current(400) 151 label2.setText(str((str("current:") + str((roller485_0.get_motor_current_readback()))))) 152 elif mode == 4: 153 label2.setText(str((str("encoder:") + str((roller485_0.get_encoder_value()))))) 154 roller485_0.set_motor_mode(mode) 155 156 157if __name__ == "__main__": 158 try: 159 setup() 160 while True: 161 loop() 162 except (Exception, KeyboardInterrupt) as e: 163 try: 164 from utility import print_error_msg 165 166 print_error_msg(e) 167 except ImportError: 168 print("please update to latest firmware")
Roller485 RS485ToI2C UiFlow2 应用示例:
roller485_485toi2c_fire_example.m5f2
class Roller485Unit
Constructors
- class Roller485Unit(bus, address, mode)
根据通信模式初始化 Roller485Unit 对象。
- 参数:
bus – I2C/RS485 总线实例。
address – 电机的 RS485 地址。默认为 _ROLLER485_RS485_ADDR。
mode – Roller485 通信模式。
UIFLOW2:

class RollerBase
Constructors
- class RollerBase
Methods
- RollerBase.set_motor_over_range_protect_state(state) None
设置电机超量程保护状态。
- 参数:
state (int) – 保护状态值(1 表示启用,0 表示禁用)。
UIFLOW2:

- RollerBase.get_motor_over_range_protect_state() bool
获取电机超范围保护状态。
- 返回:
如果已启用保护则为 True,否则为 False。
UIFLOW2:

- RollerBase.set_button_change_mode(state) None
设置按钮切换模式。
- 参数:
state (int) – 更改模式状态值(1 表示启用,0 表示禁用)。
UIFLOW2:

- RollerBase.set_motor_jam_protect_state(state) None
设置电机堵转保护启用/禁用。
- 参数:
state (int) – 保护状态值(1 表示启用,0 表示禁用)。
UIFLOW2:

- RollerBase.get_motor_jam_protect_state() bool
获取电机卡滞保护状态。
- 返回:
如果启用了防夹保护,则为 True,否则为 False。
UIFLOW2:

- RollerBase.set_speed_max_current(current) None
设置电机速度和最大电流设置。
- 参数:
current (int) – 要设置的最大电流值。
UIFLOW2:

- RollerBase.set_position_max_current(current) None
设置电机位置和最大电流设置。
- 参数:
current (int) – 要设置的最大电流值。
UIFLOW2:

- RollerBase.set_motor_max_current(current) None
设置电机最大电流。
- 参数:
current (int) – 电机的最大电流,在发送前乘以 100。
UIFLOW2:

class RollerI2C(RollerBase)
Constructors
Methods
class Roller485(RollerBase)
Constructors
Methods
- Roller485.read(register, length) bytes
通过 RS485 从指定寄存器读取数据。
- 参数:
register – 要读取的寄存器名称。
length – 要读取的字节数。
- Roller485.create_frame(cmd, motor_id, *datas) None
根据给定的命令和电机 ID 创建命令帧。
- 参数:
cmd – 命令字节。
motor_id – 电机的 ID。
datas – 要包含在帧中的额外数据字节。
- Roller485.write(register, bytes) bool
通过 RS485 将数据写入指定寄存器。
- 参数:
register – 要写入的寄存器名称。
bytes – 要写入寄存器的数据,格式为 bytes 对象。
- 返回:
写入数据后的响应。
- Roller485.send_command(cmd, id, data, buf_len) bool
通过 RS485 发送命令。
- 参数:
cmd – 命令字节。
id – 电机 ID。
data – 与命令一起发送的数据。
buf_len – 缓冲区的长度。
class Roller485ToI2CBus(RollerBase)
Constructors
- class Roller485ToI2CBus(bus, address, mode)
初始化 Roller485ToI2CBus 对象。
- 参数:
bus – RS485 总线实例。
address – 电机的 RS485 地址。默认为 _ROLLER485_RS485_ADDR。
Methods
- Roller485ToI2CBus.readfrom_mem(addr, mem_addr, nbytes) bytes
从 I2C 从设备的指定寄存器读取数据。
- 参数:
addr – 要读取的 I2C 从机地址。
mem_addr – 内存寄存器地址。
nbytes – 要读取的字节数。
- 返回:
从寄存器读取的数据。
- 抛出 Exception 异常:
如果读取操作失败。
- Roller485ToI2CBus.readfrom_mem_into(addr, mem_addr, buf)
从 I2C 从设备的指定寄存器读取数据。
- 参数:
addr – 要读取的 I2C 从机地址。
mem_addr – 内存寄存器地址。
buf – 用于存储数据的缓冲区。
- Roller485ToI2CBus.writeto_mem(addr, mem_addr, buf) Literal[True]
将数据写入 I2C 从设备的指定寄存器。
- 参数:
addr – 要写入的 I2C 从设备地址。
mem_addr – 内存寄存器地址。
buf – 要写入的数据字节。
- 返回:
如果写入操作成功,则为 True。
- 抛出 Exception 异常:
如果写入操作失败。
- Roller485ToI2CBus.readfrom(addr, nbytes) bytes
通过 RS485 从 I2C 从设备读取数据。
- 参数:
addr – 要读取的 I2C 从机地址。
nbytes – 要读取的字节数。
- 返回:
从 I2C 从设备读取的数据。
- 抛出 Exception 异常:
如果读取操作失败。
- Roller485ToI2CBus.readfrom_into(addr, buf)
通过 RS485 从 I2C 从设备读取数据。
- 参数:
addr – I2C 设备地址。
buf – 用于存储数据的缓冲区。
- Roller485ToI2CBus.writeto(addr, buf, stop) Literal[True]
通过 RS485 向 I2C 从设备写入数据。
- 参数:
addr – 要写入的 I2C 从设备地址。
buf – 要写入的数据字节。
stop – 写入后是否发送停止位。
- 返回:
如果写入操作成功,则为 True。
- 抛出 Exception 异常:
如果写入操作失败。
- Roller485ToI2CBus.scan(addr, buf, stop) List
扫描 I2C 总线上的设备。
- 返回:
找到的 I2C 设备地址列表。











































