VL53L5CX驱动开发(5)----运动阈值检测

2023-10-16 04:04

本文主要是介绍VL53L5CX驱动开发(5)----运动阈值检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VL53L5CX驱动开发----5.运动阈值检测

  • 概述
  • 视频教学
  • 样品申请
  • 源码下载
  • 生成STM32CUBEMX
    • 选择MCU
    • 串口配置
    • IIC配置
  • INT设置
  • 配置使能与复位
  • X-CUBE-TOF1
  • 串口重定向
  • 代码配置
  • 检测流程
  • TOF代码配置
  • 主程序
  • 演示结果

概述

本章目的是展示如何充分利用VL53L5CX传感器的高级特性,通过结合运动指示器和阈值检测功能,实现对特定场景的精确监控。首先,程序通过特定的配置,确保了传感器能够在特定的分辨率下工作,同时还可调整用于检测运动的最小和最大距离。其次,一旦在传感器的视野中检测到运动,并且该运动的强度超出了预先设置的阈值,那么这种情况将被认为是一个有效的运动事件。最后,该程序不仅会捕获这些事件,还会详细地显示相关的数据,如运动发生在哪个区域,以及运动的强度如何。这种结合使用多种功能的方法,使得VL53L5CX传感器在各种应用场景中都能提供高效、准确的运动检测结果。

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

在这里插入图片描述

视频教学

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

VL53L5CX驱动开发(4)----运动指示器

样品申请

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

在这里插入图片描述

源码下载

生成STM32CUBEMX

选择MCU

测试版所用的MCU为STM32G431CB。
在这里插入图片描述

串口配置

查看原理图,PA9和PA10设置为开发板的串口。
在这里插入图片描述

配置串口。
在这里插入图片描述

IIC配置

在这个应用中,VL53L5CX模块通过I2C(IIC)接口与主控器通信。具体来说,VL53L5CX模块的I2C引脚连接到主控器的PA8和PB5两个IO口。
在这里插入图片描述

配置IIC为快速模式,速度为400k。
在这里插入图片描述

INT设置

自主模式可以通过获取INT管脚进行判断数据是否准备好。
在这里插入图片描述

配置PB4为输入模式。
在这里插入图片描述

配置使能与复位

驱动中有对模块进行复位的操作。
在这里插入图片描述

配置PB15和PB3为输出管脚。
在这里插入图片描述

X-CUBE-TOF1

本节介绍在不需要使用样例应用时如何使用STM32CubeMX将X-CUBE-TOF1软件包添加到项目中。有了这样的设置,就只配置了驱动层。
在这里插入图片描述

由于需要自主模式,所以可以不开启主程序TOF执行代码。
在这里插入图片描述
修改堆栈大小。

在这里插入图片描述

串口重定向

打开魔术棒,勾选MicroLIB
在这里插入图片描述

在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}
/* USER CODE END PFP */

代码配置

在custom_ranging_sensor.c代码中,有IO口驱动VL53L5CX进行复位的代码,由于没有配置对应的IO,所以需要注释掉。
在这里插入图片描述

由于没加载串口定义,所以注释掉#include “custom.h”
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

检测流程

  1. 初始化变量:
    ○ 创建相关变量,如状态(status)、运动配置(motion_config)、设备对象(pL5obj)和结果数据(Results)。
  2. 配置运动指示器:
    ○ 使用8x8的分辨率初始化运动指示器。
    ○ 设置用于检测运动的最小和最大距离(在这里,是设置为1000mm到2000mm)。
    ○ 如果用户需要改变分辨率,他也需要更新运动指示器的分辨率(代码中此部分被注释掉了)。
  3. 设备配置:
    ○ 设置设备的分辨率为8x8。
    ○ 将设备设置为自主测距模式。
    ○ 设置测距频率为2Hz。
    ○ 设置集成时间为10ms以降低功耗。
  4. 配置检测阈值:
    ○ 对于8x8的分辨率,我们希望每个区域有一个阈值。
    ○ 初始化阈值数组。
    ○ 为所有64个区域设置阈值,当运动指示器的值超过44时,将其视为运动。
    ○ 将阈值数组发送到传感器。
    ○ 启用检测阈值。
  5. 开始测距:
    ○ 启动传感器的测距功能。
    ○ 输出消息,等待在1m到2m之间的视野中有运动发生。
  6. 无限循环监测:
    ○ 不断检查数据是否准备好。
    ○ 如果数据准备好或者某个特定的GPIO引脚被按下,获取测距数据。
    ○ 因为传感器默认设置为8x8模式,所以有64个区域要打印。但这个例子中,只打印首个区域的数据。
    ○ 如果某个区域的运动指示器的值大于或等于44,打印该区域有运动发生的消息。
    通过上述流程,该程序能够检测并显示在预定距离范围内、运动强度超过预定阈值的运动情况。

TOF代码配置

在main.c中添加对应头文件。

/* USER CODE BEGIN Includes */
#include "stdio.h"#include "custom_ranging_sensor.h"
#include "vl53l5cx_plugin_motion_indicator.h"
/* USER CODE END Includes */

函数与变量定义:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch;
}/* USER CODE END PFP */

