Funpack3-3活动——实现X-NUCLEO-IKS4A1数据切换及可视化
该项目使用了STM32CubeIDE、Matlab,实现了X-NUCLEO-IKS4A1数据切换及可视化的设计,它的主要功能为:使用板卡上的触摸按键,识别出点按和左右滑动,以此切换单片机发送数据类型,通过上位机将数据进行可视化展示。
标签
Funpack活动
simulink
X-NUCLEO-IKS4A1
且听风吟123
更新2024-07-08
36

一、任务要求

使用板卡上的触摸按键,实现点按和左右滑动,实现传感器选择和切换,并将数据发送到上位机,功能选择的可视化也在上位机完成

二、设计思路

        触摸按键基于Qvar技术,单片机获取电荷变化数据,通过串口上传到Simulink上位机。在Simulink上位机中实现数据的滤波、点按和左右滑动的识别、将需要发送的传感器数据类型发送给单片机,单片机进行数据的切换。其中软件流程图如下

image.png

三、程序实现

1、单片机功能:电荷变化数据获取、各类传感器数据的获取(加速度、温度、湿度、气压)、串口收发

(1)各类传感器数据的获取

通过STM32CubeMX软件配置NUCLEO-G0B1RE+IKS4A1

  for(i = 0; i < IKS4A1_MOTION_INSTANCES_NBR; i++)

{

if(MotionCapabilities[i].Acc)

{

Accelero_Sensor_Handler(i);

}

if(MotionCapabilities[i].Gyro)

{

Gyro_Sensor_Handler(i);

}

if(MotionCapabilities[i].Magneto)

{

Magneto_Sensor_Handler(i);

}

}



for(i = 0; i < IKS4A1_ENV_INSTANCES_NBR; i++)

{

if(EnvCapabilities[i].Humidity)

{

Hum_Sensor_Handler(i);

}

if(EnvCapabilities[i].Temperature)

{

Temp_Sensor_Handler(i);

}

if(EnvCapabilities[i].Pressure)

{

Press_Sensor_Handler(i);

}

}

(2)电荷变化数据的获取

根据电气原理图,将触摸板正确连接到X-NUCLEO-IKS4A1开发板上,通过以下代码获取电荷变化数据

LSM6DSV16X_QVAR_GetData(MotionCompObj[IKS4A1_LSM6DSV16X_0], &QvarValue);

(3)串口收发

发送功能在STM32CubeMx生成的代码中已具备,不再赘述,重点介绍串口接收

在STM32CubeMx软件打开串口中断

image.png

开启中断,需要在串口主函数while之前、接收回调函数中增加如下代码

HAL_UART_Receive_IT(&huart2[11] ,data_buff,1);

根据上位机发送数据,将指定的数据发送给上位机

IKS4A1_MOTION_SENSOR_Axes_t acceleration;

if(MotionCapabilities[1].Acc)

{

if (IKS4A1_MOTION_SENSOR_GetAxes(1, MOTION_ACCELERO, &acceleration))

{

snprintf(dataOut, MAX_BUF_SIZE, "\r\nACC[%d]: Error\r\n", (int)1);

}

else

{

snprintf(dataOut, MAX_BUF_SIZE, "\r\nACC_X[%d]: %d, ACC_Y[%d]: %d, ACC_Z[%d]: %d\r\n", (int)1,

(int)acceleration.x, (int)1, (int)acceleration.y, (int)1, (int)acceleration.z);

}

}



displayFloatToInt_t out_value;//环境传感器输出数据

float temperature;//温度

float pressure;//气压

float humidity;//湿度



if(EnvCapabilities[0].Temperature && data_buff[0]==10)

{

if (IKS4A1_ENV_SENSOR_GetValue(0, ENV_TEMPERATURE, &temperature))

{

snprintf(dataOut, MAX_BUF_SIZE, "\r\nTemp[%d]: Error\r\n", (int)0);

}

else

{

floatToInt(temperature, &out_value, 2);

snprintf(dataOut, MAX_BUF_SIZE, "\r\nTemp[%d]: %c%d.%02d degC\r\n", (int)0, ((out_value.sign) ? '-' : '+'), (int)out_value.out_int,

(int)out_value.out_dec);

}

}

if(EnvCapabilities[1].Pressure && data_buff[0]==11)

{

if (IKS4A1_ENV_SENSOR_GetValue(1, ENV_PRESSURE, &pressure))

{

snprintf(dataOut, MAX_BUF_SIZE, "\r\nPress[%d]: Error\r\n", (int)1);

}

else

{

floatToInt(pressure, &out_value, 2);

snprintf(dataOut, MAX_BUF_SIZE, "\r\nPress[%d]: %d.%02d hPa\r\n", (int)1, (int)out_value.out_int,

(int)out_value.out_dec);

}

}

if(EnvCapabilities[2].Humidity && data_buff[0]==12)

{

if (IKS4A1_ENV_SENSOR_GetValue(2, ENV_HUMIDITY, &humidity))

{

snprintf(dataOut, MAX_BUF_SIZE, "\r\nHum[%d]: Error\r\n", (int)2);

}

else

{

floatToInt(humidity, &out_value, 2);

snprintf(dataOut, MAX_BUF_SIZE, "\r\nHum[%d]: %d.%02d %%\r\n", (int)2, (int)out_value.out_int,

(int)out_value.out_dec);

}

}



switch(data_buff[0])

{

case 0:

printf("#%06d%06d$\r\n",QvarValue,acceleration.x*100);

break;

case 1:

printf("#%06d%06d$\r\n",QvarValue,acceleration.y*100);

break;

case 2:

printf("#%06d%06d$\r\n",QvarValue,acceleration.z*100);

break;

case 10:

case 11:

case 12:

printf("#%06d%06d$\r\n",QvarValue,out_value.sign?-(out_value.out_int*100+out_value.out_dec):out_value.out_int*100+out_value.out_dec);//上传数�??

break;



default:

printf("#%06d%06d$\r\n",QvarValue,0);
}

2、上位机功能:点按和左右滑动的识别、发送数据类型、数据展示

(1)点按和左右滑动的识别

基于滑动平均滤波算法,对电荷变化数据进行滤波处理。根据点按、左后滑动时,电荷变化的不同特点,通过状态机对识别算法进行设计

image.png

(2)发送数据类型处理逻辑如下

image.png

(3)数据实时展示如下

image.png

四、工程文件

链接:https://pan.baidu.com/s/1s5bQ3PIrNlTu_lyDYsj67A

提取码:8now

五、建议

希望增加无线通信、视觉识别相关的活动


附件下载
G0B1(6.30).rar
团队介绍
啥都干点的测控工程师
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号