Funpack第九期 -- 基于SensorTile.box的简易环境检测设备
本项目通过xxx的丰富的传感器,实现了通过xxx的放置位置来实时选取待检测的环境参数,并将输出通过st官方的可视化串口工具实时显示。其中,程序主体在AlgoBuilder生成源码的基础上,在Keil5中进一步修改得到的。
标签
嵌入式系统
Kang
更新2021-06-17
595
  • 简介

本次项目基于st官方的SensorTile.Box实现,采用st官方的图形化编程工具AlgoBuilder生成初始项目源码,并利用Keil5进行二次开发,达到快速开发和验证的目的。串口通信采用的是AlgoBulider内置的工具Unicleo-GUI实现,程序的烧录使用的是STM32CubeProgrammer实现。

首先,使用可视化编程工具AlgoBuilder,将需要使用到的模块添加到流程图内,并生成相应的项目源码。然后,使用Keil5打开生成的项目文件,找到其中的algo_builder.c文件,对它进行相应的修改,编译生成二进制程序。接着,采用STM32CubeProgrammer将生成的bin文件在DFU模式下烧录到板子上。最后使用串口工具,一边调整板子的摆放,一边观察实时的输出结果。

官方的可视化编程工具配合IDE进行二次开发,可以大幅提高开发的效率,帮助人们更快的掌握板子的使用。

  • 实现的功能

使用SensorTile.Box开发板上集成的STTS751数字温度传感器、LSM6DSOX六轴惯性测量单元、LIS2MDL三轴磁力计、LPS32HH气压传感器和HTS221湿度传感器来实现通过改变摆放的位置,分别测量桌面的倾斜程度、温度、湿度和气压。最终,通过串口将当前所属的平面和对应的环境参数输出到电脑。

程序运行后,先根据IMU和3轴磁力计,调用相应函数解算出欧拉角。

MotionEC_Rotation_GetData(Sensor_Hub_1_out, DummyNodeFloat);

再根据计算出来的欧拉角,判断当前处于最上面的平面是哪个面,并设置相应的阈值,在阈值(即该平面与水平面的夹角过大)之内,才输出对应的平面编号和对应的环境参数。否则,平面编号和环境参数均输出0。代码如下所示:

if(DummyNodeFloat[2]< 25 && DummyNodeFloat[2]>-25)
{
if(DummyNodeFloat[1]<15 && DummyNodeFloat[1]>-15)
{
Face_data[0] = 1;
//平面1,计算并输出桌面倾斜角
}
else if(DummyNodeFloat[1]>165 || DummyNodeFloat[1]<-165)
{
Face_data[0] = 3;
//平面3,输出湿度
}
}
else if(DummyNodeFloat[2]<-65)
{
Face_data[0] = 2;
//平面2,输出温度
}
else if(DummyNodeFloat[2]> 65)
{
Face_data[0] = 4;
//平面4,输出气压
}
if(Face_data[0]==0)
{
Sensor_data[0] = 0.0;
//输出0,0
Display_Update(Face_data, &display_info_list[0]);
}

桌面倾斜角度的数据采用测量重力加速度在x,,y,z轴方向上的分量,通过反三角函数求解。因为输出的默认单位是弧度,需要乘一个系数,转化成角度。

MotionEC_Gravity_GetData(Sensor_Hub_1_out, DummyNodeFloat);
float temp_x=0.0;
temp_x = DummyNodeFloat[0]*DummyNodeFloat[0]+DummyNodeFloat[1]*DummyNodeFloat[1]+DummyNodeFloat[2]*DummyNodeFloat[2];
temp_x = sqrt(temp_x);
Sensor_data[0] = acos(DummyNodeFloat[2]/temp_x);
Sensor_data[0] /= 3.14159;
Sensor_data[0] *= 180;

其余三个环境量,通过对应的接口函数,直接读取即可:

Humidity_Sensor_GetData(Sensor_Hub_1_out, Sensor_data);
Temperature_Sensor_GetData(Sensor_Hub_1_out, Sensor_data);
Pressure_Sensor_GetData(Sensor_Hub_1_out, Sensor_data);

读取完成后,利用相应的接口函数更新串口输出的参数,达到实时改变输出的效果。

Display_Update(Face_data, &display_info_list[0]);
Display_Update(Sensor_data, &display_info_list[1]);

 

  • 功能演示

在修改AlgoBuilder所生成源码的过程中,我对其程序结构和通讯协议做了更加深入的研究,将平面编号直接输出,而传感器的数值由柱状图显示。输出的数值通过上一步中修改并更新特定的参数赖实时控制。

具体的实时改变见参考视频,查看输出的数据,得到结果如下:

FpKIl5JustkwT_-E63UfBUrxde5d

最底下的红色数字就是传感器具体的数值,如上图所示。

FhpVSpKEyplDJVKP7IhCc_se0raY

串口记录到的数据变化入上图所示,Face一列对应的是平面的编号(0代表没有),Sensor Value一列对应的是对应的环境参数数值。

  • 心得体会

在周围同学的建议下,我报名了这次活动,我很荣幸可以使用到这款st官方出品的这块板子,在此之前,接触到的主要是stm32的核心板。这也是我第一次用到性能如此强大的传感器,对于嵌入式的发展有了全新的认识。

非常感谢电子森林所提供的视频讲解,让我知道了机器学习可以被应用在这种板子上,从而实现指定动作的检测等各种复杂的功能。我也自己尝试的体验了一把,确实效果非常强大,但是受限于没有比较理想的声源,最终我选择了第一题。

总的来说学到了不少,非常感谢电子森林和Digikey举办的此次活动,也很感谢交流群里的大佬,帮忙解决各种疑问。

 

附件下载
核心代码.rar
团队介绍
单人团队,嵌入式小白,电子爱好者,会使用Arduino,Stm32和树莓派这类的MCU做一些简单的事情
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号