添加TOF初始化。

  /* USER CODE BEGIN 2 */uint8_t 				status, isReady, i;VL53L5CX_Motion_Configuration 	motion_config;	/* 运动配置 */VL53L5CX_Object_t *pL5obj = CUSTOM_RANGING_CompObj[CUSTOM_VL53L5CX];VL53L5CX_ResultsData 	Results;		/* 来自VL53L5CX的结果数据 *//*********************************//*   配置运动指示器               *//*********************************//* 使用4x4分辨率初始化运动指示器 */status = vl53l5cx_motion_indicator_init(&pL5obj->Dev, &motion_config, VL53L5CX_RESOLUTION_8X8);if(status){printf("运动指示器初始化失败,状态码 : %u\n", status);return status;}/* (可选) 设置用于检测运动的最小和最大距离。注意距离的限制 */status = vl53l5cx_motion_indicator_set_distance_motion(&pL5obj->Dev, &motion_config, 1000, 2000);if(status){printf("设置运动检测距离失败,状态码 : %u\n", status);return status;}/* 如果用户需要更改分辨率,则也需要更新运动指示器的分辨率(此部分已注释) *///status = vl53l5cx_set_resolution(&Dev, VL53L5CX_RESOLUTION_4X4);//status = vl53l5cx_motion_indicator_set_resolution(&Dev, &motion_config, VL53L5CX_RESOLUTION_4X4);/* 将设备设置为自主模式,并设置较小的集成时间以降低功耗 */status = vl53l5cx_set_resolution(&pL5obj->Dev, VL53L5CX_RESOLUTION_8X8);status = vl53l5cx_set_ranging_mode(&pL5obj->Dev, VL53L5CX_RANGING_MODE_AUTONOMOUS);status = vl53l5cx_set_ranging_frequency_hz(&pL5obj->Dev, 2);status = vl53l5cx_set_integration_time_ms(&pL5obj->Dev, 10);	/*********************************//*   配置检测阈值                 *//*********************************//* 对于8x8的分辨率,我们希望为每个区域设置一个阈值 */VL53L5CX_DetectionThresholds thresholds[VL53L5CX_NB_THRESHOLDS];/* 将所有阈值设置为0 */memset(&thresholds, 0, sizeof(thresholds));/* 为所有64个区域设置阈值 */for(i = 0; i < 64; i++){thresholds[i].zone_num = i;thresholds[i].measurement = VL53L5CX_MOTION_INDICATOR;thresholds[i].type = VL53L5CX_GREATER_THAN_MAX_CHECKER;thresholds[i].mathematic_operation = VL53L5CX_OPERATION_NONE;/* 示例值44,超过此值的运动将被认为是移动 */thresholds[i].param_low_thresh = 44;thresholds[i].param_high_thresh = 44;}/* 明确标记最后一个阈值。因为我们有64个检查器,所以最后一个是第63个 */thresholds[63].zone_num = VL53L5CX_LAST_THRESHOLD | thresholds[63].zone_num;/* 将阈值数组发送到传感器 */vl53l5cx_set_detection_thresholds(&pL5obj->Dev, thresholds);/* 启用检测阈值 */vl53l5cx_set_detection_thresholds_enable(&pL5obj->Dev, 1);	/* 开始测距 */status = vl53l5cx_start_ranging(&pL5obj->Dev);printf("等待在1m和2m之间的视场中发生的运动...\n");	/* USER CODE END 2 */

主程序

主程序来获取对应的isReady位状态来判定数据是否准备好或者判断INT的IO状态也可。

  /* Infinite loop *//* USER CODE BEGIN WHILE */while (1){if(HAL_GPIO_ReadPin  ( GPIOB, GPIO_PIN_4) ==0)		
//		status = vl53l5cx_check_data_ready(&pL5obj->Dev, &isReady);			
//		if(isReady){/* 获取测距数据 */vl53l5cx_get_ranging_data(&pL5obj->Dev, &Results);/* 默认情况下,传感器设置为8x8模式,因此我们有64个区域的数据。但在此示例中,只打印了第一个区域的数据 */for(i = 0; i < 64; i++){if(Results.motion_indicator.motion[motion_config.map_id[i]] >= 44){printf(" 在这个区域检测到运动 : %3d !\n", i);}}printf("\n");}			/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 *

演示结果

检测运动情况下运动强度如下所示。

在这里插入图片描述

这篇关于VL53L5CX驱动开发(5)----运动阈值检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/218917

相关文章

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

Linux之platform平台设备驱动详解

《Linux之platform平台设备驱动详解》Linux设备驱动模型中,Platform总线作为虚拟总线统一管理无物理总线依赖的嵌入式设备,通过platform_driver和platform_de... 目录platform驱动注册platform设备注册设备树Platform驱动和设备的关系总结在 l

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

SpringBoot开发中十大常见陷阱深度解析与避坑指南

《SpringBoot开发中十大常见陷阱深度解析与避坑指南》在SpringBoot的开发过程中,即使是经验丰富的开发者也难免会遇到各种棘手的问题,本文将针对SpringBoot开发中十大常见的“坑... 目录引言一、配置总出错?是不是同时用了.properties和.yml?二、换个位置配置就失效?搞清楚加

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

Python中对FFmpeg封装开发库FFmpy详解

《Python中对FFmpeg封装开发库FFmpy详解》:本文主要介绍Python中对FFmpeg封装开发库FFmpy,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、FFmpy简介与安装1.1 FFmpy概述1.2 安装方法二、FFmpy核心类与方法2.1 FF

基于Python开发Windows屏幕控制工具

《基于Python开发Windows屏幕控制工具》在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节,本文将分享一个基于Python和PySide6开发的Windows屏幕控制工具,... 目录概述功能亮点界面展示实现步骤详解1. 环境准备2. 亮度控制模块3. 息屏功能实现4. 息屏时间

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间