概述
本文介绍如何通过匿名通信协议将LSM6DSV16X传感器的姿态数据上报给上位机。通过获取传感器的四元数数据并将其转换为欧拉角(Roll、Pitch、Yaw),然后根据协议格式化数据帧并通过串口传输到上位机。上位机接收后可进行实时显示和分析。该方法广泛应用于姿态检测与控制系统,特别适合无人机、机器人等需要姿态控制的场景。
我目前正在学习ST 和Renesas RA 课程。如果需要样品,可以进群申请:615061293。
视频教学
[https://www.bilibili.com/video/BV1sS5bzkEU9/]
样品申请
[https://www.wjx.top/vm/OhcKxJk.aspx#]
源码下载
[https://download.csdn.net/download/qq_24312945/91359810]
硬件准备
首先需要准备一块开发板。我这里准备的是自己画的开发板。如果您需要的话,可以申请。
主控为STM32H503CB,陀螺仪为LSM6DSV16X,磁力计为LIS2MDL。
参考程序
[https://github.com/CoreMaker-lab/STM32H503_LSM6DSV16X_LIS2MDL]
[https://gitee.com/CoreMaker/STM32H503_LSM6DSV16X_LIS2MDL]
上位机通讯
这里使用的是匿名助手的主机。
https://gitee.com/anotc/AnoAssistant
有专门的通讯协议
串口通信协议格式如下。需要注意的是,传输是小端模式。
对应的源地址和目的地址分别为0xFD和0xFE。
我们只需要上报加速度和陀螺仪数据,所以功能码为0x01,数据长度为0x0D,需要主要以little endian模式传输。
陀螺仪工作方式
加速度计测量线性加速度,而陀螺仪测量角旋转。为此,他们测量了科里奥利效应产生的力。
陀螺仪是一种运动传感器,能够感测物体在一个或多个轴上的旋转角速率。它可以准确地感知自由空间中的复杂运动,使其成为跟踪物体的运动、方向和旋转的必备设备。与加速度计和电子罗盘不同,陀螺仪不需要依赖外力(例如重力或磁场),可以自主执行其功能。因此,理论上,仅利用陀螺仪就可以完成姿态导航的任务。
陀螺仪的每个通道检测一个轴的旋转。也就是说,陀螺仪可以通过测量自身的旋转状态来确定设备当前的运动状态,是向前、向后、上、下、左、右,是加速(角速度)还是减速(角速度),但无法确定设备的方位(北、东、西、南)。
MEMS陀螺仪主要利用科里奥利力(旋转物体进行径向运动时所受到的切向力)原理。公开的微机械陀螺仪均采用感测振动物体角速度的概念,利用振动来感应和检测科里奥利力。
MEMS陀螺仪的核心是微加工机械单元,其设计为根据音叉机构共振运动,并通过科里奥利力原理将角速率转换为特定传感结构的位移。
两个相同质量的物体沿相反方向水平振荡。当外部施加角速率时,就会出现科里奥利力。力的方向垂直于质量运动的方向,如垂直箭头所示。产生的科里奥利力使传感质量发生位移,并且位移与施加的角速率成正比。角速率可以根据科里奥利力引起的电容变化来计算。
科里奥利效应指出,当质量(m) 以速度(v) 沿特定方向移动并应用外部角速率()(红色箭头)时,科里奥利效应会产生一个力(黄色箭头),导致质量垂直移动。该位移的值与所施加的角速率直接相关。
变量定义。
/* 用户代码开始2 */float 偏航、俯仰、横滚; //偏航角、俯仰角、横滚角int16_t acc_int16[3]={0,0,0}; int16_t gyr_int16[3]={0,0,0};浮点数acc[3]={0};浮动陀螺仪[3]={0}; uint8_t 数据[21]={0}; data[0]=0xAB;//帧头data[1]=0xFD;//源地址data[2]=0xFE;//目的地址data[3]=0x01;//功能码ID data[4]=0x0D;//数据长度LEN data[5]=0x00;//数据长度LEN 13 uint8_t sumcheck=0; uint8_t addcheck=0; int16_t angular_rate_raw[3]={0,0,0}; //俯仰、横滚、偏航uint8_t data_angular_rate_raw[16]={0}; data_angular_rate_raw[0]=0xAB;//帧头data_angular_rate_raw[1]=0xFD;//源地址data_angular_rate_raw[2]=0xFE;//目的地址data_angular_rate_raw[3]=0x03;//功能码ID data_angular_rate_raw[4]=0x08;//数据长度LEN data_angular_rate_raw[5]=0x00;//数据长度LEN 8 data_angular_rate_raw[6]=0x01;//mode=1 data_angular_rate_raw[13]=0x00;//FUSION_STA:融合状态/* USER CODE END 2 */
欧拉角数据的转换
将欧拉角Roll、Pitch、Yaw乘以100以保留两位小数的准确性。而Yaw数据减去18000,通常是为了将欧拉角的范围转换为[-18000, 18000]的范围,以方便传输。
滚=欧拉[2];螺距=欧拉[1];偏航=欧拉[0]; int16_t Roll_int16; int16_t Pitch_int16; int16_t Yaw_int16; (int16_t)(偏航); Roll_int16=Roll_int16*100; Pitch_int16=Pitch_int16*100; Yaw_int16=Yaw_int16*100-18000;
数据帧填充
将转换后的Roll_int16、Pitch_int16 和Yaw_int16 数据依次填充到数据帧的相应位置。
//横滚=横滚*100;//俯仰=俯仰*100;//偏航=偏航*100; data_angular_rate_raw[7]=Roll_int16 8;//滚动data_angular_rate_raw[8]=Roll_int16; data_angular_rate_raw[9]=Pitch_int16 8;//音高data_angular_rate_raw[10]=Pitch_int16; data_angular_rate_raw[11]=Yaw_int16 8;//偏航data_angular_rate_raw[12]=Yaw_int16;
校验和计算
采用双层循环求和来计算校验和,是一种累加求和的方法,保证帧数据的完整性。
data_angle_rate_raw[13]=0;总和检查=0;添加检查=0; for(uint16_t i=0; i 14; i++) { sumcheck +=data_angular_rate_raw[i]; //从帧头开始,对每个字节求和,直到DATA区末尾addcheck +=sumcheck; //对每个字节求和操作,进行一次sumcheck累加} data_angular_rate_raw[14]=sumcheck; data_angular_rate_raw[15]=addcheck;
数据发送
通过UART 发送封装的16 字节数据帧。
HAL_UART_Transmit(huart1, (uint8_t *)data_angular_rate_raw, 16,0xFFFF); //printf('横滚=%.2f,俯仰=%.2f,偏航=%.2fn',横滚,俯仰,偏航)
演示
标题:STM32H5开发陀螺仪LSM6DSV16X(5)----上报匿名上位机
链接:https://yqqlyw.com/news/sypc/64521.html
版权:文章转载自网络,如有侵权,请联系删除!