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

news2024/11/29 12:53:28

VL53L5CX驱动开发----4.运动指示器

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

概述

VL53L5CX传感器内置了一个固件功能,可以检测场景中的运动。这个运动指示器是基于连续帧之间来计算的。使用插件vl53l5cx_plugin_motion_indicator可以使用这个选项。
运动指示器通过vl53l5cx_motion_indicator_init()函数进行初始化。如果用户想要更改传感器的分辨率,他必须使用专用函数vl53l5cx_motion_indicator_set_resolution()来更新运动指示器的分辨率。
用户还可以更改检测运动的最小和最大距离。最小距离和最大距离之间的差异不能超过1500毫米。默认情况下,距离是在400毫米到1500毫米之间初始化的。
结果存储在motion_indicator字段中。在这个字段里,数组motion给出了每个区域的运动强度值。高值表示帧之间的高运动变化。典型的运动会给出一个在100到500之间的值。这种敏感性取决于集成时间、目标距离和目标反射率。
对于低功耗应用,理想的组合是使用运动指示器与自主测距模式,并在运动上编程检测阈值。这允许在FoV(视场)中检测运动变化,同时保持最小的功耗。

最近在弄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. 初始化阶段 (用户代码开始 2):
    ○ 声明并初始化一些变量,包括status(状态),isReady(准备就绪标志),i(循环变量),以及与VL53L5CX运动检测相关的结构。
    ○ 获取VL53L5CX设备的引用。
  2. 配置运动指示器:
    ○ 使用4x4的分辨率初始化运动指示器。如果失败,则打印错误信息并返回状态。
    ○ 可选地更改用于检测运动的最小和最大距离。这些距离有一些限制,如果超出这些限制,则会返回错误。
    ○ 如果用户需要,可以更改传感器的分辨率。同时,也需要更新运动指示器的分辨率。
    ○ 为示例设置测距频率为2Hz。如果设置失败,打印错误信息。
  3. 开始测距:
    ○ 启动VL53L5CX设备的测距功能。
  4. 测距循环 (无限循环):
    ○ 检查VL53L5CX设备是否有新的数据可用。
    ○ 如果有新数据:
    ■ 获取测距数据。
    ■ 打印数据流计数(可能是一个连续的测量编号)。
    ■ 打印每个区域(在4x4分辨率下有16个区域)的运动强度。
    这个程序主要用于配置VL53L5CX传感器的运动指示器,然后不断地从传感器获取测距数据,并打印出每个区域的运动强度。

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_4X4);
	if(status)
	{
		printf("运动指示器初始化失败,状态 : %u\n", status);
		return status;
	}

	/* (可选) 更改用于检测运动的最小和最大距离。最小和最大之间的差异
	 * 不得超过1500mm,最小值不能小于400mm,否则下面的函数返回错误127 */
	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_ranging_frequency_hz(&pL5obj->Dev, 2);
	if(status)
	{
		printf("设置vl53l5cx测距频率失败,状态 : %u\r\n", status);
		return status;
	}

	/*          测距循环              */

	status = vl53l5cx_start_ranging(&pL5obj->Dev);
  /* 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);

			/* 由于传感器默认设置为4x4模式,我们总共有
			 * 16个区域要打印。在此示例中,只打印第一个区域的数据 */
			printf("打印数据编号 : %3u\n", pL5obj->Dev.streamcount);
			for(i = 0; i < 16; i++)
			{
				printf("区域 : %3d, 运动强度 : %3lu\n",
					i,
					Results.motion_indicator.motion[motion_config.map_id[i]]);
			}
			printf("\n");
		}		
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

演示结果

静止状态下运动强度如下所示。
在这里插入图片描述
检测运动情况下运动强度如下所示。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1096092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【算法|动态规划No.21】leetcode494. 目标和

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

Redis的五大基础数据类型

String 字符串类型&#xff0c;通过set关键字和get关键字来设置字符串键值对和获取字符串键值对。 hash 哈希类型&#xff0c;结构和Map<String,Map<String,stirng>>类似。 使用hset来设置哈希&#xff0c;使用hget来获取哈希&#xff0c;hget要精确到第二个key…

【深度学习 | Transformer】释放注意力的力量:探索深度学习中的 变形金刚,一文带你读通各个模块 —— Positional Encoding(一)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

Python深度学习实践代码实现

线性模型 课程 代码 import numpy as np import matplotlib.pyplot as plt x_data[1.0,2.0,3.0] y_data[2.0,4.0,6.0] #前馈函数 def forward(x):return x*w #损失函数 def loss(x,y):y_predforward(x)return (y_pred-y)*(y_pred-y) w_list[] mse_list[] for w in np.arange…

2.Javaweb模块基本

1.1web基本 session 和 cookie 有什么区别&#xff1f; 存储位置不同&#xff1a;session 存储在服务器端&#xff1b;cookie 存储在浏览器端。 安全性不同&#xff1a;cookie 安全性一般&#xff0c;在浏览器存储&#xff0c;可以被伪造和修改。 容量和个数限制&#xff1a;…

浅讲make/makefile【linux】

浅讲make/makefile【linux】 一. 什么是make/makefile&#xff1f;二. makefile2.1 依赖关系与依赖方法2.2 浅用make2.2.1 make test2.2.2 clean 2.2 make一次执行多步2.3 部分修饰符号2.3.1 .PHONY(伪目标)2.3.2 2.3.3 $ $^ 一. 什么是make/makefile&#xff1f; make/makefi…

