请先阅读《常用电机介绍以及用法》,了解清楚自己现使用的电机参数、接线方式、供电电压。以免造成烧坏主板或者电机的后果。
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文件通过软件传输到主板的根目录下,然后打开终端,运行指令:
xxxxxxxxxx
sudo 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
如果是需要驱动电机并观察数据,只修改程序开头的这两个数字就可以了,代码的其余部分不需要做任何更改。
xxxxxxxxxx
def 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路电机驱动板控制指令》来了解每一项指令的具体含义。
xxxxxxxxxx
if __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。同时读取驱动板发送上来的数据,并一边将数据打印出来。
xxxxxxxxxx
def 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
,可以看见电机会逐渐变快,然后又停下,重复如此。同时在终端里能看见打印的电机数值在不断的变化。