QT实现步进电机控制和IMU数据读取显示

news2024/9/24 15:28:51

实现功能:

1.两步进电机分别使能和循环运动,可以设置循环次数、循环里分别运行的角度、旋转的速度和加减速度等等,在最下方的表格里显示发送和接收的CAN报文

2.读取水平电机当前位置和速度并画图显示,示波器暂停、缩放、滑动等功能

3.MCU监听串口IMU数据并通过TCP客户端发出

4.QT服务端接收TCP数据并进行解析,显示对应波形

监听TCP客户端

QT软件在初始化时,对指定TCP端口进行监听,并在成功连接后执行数据监听

Widget::Widget(QWidget *parent):
     QWidget(parent),
     ui(new Ui::Widget),
     time(QTime::currentTime())
{
    tcpServer = new QTcpServer(this);   //创建一个服务器类
    tcpSocket = new QTcpSocket(this);   //创建一个socket类
    tcpServer->listen(QHostAddress::Any,ui->portEdit->text().toUInt());    //服务器对端口号进行监听
    connect(tcpServer,SIGNAL(newConnection()),this,SLOT(newConnection_slot())); //有网络用户连接进来,就会执行槽函数
}

//当连接客户端tcp,执行相关函数
void Widget::newConnection_slot()
{
    qDebug() << "connected";
    tcpSocket = tcpServer->nextPendingConnection();     //获取与客户端进行通信的套接字
    ui->TCPButton->setStyleSheet("background:rgb(85,255,127)");
    connect(tcpSocket,&QTcpSocket::disconnected,this,&Widget::disonnection_slot); //有网络用户断开连接
    connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(readyRead_slot())); //客户端有数据到达服务器,就会产生readyRead信号
}
//当客户端断开连接执行相关函数
void Widget::disonnection_slot(){
    qDebug() << "disconnected";
    ui->TCPButton->setStyleSheet("background:rgb(255,255,127)");//按钮变绿提示已连接
}
//当有数据来,更新波形图
void Widget::readyRead_slot()
{
    int num = tcpSocket->read((char *)&imu_data_,sizeof(ImuData)*10);
    for(int i=0;i<(num/112);i++){
        PlotViewUpdate(1,imu_data_[i].gyro.z*PI/(180*16.4));
        PlotViewUpdate(3,imu_data_[i].ypr.yaw);
    }
    //ui->receTCPEdit->setText(QString::number(imu_data_[0].cnt));
}

这里imu_data_为结构体类型,这样服务端就能一次性接收完数据,无需按照各个变量分别接收

    struct ImuQuat {
        double w;
        double x;
        double y;
        double z;
    };
    struct ImuAcc {
        int16_t x;
        int16_t y;
        int16_t z;
    };

    struct ImuGyro {
        int16_t x;
        int16_t y;
        int16_t z;
    };

    struct ImuYpr {
        double yaw;
        double pitch;
        double roll;
    };

    struct ImuData {
        uint64_t timestamp;
        ImuQuat quat;
        ImuAcc acc;
        ImuGyro gyro;
        ImuGyro gyro_offset;
        ImuYpr ypr;
        uint16_t update_rate;
        uint64_t cnt;
        uint64_t imu_time;
    };
    ImuData imu_data_[10];

对于客户端,发送方式与之对应,imu_data_的数据格式与服务端一致

send(client_sockfd,(char*)&imu_data_,sizeof(ImuData),0);

CAN通信

使用ControlCAN库,需要对应版本,否则可以成功运行,但是Debug会报程序异常终止的错误

根据文档需要使能电机,激活操作模式为位置模式,同时设置运动参数,包括速度、加速度、减速度等,这样就完成了CAN电机的基本配置。

这里需要电机可以多段一直运行,设置电机的目标位置,启动多段运行。

在第一段运行后,执行CAN命令可以直接运行下一段 

 其中,数据的后四字节为数据,40 0D 03 00代表200000,而对应的十六进制为30D40,即按一字节划分,低位在前,符号位代表旋转的方向。

 CAN PDO通信(过程数据对象)

SDO是发-收的形式,频率无法提升,在读取电机速度时频率只有5Hz,这里考虑用PDO自动发送的方式提升数据更新频率。

1.PDO映射对应的SDO报文

采用Tx-PDO2

节点地址:280h + 1=281 COB_ID范围1-7F

第一步:关闭PDO分配功能,把对应PDO的COB-ID的最高位置1;

关闭TPDO2,报文:23 01 18 01 80 02 00 80

第二步:清除原有有映射的内容,把0X1600~0X1603和0X1A00~1A03的子索引置0;

