- 简介
本次项目基于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所生成源码的过程中,我对其程序结构和通讯协议做了更加深入的研究,将平面编号直接输出,而传感器的数值由柱状图显示。输出的数值通过上一步中修改并更新特定的参数赖实时控制。
具体的实时改变见参考视频,查看输出的数据,得到结果如下:
最底下的红色数字就是传感器具体的数值,如上图所示。
串口记录到的数据变化入上图所示,Face一列对应的是平面的编号(0代表没有),Sensor Value一列对应的是对应的环境参数数值。
- 心得体会
在周围同学的建议下,我报名了这次活动,我很荣幸可以使用到这款st官方出品的这块板子,在此之前,接触到的主要是stm32的核心板。这也是我第一次用到性能如此强大的传感器,对于嵌入式的发展有了全新的认识。
非常感谢电子森林所提供的视频讲解,让我知道了机器学习可以被应用在这种板子上,从而实现指定动作的检测等各种复杂的功能。我也自己尝试的体验了一把,确实效果非常强大,但是受限于没有比较理想的声源,最终我选择了第一题。
总的来说学到了不少,非常感谢电子森林和Digikey举办的此次活动,也很感谢交流群里的大佬,帮忙解决各种疑问。