请先阅读《常用电机介绍以及用法》,了解清楚自己现使用的电机参数、接线方式、供电电压。以免造成烧坏主板或者电机的后果。
I2C与串口通讯不能共用,只能选择其中一个。

主板与驱动板使用串口通讯时,只需将主板上的USB口与四路电机驱动板的TYPE-C口相连。
| 电机 | 四路电机驱动板(Motor) |
|---|---|
| M2 | M- |
| V | 3V3 |
| A | H1A |
| B | H1B |
| G | GND |
| M1 | M+ |
主板接入驱动板的USB后,可以使用以下指令来查询是否识别到了串口。
ll /dev/ttyUSB*
正常情况下会显示/dev/ttyUSB0,如果没有ttyUSB0,而是ttyUSB1,则需要在代码开头部分的port='/dev/ttyUSB0' 改成 port='/dev/ttyUSB1'
然后使用文件传输软件,例如WinSCP,软件需要自行搜索下载。将py文件通过软件传输到主板的根目录下,然后打开终端,运行指令:
xxxxxxxxxxsudo python ~/USART.py
xUPLOAD_DATA = 3 #0:不接受数据 1:接收总的编码器数据 2:接收实时的编码器 3:接收电机当前速度 mm/s #0: Do not receive data 1: Receive total encoder data 2: Receive real-time encoder 3: Receive current motor speed mm/s
MOTOR_TYPE = 1 #1:520电机 2:310电机 3:测速码盘TT电机 4:TT直流减速电机 5:L型520电机 #1:520 motor 2:310 motor 3:speed code disc TT motor 4:TT DC reduction motor 5:L type 520 motor如果是需要驱动电机并观察数据,只修改程序开头的这两个数字就可以了,代码的其余部分不需要做任何更改。
xxxxxxxxxxdef set_motor_parameter():
if MOTOR_TYPE == 1: set_motor_type(1) # 配置电机类型 time.sleep(0.1) set_pluse_phase(30) # 配置减速比,查电机手册得出 time.sleep(0.1) set_pluse_line(11) # 配置磁环线,查电机手册得出 time.sleep(0.1) set_wheel_dis(67.00) # 配置轮子直径,测量得出 time.sleep(0.1) set_motor_deadzone(1900) # 配置电机死区,实验得出 time.sleep(0.1)
elif MOTOR_TYPE == 2: set_motor_type(2) time.sleep(0.1) set_pluse_phase(20) time.sleep(0.1) set_pluse_line(13) time.sleep(0.1) set_wheel_dis(48.00) time.sleep(0.1) set_motor_deadzone(1600) time.sleep(0.1)
elif MOTOR_TYPE == 3: set_motor_type(3) time.sleep(0.1) set_pluse_phase(45) time.sleep(0.1) set_pluse_line(13) time.sleep(0.1) set_wheel_dis(68.00) time.sleep(0.1) set_motor_deadzone(1250) time.sleep(0.1)
elif MOTOR_TYPE == 4: set_motor_type(4) time.sleep(0.1) set_pluse_phase(48) time.sleep(0.1) set_motor_deadzone(1000) time.sleep(0.1)
elif MOTOR_TYPE == 5: set_motor_type(1) time.sleep(0.1) set_pluse_phase(40) time.sleep(0.1) set_pluse_line(11) time.sleep(0.1) set_wheel_dis(67.00) time.sleep(0.1) set_motor_deadzone(1900) time.sleep(0.1)
这里用于存储本店在售电机的参数,通过修改上方的MOTOR_TYPE参数,就可以实现一键配置。正常情况下使用本店的电机不要修改此处的代码。如果使用的是自己的电机,或者说某项数据需要根据自己的需求来修改,那么可以查看文档《4路电机驱动板控制指令》来了解每一项指令的具体含义。
xxxxxxxxxxif __name__ == "__main__": try: t = 0 print("please wait...") send_upload_command(UPLOAD_DATA)#给电机模块发送需要上报的数据 Send the data that needs to be reported to the motor module time.sleep(0.1) set_motor_parameter()#设计电机参数 Design motor parameters
while True: received_message = receive_data() # 接收消息 Receiving Messages if received_message: # 如果有数据返回 If there is data returned parsed = parse_data(received_message) # 解析数据 Parsing the data if parsed: print(parsed) # 打印解析后的数据 Print the parsed data
t += 10 M1 = t M2 = t M3 = t M4 = t
if MOTOR_TYPE == 4: control_pwm(M1*2, M2*2, M3*2, M4*2) else: control_speed(M1, M2, M3, M4)#直接发送命令控制电机 Send commands directly to control the motor
if t> 1000 or t < -1000: t = 0
time.sleep(0.1)
主程序循环会将四个电机的速度从0开始慢慢加到1000,如果电机类型选择的是4,即无编码器的电机,那就是直接控制电机的pwm。同时读取驱动板发送上来的数据,并一边将数据打印出来。
xxxxxxxxxxdef parse_data(data): data = data.strip() # 去掉两端的空格或换行符 Remove spaces or line breaks at both ends
if data.startswith("$MAll:"): values_str = data[6:-1] # 去除 "$MAll:" 和 "#" Remove "$MAll:" and "#" values = list(map(int, values_str.split(','))) # 分割并转换为整数 Split and convert to integer parsed = ', '.join([f"M{i+1}:{value}" for i, value in enumerate(values)]) return parsed elif data.startswith("$MTEP:"): values_str = data[6:-1] values = list(map(int, values_str.split(','))) parsed = ', '.join([f"M{i+1}:{value}" for i, value in enumerate(values)]) return parsed elif data.startswith("$MSPD:"): values_str = data[6:-1] values = [float(value) if '.' in value else int(value) for value in values_str.split(',')] parsed = ', '.join([f"M{i+1}:{value}" for i, value in enumerate(values)]) return parsed
将保存到的原始数据进行提取,重新组成一个新的打印格式。
将驱动板上的type-c口与主板上的USB口连接后,将程序放置于根目录下,运行指令sudo python ~/USART.py,可以看见电机会逐渐变快,然后又停下,重复如此。同时在终端里能看见打印的电机数值在不断的变化。