设置映射对象的数量为0,报文为:2F 01 1A 00 00 00 00 00

第三步:写入PDO映射内容;

映射对象0X606C到TPDO2的子索引1中,报文为:23 01 1A 01 40 00 6C 60 电机速度

映射对象0X6064到TPDO2的子索引2中,报文为:23 01 1A 02 40 00 64 60 电机位置

此时发送报文的格式为:

第四步:写入该PDO映射对象的总个数;

设置映射对象总数量为2,报文为2F 01 1A 00 02 00 00 00

第五步:重新打开PDO分配功能,把对应PDO的COB-ID的最高位置0;

开启TPDO2,报文:23 01 18 01 80 02 00 00

第六步:保存所有参数,给对象字典(OD)1010的子索引0x01中写入“65766173h”(ASCII码:save)时执行保存;处理完成后,无论是否成功,此对象的值自动恢复为0;

保存所有参数,报文:23 10 10 01 73 61 76 65

2.配置异步模式的报文

同步模式需要同步帧,这里采用异步模式,当无事件发生时,按照Event timer上传数据;当有事件发生时,数据会立即上传。

配置异步模式的步骤:

第一步:将NMT状态切换到运行状态;

将NMT状态切换到运行状态:01 01 将COB_ID设置000

第二步:配置异步TPDO通道;

配置异步模式:23 01 18 02 FF 00 00 00

第三步:如果要读取驱动器相关参数,需要把NMT状态机切换到运行状态;
第四步:改变相关参数,数据会立即上传;
第五步:异步模式下设置Event timer

异步模式下,设置Event timer:2B 01 18 05 D0 07 00 00(设置事件时间为2000ms),当无事件发生时,按照2s上传数据;当有事件发生时,数据会立即上传;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976168.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CVPR24《Neural Markov Random Field for Stereo Matching》

论文地址&#xff1a; https://arxiv.org/abs/2403.11193 源码地址&#xff1a; https://github.com/aeolusguan/NMRF 概述 手工设计的MRF模型在传统的立体匹配中占据主导地位&#xff0c;但与端到端的深度学习模型相比&#xff0c;其建模准确性不足。尽管深度学习大大改进了MR…

力扣SQL50 修复表中的名字 字符串函数

Problem: 1667. 修复表中的名字 &#x1f468;‍&#x1f3eb; 参考题解 select user_id, CONCAT(UPPER(left(name, 1)), LOWER(RIGHT(name, length(name) - 1))) as name from Users order by user_id

SQL注入实例(sqli-labs/less-2)

0、初始网页 1、闭合方式判断 当没有闭合符号进行注释时&#xff0c;网页并没有报错&#xff0c;所以可以确定无闭合符号&#xff0c;为数值型注入 2、确定查询表的列数 可以确定列数小于4 ?id1 order by 4 -- 确定查询表的列数为3列 ?id1 order by 3 -- 3、确定回显位置…

MySQL系列之--关系型数据库以及SQL语句分类之DDL数据库和表的操作

文章目录 前言关系型数据库&#xff08;RDBMS&#xff09;关系型数据库的特点 MySQL数据模型SQL介绍基本语法规则SQL语句的分类DDL的介绍DDL的数据库操作DDL的表操作 前言 上一节MySQL系列之–详细安装教程和启动方法中介绍了MySQL如何安装&#xff0c;以及如何启动和客户端连接…

c++| c++11左右值引用,完美转发,可变参数模板,functional包装器,bind函数

c| c11的新特性 左&#xff0c;右值引用什么是左值&#xff0c;右值左值引用和右值引用右值引用解决什么问题呢&#xff1f;移动构造万能引用形式 完美转发格式 lambada表达式格式 可变参数模板可变参数模板实现打印不同类型emplace_push以list的emplace_back的实现举例包装器b…

新160个crackme - 020-cosh.3

运行分析 老规矩&#xff0c;需要破解Name和Serial PE分析 c程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 ida查找关键字符串 分析关键函数&#xff0c;得出以下结论&#xff1a;Name、Serial每一位进行亦或计算&#xff0c;若计算结果相等则弹窗成功 算法分析…

吴恩达机器学习作业-ex7(主成分分析)

data1 导入库&#xff0c;读取数据&#xff0c;并进行可视化数据 import numpy as np import scipy.io as sio import matplotlib.pyplot as plt#读取数据 path "./ex7data1.mat" data sio.loadmat(path) # print(data.keys()) X data.get("X") # pri…

Python数据分析案例58——热门游戏数据分析及其可视化

