感谢龙哥指导使用如此优秀的上位机调参软件快速实现基于pyb开发的机器人PID参数的调节整定。

匿名工作站上位机简介

​​【经验篇】匿名上位机4.34简单上手​​

使用匿名工作站上位机可以快速完成对机器人底盘电机的PID参数整定,而且绘图速度极快,基本无延时,所以用起来很方便,只需要使用Micorpython写通串口通信的协议,即可实现和上位机的通信。

Micropython——使用匿名上位机工作站实现电机参数实时绘图并PID调参_数据

上位机参数配置

(1)高级收码

需要配置3个地方:

  • 帧格式需要使能该帧,然后保存设置。
  • 数据容器设置
  • 一般只用一帧,其中包含多组数据,

Micropython——使用匿名上位机工作站实现电机参数实时绘图并PID调参_串口通信_02

第二个数据:

Micropython——使用匿名上位机工作站实现电机参数实时绘图并PID调参_上位机_03

第三个数据:

Micropython——使用匿名上位机工作站实现电机参数实时绘图并PID调参_pid_04

依次类推,本代码因为只发送了四个数据,所以到第四个即可。

Micropython——使用匿名上位机工作站实现电机参数实时绘图并PID调参_串口通信_05

(2)数据波形

Micropython——使用匿名上位机工作站实现电机参数实时绘图并PID调参_python_06

选择用户数据波形,然后点击确定

Micropython——使用匿名上位机工作站实现电机参数实时绘图并PID调参_串口通信_07

串口通信协议代码

在Micropython中打通和上位机的串口通信协议,从而实现下位机个上位机通过串口发送数据,上位机可以正确解读从而在上位机软件中实现绘图功能。

与上位机串口按照通信协议进行的发送函数封装,如果需要发送更多数据,只需增加或更改输入参数即可,调用该函数即可实现对上位机的数据发送任务。

import utime

class Serial:
def __init__(self, uart):
self.uart = uart

def 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_data
elif len(hex_data) <= 2:
hex_data = "00" + hex_data
elif len(hex_data) <= 3:
hex_data = "0" + hex_data
else: # 负数
int_data = int_data + 2**16 # 负数需将其加2^16,使其为 FFFF - abs(int_data)
hex_data = hex(int_data)[2:] # 去除0x
int_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 = 0
sum_data_list = []
for i,data in enumerate(dec_data_list): # 数据体校验位
sum_data = int(data/256) + int(data%256) + sum_data
sum_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)

Micropython——使用匿名上位机工作站实现电机参数实时绘图并PID调参_上位机_08

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——使用匿名上位机工作站实现电机参数实时绘图并PID调参_pid_09

​​下载链接:匿名地面站——Micropython调参神器​​

效果极好,用起来及其舒适,建议大家伙入手~