uml知识点学习

https://zhuanlan.zhihu.com/p/659911315https://zhuanlan.zhihu.com/p/659911315软件工程分析设计图库目录 - 知乎一、结构化绘图1. 结构化——数据流图Chilan Yuk&#xff1a;1. 结构化——数据流图2. 结构化——数据字典Chilan Yuk&#xff1a;2. 结构化——数据字典3. 结构…

“理解梯度下降:直觉、数学公式和推导”

一、说明 梯度下降是机器学习中使用的一种流行的优化算法&#xff0c;通过迭代调整函数的参数来最小化函数。基本思想是将函数的参数沿函数梯度最陡峭下降的方向移动。 二、关于梯度的叙述 简单来说&#xff0c;想象一下你在山顶&#xff0c;你想尽快到达山脚下。你可以开始下坡…

流程图规范

文章目录 1.符号概览2.要求2.1 从上至下&#xff0c;从左至右的流向顺序2.2 开始符号只能有一个出口2.3 进程符号不做逻辑校验2.4 相同流程图&#xff0c;符号大小应为一致2.5 引用流程&#xff0c;而不是重复绘制2.6 路径符号应尽量避免相互交叉2.7 同一路径&#xff0c;箭头只…

【Python】Python语言基础(下)

目录 第十一章 控制结构 for语句 if语句 while语句 第十二章 函数 函数介绍 函数的定义 函数的调用 函数的传参 函数的传参方式 位置实参 关键字实参 默认值实参 函数的返回值 函数传递未知数量的实参 函数的模块调用 调用整个模块 调用模块中特定功能 第十…

业财融合潮流下,构建国有企业全面预算管理体系

近年来&#xff0c;在我国快速发展的变革过程中&#xff0c;国有企业改革的持续深入需要积极结合市场环境和自身发展需求&#xff0c;然而其传统的财务管理模式难以适应企业提出的新要求&#xff0c;预算管理与经营销售之间不断出现隔阂。为确保全面预算管理在国有企业内部的良…

部署个人静态网站到阿里云服务器(含域名解析)

使用前提&#xff1a; 您目前已经有一个静态网站&#xff0c;可以在本地通过html进行访问。 1、购买阿里云服务器 该步骤最详细的教程来自官方文档 具体到从注册开始每一个鼠标点击都有图片介绍。 你可以按照他的步骤完成整个部署过程&#xff0c;当然可以自己选择服务器的…

【实用调试技巧】总是找不到Bug?手把手教你在vs2022中调试程序

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:程序调试及报错解决 ⚙️操作环境:Visual Studio 2022 目录 什么是Bug? 1947年9月9日:第一个"Bug"被发现 什么是调试? 调试是什么? 调试的基本步骤 Debug和Relese的区别 1.调试的区别 2.文件大小的…

13 | 如何正确使用 @Entity 里面的回调方法

Java Persistence API 里面规定的回调方法有哪些&#xff1f; JPA 协议里面规定&#xff0c;可以通过一些注解&#xff0c;为其监听回调事件、指定回调方法。下面我整理了一个回调事件注解表&#xff0c;分别列举了 PrePersist、PostPersist、PreRemove、PostRemove、PreUpdat…

线性排序:如何根据年龄给100万用户数据排序?

文章来源于极客时间前google工程师−王争专栏。 桶排序、计数排序、基数排序时间复杂度是O(n)&#xff0c;所以这类排序算法叫作线性排序。 线性的原因&#xff1a;三个算法是非基于比较的排序算法&#xff0c;都不涉及元素之间的比较操作。 三种排序对排序的数据要求苛刻&am…

19 | 如何搞清楚事务、连接池的关系?正确配置是怎样的

事务的基本原理 在学习 Spring 的事务之前&#xff0c;你首先要了解数据库的事务原理&#xff0c;我们以 MySQL 5.7 为例&#xff0c;讲解一下数据库事务的基础知识。 我们都知道 当 MySQL 使用 InnoDB 数据库引擎的时候&#xff0c;数据库是对事务有支持的。而事务最主要的作…

(转)富文本编辑器——Vue2Editor

介绍 Vue2Editor是一个简单易用且功能强大的Vue版本的富文本编辑器&#xff0c;其基于Quill.js和Vuejs构建&#xff01; 简单易用、功能强大的富文本编辑器——Vue2Editor Github https://github.com/davidroyer/vue2-editor 特性 简单易用&#xff1b;基于Vue.js & Quil…

【Golang】Go的并发和并行性解释。谁说Go不是并行语言?

偶然发现百度上有很多"师出同门"的"go是并发语言&#xff0c;而不是并行语言"的说法。让我顿感奇怪&#xff0c;"并行"说白了就是对CPU多核的利用&#xff0c;这年头不能利用多核的编译语言还有的混&#xff1f;而且还混的这么好&#xff1f;并且…

Linux网络编程系列之服务器编程——非阻塞IO模型

Linux网络编程系列 &#xff08;够吃&#xff0c;管饱&#xff09; 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

echarts关于一次性绘制多个饼图 (基于vue3)

在echarts中&#xff0c;dataset 和 source 是用来配置数据的选项。 dataset 是一个包含数据相关配置的对象&#xff0c;用于指定数据的来源和格式。它可以包含多个维度的数据集&#xff0c;每个维度都可以有自己的名称和数据。 source 是 dataset 中的一个子项&#xff0c;用于…