案例背景 有哪个男生不喜欢玩游戏呢&#xff1f;就算上了班儿也要研究一下游戏以及热门的游戏。正好这里有个热门的游戏数据集&#xff0c;全球热门游戏数据集来做一下一些可视化的分析。 数据介绍 该文件包含一个数据集&#xff0c;详细说明了多个平台上的各种流行游戏。每个…

【Golang 面试 - 进阶题】每日 3 题(十五)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

Cesium 高德地图暗黑化

Cesium 高德地图暗黑化 高德电子地图实现暗黑效果 // 设置图层滤镜new ImageryLayerFilter({viewer: viewer,imageryLayer: imageryLayer,});

YOLOv5轻量化改进 | backbone | 结合MobileNetV4(包含多个结构和使用方式)

YOLOv5轻量化改进 | backbone | 结合MobileNetV4(包含多个结构) 本文介绍论文原理介绍网络代码多种yaml设置网络测试及实验结果<!-- 这里放入论文图片 --> &emsp;;本文介绍 本文给大家带来的改进机制是结合MobileNetV4骨干网络,其中来自2024.5月发布的MobileNetV4…

Pageadmin 漏洞教程

上传文件解压拿webshell 用哥斯拉&#xff0c;生成一个asp木马 这个就是我们生成的asp木马 不能直接上传 压缩为zip文件 上传 上传以后我们点击解压 就成功了 然后我们去访问 然后用哥斯拉访问 然后再点击添加 这样就成功了 成功进入

VSCode在windows系统下的配置简单版

参考链接 从零开始的vscode安装及环境配置教程(C/C)(Windows系统)_vscode搭建编译器环境-CSDN博客 vscode生成tasks.json、launch.json、c_cpp_properties.json文件_vscode生成launch.json-CSDN博客 自动生成配置文件简单方便&#xff01;&#xff01;&#xff01; 运行c代…

点击clean失败的操作Error running ‘demo4 [clean]‘ No valid Maven installation found.

错误情况&#xff1a; 解决方法&#xff1a; 重新调整自己的maven&#xff1a; 点击settings&#xff0c;搜索maven&#xff0c;点击进入&#xff1a; 选择自己的真实路径&#xff1a; 效果: 可以发现&#xff0c;运行clean成功&#xff01;

Useless Fan

灵感来源于老外的一个作品&#xff0c;但是只有风扇功能&#xff0c;除了袖珍感觉没啥用。 在淘宝上十几块买了一堆原件&#xff0c;于是手痒&#xff0c;自己手搓了一个&#xff0c;设计了个简单的3D打印外壳。 包括3大功能&#xff1a;风扇&#xff0c;充电宝&#xff08;2…

Spring MVC 快速入门指南及实战演示

1、SpringMVC简介 1.1 背景 Servlet属于web层开发技术&#xff0c;技术特点&#xff1a; 1. 每个请求都需要创建一个Servlet进行处理 2. 创建Servlet存在重复操作 3. 代码灵活性低&#xff0c;开发效率低 是否有技术方案可以解决以上问题&#xff1f; 1.2 SpringMVC概述 Sp…

C#加班统计次数

C#加班统计次数 运行环境&#xff1a;vs2022 .net 8.0 社区版 1、用C#语言&#xff1b;2、有界面上传Excel文件; 3、对Excel列&#xff08;部门、人员姓名、人员编号、考勤时间 &#xff09;处理&#xff1a;&#xff08;1&#xff09;按人员编号、考勤日期分组且保留原来字段&…

矩阵快速幂优化dp

之前一直想找一个矩阵快速幂的专题&#xff0c;但是都没有题目来总结&#xff0c;今天就来水一下 这个题目的转移方程我们可以很快想出来&#xff0c;但是我们如何作为我们矩阵快速幂的敲门砖呢&#xff1f; 有一个问题要注意的是我们由于这题不是取模的&#xff0c;可能会溢出…

网络安全-渗透测试工具及插件介绍和使用方法

1、Burp Suite Burp Suite 是用于攻击web 应用程序的集成平台。 是一款广泛使用的网络安全工具套件&#xff0c;主要用于测试Web应用程序的安全性。它可以帮助安全研究人员、渗透测试人员和开发人员发现和利用Web应用程序中的安全漏洞。 &#xff08;1&#xff09;下载和安装&a…

QuanTide-weekly第1期

本周Po文 这周我们共发表5篇文章。《基于 XGBoost 的组合策略…》等两篇详细讲解了机器学习构建组合策略的框架和常见问题。 文章要点与结论&#xff1a; 通过两阶段式方案实现多因子、多资产的组合策略构建。第一阶段基于XGBoost构建多个多因子单标的模型&#xff0c;第二阶…