感谢龙哥指导使用如此优秀的上位机调参软件快速实现基于pyb开发的机器人PID参数的调节整定。
匿名工作站上位机简介
【经验篇】匿名上位机4.34简单上手
使用匿名工作站上位机可以快速完成对机器人底盘电机的PID参数整定,而且绘图速度极快,基本无延时,所以用起来很方便,只需要使用Micorpython写通串口通信的协议,即可实现和上位机的通信。
上位机参数配置
(1)高级收码
需要配置3个地方:
- 帧格式需要使能该帧,然后保存设置。
- 数据容器设置
- 一般只用一帧,其中包含多组数据,
第二个数据:
第三个数据:
依次类推,本代码因为只发送了四个数据,所以到第四个即可。
(2)数据波形
选择用户数据波形,然后点击确定。
串口通信协议代码
在Micropython中打通和上位机的串口通信协议,从而实现下位机个上位机通过串口发送数据,上位机可以正确解读从而在上位机软件中实现绘图功能。
与上位机串口按照通信协议进行的发送函数封装,如果需要发送更多数据,只需增加或更改输入参数即可,调用该函数即可实现对上位机的数据发送任务。
import utimeclass Serial:def __init__(self, uart):self.uart = uartdef serial_pc(self, target_enc_A, enc_A, target_enc_B, enc_B ):'''函数功能:将需要发送到PC上位机(匿名工作站)的PID或其他参数转换成固定协议的格式,该函数需配合“匿名地面工作站”一起使用,用于PID实时绘图调参入口参数:需要发送的数据返回值 :无数据头 功能帧 数据长度 数据(任意多组) 校验位@ 匿名工作站通信协议: AAAA F1 xx xxxx xxxx xxxx xxxx sum(前边所有数据之和的低8位) '''def data_params_process(*params):'''@ 数据结构主体,传入任意需要发送的参数'''# 主数据int_data_list = []hex_data_list = []for data in params:int_data = int(data)if int_data >= 0: # 如果为正hex_data = hex(int_data)[2:] # 去除0x# 数据位处理if len(hex_data) <= 1:hex_data = "000" + hex_dataelif len(hex_data) <= 2:hex_data = "00" + hex_dataelif len(hex_data) <= 3:hex_data = "0" + hex_dataelse: # 负数int_data = int_data + 2**16 # 负数需将其加2^16,使其为 FFFF - abs(int_data)hex_data = hex(int_data)[2:] # 去除0xint_data_list.append(int_data)hex_data_list.append(hex_data)return int_data_list, hex_data_list# 数据位dec_data_list, hex_data_list = data_params_process(target_enc_A, enc_A, target_enc_B, enc_B ) # 输入数据# 数据头head1 = "AA"head2 = "AA"head3 = "F1"# 长度位length = str(2 * len(hex_data_list)) if len(length) <= 1:length = "0" + length# 校验位sum_head = int(head1, 16) + int(head2, 16) + int(head3, 16) + int(length, 16) # 数据头校验位sum_data = 0sum_data_list = []for i,data in enumerate(dec_data_list): # 数据体校验位sum_data = int(data/256) + int(data%256) + sum_datasum_data_list.append(int(data/256))sum_data_list.append(int(data%256))check_sum = (sum_head + sum_data) % 256# 整理发送数据send_data_list = [int(head1, 16), int(head2, 16), int(head3, 16), int(length, 16)] + sum_data_list + [check_sum]# 发送数据for i, send_data in enumerate(send_data_list):self.uart.writechar(send_data)
main.py调用方法
uart = UART(2, 115200, timeout=2) # 直接使用串口模块连接UART2
ser = serial.Serial(uart)
# 匿名工作站上位机调参
ser.serial_pc(target_enc_A, enc_A, target_enc_B, enc_B )
PID响应曲线绘图展示
下载链接:匿名地面站——Micropython调参神器
效果极好,用起来及其舒适,建议大家伙入手~