STM32H5开发陀螺仪LSM6DSV16X(5)----上报匿名上位机

STM32H5开发陀螺仪LSM6DSV16X.5--上报匿名上位机

概述

本文介绍了如何将 LSM6DSV16X 传感器的姿态数据通过匿名通信协议上报到上位机。通过获取传感器的四元数数据,并将其转换为欧拉角(Roll、Pitch、Yaw),然后按照协议格式化数据帧并通过串口传输到上位机。上位机接收后可进行实时显示和分析。这种方式广泛应用于姿态检测和控制系统,特别适合无人机、机器人等需要姿态控制的场景。

最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。

视频教学

https://www.bilibili.com/video/BV1sS5bzkEU9/

STM32H5开发陀螺仪LSM6DSV16X(5)----上报匿名上位机

样品申请

https://www.wjx.top/vm/OhcKxJk.aspx#

源码下载

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。

主控为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,需要主要为小端模式传输。

陀螺仪工作方式

加速度计测量线性加速度,而陀螺仪测量角旋转。为此,他们测量了科里奥利效应产生的力。

陀螺仪是一种运动传感器,能够感测物体在一轴或多轴上的旋转角速度。它能够精确地感测自由空间中复杂的移动动作,因此成为追踪物体移动方位和旋转动作的必要设备。与加速计和电子罗盘不同,陀螺仪不需要依赖外部力量(如重力或磁场),可以自主地发挥其功能。因此,从理论上讲,只使用陀螺仪就可以完成姿态导航的任务。

陀螺仪的每个通道检测一个轴的旋转。也就是说陀螺仪通过测量自身的旋转状态,判断出设备当前运动状态,是向前、向后、向上、向下、向左还是向右呢,是加速(角速度)还是减速(角速度)呢,都可以实现,但是要判断出设备的方位(东西南北),陀螺仪就没有办法。

MEMS陀螺仪主要利用科里奥利力(旋转物体在有径向运动时所受到的切向力)原理,公开的微机械陀螺仪均采用振动物体传感角速度的概念,利用振动来诱导和探测科里奥利力。

MEMS陀螺仪的核心是一个微加工机械单元,在设计上按照一个音叉机制共振运动,通过科里奥利力原理把角速率转换成一个特定感测结构的位移。

两个相同的质量块以方向相反的做水平震荡。当外部施加一个角速率,就会出现一个科氏力,力的方向垂直于质量运动方向,如垂直方向箭头所示。产生的科氏力使感测质量发生位移,位移大小与所施加的角速率大小成正比,科氏力引起的电容变化即可计算出角速率大小。

科里奥利效应指出,当质量 (m) 以速度 (v) 沿特定方向移动并施加外部角速率 (Ω)(红色箭头)时,科里奥利效应会产生一个力(黄色箭头),导致质量垂直移动。该位移的值与应用的角速率直接相关。

变量定义。

c 复制代码
  /* USER CODE BEGIN 2 */
	float Yaw,Pitch,Roll;  //偏航角,俯仰角,翻滚角
	int16_t	acc_int16[3]	={0,0,0};
	int16_t	gyr_int16[3]		={0,0,0};	
	float acc[3] = {0};
	float gyr[3] = {0};	

	uint8_t data[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};	//pitch,roll,yaw
	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] 这样方便传输的范围。

c 复制代码
				Roll=euler[2];
				Pitch=euler[1];
				Yaw=euler[0];					
					
				int16_t	Roll_int16;
				int16_t	Pitch_int16;					
				int16_t	Yaw_int16;	

				Roll_int16 = (int16_t)(Roll);
				Pitch_int16 = (int16_t)(Pitch);
				Yaw_int16 = (int16_t)(Yaw);		


				Roll_int16=Roll_int16*100;
				Pitch_int16=Pitch_int16*100;
				Yaw_int16=Yaw_int16*100-18000;

数据帧填充

将转换后的 Roll_int16、Pitch_int16 和 Yaw_int16 数据依次填充到数据帧的相应位置。

c 复制代码
//				Roll=Roll*100;
//				Pitch=Pitch*100;
//				Yaw=Yaw*100;
				data_angular_rate_raw[7]=Roll_int16>>8;//roll
				data_angular_rate_raw[8]=Roll_int16;
				data_angular_rate_raw[9]=Pitch_int16>>8;//pitch
				data_angular_rate_raw[10]=Pitch_int16;
				data_angular_rate_raw[11]=Yaw_int16>>8;//yaw
				data_angular_rate_raw[12]=Yaw_int16;
				

校验和计算

使用了双层循环求和来计算校验和,这是一种累加和的方法,确保帧数据的完整性。

c 复制代码
				data_angular_rate_raw[13]=0;
				sumcheck = 0;
				addcheck = 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 字节数据帧。

c 复制代码
				HAL_UART_Transmit(&huart1 , (uint8_t *)&data_angular_rate_raw, 16, 0xFFFF);	
//				printf("Roll=%.2f,Pitch=%.2f,Yaw=%.2f\n",Roll,Pitch,Yaw)

演示

相关推荐
Jiaberrr5 天前
uniapp app 端获取陀螺仪数据的实现攻略
前端·javascript·vue.js·uni-app·陀螺仪
记帖20 天前
STM32H5开发陀螺仪LSM6DSV16X(3)----SFLP获取四元数
stm32cubemx·mems·四元数·lsm6dsv16x·欧拉角·sflp
CoreMaker-lab20 天前
STM32H5开发陀螺仪LSM6DSV16X(1)----轮询获取陀螺仪数据
陀螺仪·e2studio·瑞萨ra·mems·r7fa4l1bd4cfp·ra4l1·lsm6dsv16x
Ronin-Lotus1 个月前
嵌入式硬件篇---TOF&陀螺仪&SPI液晶屏
嵌入式硬件·陀螺仪·tof·spi液晶显示屏
bohu833 个月前
亚博microros小车-原生ubuntu支持系列:16 机器人状态估计
ubuntu·机器人·imu·localization·microros·imu_tools
生活最重要(ง •̀_•́)ง4 个月前
[STM32 HAL库]串口中断编程思路
stm32cubemx·stm32 hal库·串口接收数据·编程思路
生活最重要(ง •̀_•́)ง4 个月前
[STM32 HAL库]串口空闲中断+DMA接收不定长数据
stm32cubemx·串口空闲中断·stm32 hal库·蓝桥杯嵌入式
wangshang13205 个月前
关于在浏览器里面获取手机方向的事件
智能手机·陀螺仪
记帖5 个月前
STM32C011开发(3)----Flash操作
stm32cubemx·flash·stm32c011f4p6·writeflashdata