Micropython——使用匿名上位机工作站实现电机参数实时绘图并PID调参
原创
©著作权归作者所有:来自51CTO博客作者IrvingGao的原创作品,请联系作者获取转载授权,否则将追究法律责任
感谢龙哥指导使用如此优秀的上位机调参软件快速实现基于pyb开发的机器人PID参数的调节整定。
匿名工作站上位机简介
【经验篇】匿名上位机4.34简单上手
使用匿名工作站上位机可以快速完成对机器人底盘电机的PID参数整定,而且绘图速度极快,基本无延时,所以用起来很方便,只需要使用Micorpython写通串口通信的协议,即可实现和上位机的通信。
上位机参数配置
(1)高级收码
需要配置3个地方:
第二个数据:
第三个数据:
依次类推,本代码因为只发送了四个数据,所以到第四个即可。
(2)数据波形
选择用户数据波形,然后点击确定。
串口通信协议代码
在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)
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调参神器
效果极好,用起来及其舒适,建议大家伙入手~
上一篇: 树莓派4B——报错解决:from RPi._GPIO import * RuntimeError: Not running on a RPi! with Ubuntu for Raspberry Pi
下一篇: 机械臂机器人——使用Matlab Robotic ToolBox建立四轴机械臂模型并实现运动控制仿真