VL53L1CB TOF开发(2)----多区域扫描模式

news2024/9/23 3:25:36

VL53L1CB TOF开发.2--多区域扫描模式

  • 概述
  • 视频教学
  • 样品申请
  • 源码下载
  • 硬件准备
  • 主要特点
  • 生成STM32CUBEMX
  • 串口配置
  • IIC配置
  • XSHUT
  • GPIO1
  • X-CUBE-TOF1
  • 堆栈设置
  • 函数说明
  • 初始化设置
  • 预设模式 (Preset mode)
  • VL53L1_SetPresetMode
  • VL53L1_SetDistanceMode
  • 时间预算
  • 单个ROI(Single ROI)设置
  • 主程序
  • 数据说明
  • 测试结果

概述

多区域扫描模式是 VL53L1 飞行时间 (Time-of-Flight, ToF) 传感器的一项高级功能,允许用户同时对多个区域进行距离测量。该模式通过划分视场(Field of View, FoV)为多个感兴趣区域(Region of Interest, ROI),并对每个区域分别进行测距,为需要广域监控和多目标检测的应用提供了理想的解决方案。
在多区域扫描模式下,VL53L1 传感器可以最多支持 16 个区域的并行测量,用户还可以根据需求将区域数量扩展到 169 个。每个区域的测量结果会独立报告,这使得该模式特别适合于需要监测大面积区域或精确跟踪多个目标的场景,例如投影机梯形校正、多点距离检测和环境映射等。

该模式支持最多 16 个区域的并行测量,用户还可以根据需求扩展到 169 个区域。这使得多区域扫描模式成为投影机梯形校正应用的理想选择,能够有效应对复杂的角度调整和多点校正需求。

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

在这里插入图片描述

视频教学

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

VL53L1CB TOF开发(2)----多区域扫描模式

样品申请

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

源码下载

硬件准备

首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32WB55RGV6,TOF为VL53L1。

在这里插入图片描述

主要特点

● 多区域检测:支持对投影图像的多个区域进行独立测距,有助于精确的梯形校正。
● 高精度与灵活性:用户可以根据投影需求自定义 ROI 的数量和大小,实现更精细的图像调整。
● 应用场景:除了投影机梯形校正,该模式还适用于需要多点距离测量的其他应用,如机器人导航和环境映射。

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32WB55RG。
配置时钟树,配置时钟为32M。
在这里插入图片描述

串口配置

查看原理图,PB6和PB7设置为开发板的串口。

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

在这里插入图片描述

IIC配置

在这个应用中,VL53L1模块通过I2C(IIC)接口与主控器通信。具体来说,VL53L1模块的I2C引脚连接到主控器的PB8和PB9两个IO口。
配置IIC为快速模式,速度为400k。

在这里插入图片描述

XSHUT

XSHUT引脚是由主机连接和控制的,这种设计优化了功耗,因为设备在不使用时可以被完全关闭,然后通过主机使用XSHUT引脚来唤醒。当AVDD存在且XSHUT为低电平时,设备处于硬件待机模式(HW Standby mode)。如果XSHUT引脚不由主机控制,而是通过上拉电阻连接到AVDD,那么设备在固件启动(FW BOOT)后会自动进入软件待机(SW STANDBY),而不会进入硬件待机。

在这里插入图片描述

在这里插入图片描述

GPIO1

在VL53L1X传感器中,GPIO1(通用输入输出引脚1)通常用于中断信号输出。

在这里插入图片描述

配置如下所示。

在这里插入图片描述

X-CUBE-TOF1

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

在这里插入图片描述

堆栈设置

在这里插入图片描述

若无法正常运行需要修改优化等级。
在这里插入图片描述

函数说明

https://docs.ros.org/en/melodic/api/vl53l1x/html/group__VL53L1__parameters__group.html

初始化设置

UM2371文档是关于使用X-CUBE-53L1A1软件扩展包在STM32Cube平台上实现VL53L1X传感器应用的入门指南。它详细介绍了如何配置和使用VL53L1X传感器进行测距,并将测量数据传输到PC。

在这里插入图片描述

预设模式 (Preset mode)

在 UM2133 文档的第 3.2.4 节中,描述了 VL53L1 传感器的预设模式选择功能。以下是该部分的主要内容:
● 功能: VL53L1_SetPresetMode() 函数用于选择一个预设的测距模式。使用当前的驱动程序版本,可以选择以下几种预设模式:
● VL53L1_PRESETMODE_RANGING: 标准测距模式,用于获取单个或多个(最多 4 个)目标的测距数据。
● VL53L1_PRESETMODE_MULTIZONES_SCANNING: 多区域扫描模式,允许用户定义的多个感兴趣区域(ROI)进行连续扫描,并逐一报告每个区域的测距值。默认最多支持 16 个区域,最高可扩展到 169 个区域。
● VL53L1_PRESETMODE_LITE_RANGING: 简化测距模式(已废弃),最初设计用于降低主机的处理负担。
● VL53L1_PRESETMODE_AUTONOMOUS: 自主测距模式,在该模式下,传感器可以定期进行测量,而无需主机干预,适合低功耗应用。
● 默认模式: 默认的预设模式为 VL53L1_PRESETMODE_RANGING。

在这里插入图片描述

VL53L1_SetPresetMode

VL53L1_SetPresetMode() 是 VL53L1 传感器的一个API函数,用于将设备设置为一个新的预设模式(Preset Mode)。该函数定义了传感器的工作模式,比如高速测距或多目标检测。
函数描述:
● 作用: 这个函数设置设备的操作模式,比如高速测距或多对象检测等。它通过修改测量的时间预算和测量间隔来实现不同的模式。
● 注意事项:
○ 这个函数并不会直接访问设备,而是修改了相关的配置参数。
○ 使用该函数后,时间预算会被设定为 16 ms,测量间隔被设定为 1000 ms,且距离模式被设定为 VL53L1_DISTANCEMODE_LONG。

在这里插入图片描述

将 VL53L1 传感器的预设模式设置为 VL53L1_PRESETMODE_MULTIZONES_SCANNING(多区域扫描模式)。

  /*VL53L1_SetPresetMode function is mandatory to be called even if default PresetMode is the VL53L1_PRESETMODE_RANGING */
  status = VL53L1_SetPresetMode(&VL53L1CBObj1, VL53L1_PRESETMODE_MULTIZONES_SCANNING);

VL53L1_SetDistanceMode

VL53L1_SetDistanceMode() 是 VL53L1 传感器的一个API函数,用于设置传感器的测距模式。该函数允许用户选择适合具体应用场景的测距范围,以优化测量精度。不同的测距模式在不同的距离范围内提供最佳的测量结果。
在这里插入图片描述

根据不同的预设模式(Preset mode),用户可以选择适合的距离模式来优化测量的准确性和设备的性能。表格中的内容解释了每种距离模式的可能选项及其优点或注意事项。

在这里插入图片描述

	status = VL53L1_SetDistanceMode(&VL53L1CBObj1, VL53L1_DISTANCEMODE_LONG);

时间预算

VL53L1_SetMeasurementTimingBudgetMicroSeconds() 是一个用于设置 VL53L1 传感器测距时间预算的 API 函数。通过这个函数,用户可以定义设备在当前模式下(如测距、直方图模式等)完成一次完整测距序列所允许的最大时间。

在这里插入图片描述
VL53L1_ERROR_INVALID_PARAMS: 如果传入的时间参数不被支持,会返回此错误。计算出的时间预算最大值为10秒,最小值则取决于所选择的预设模式。
时间预算值(表格): 表格中列出了不同预设模式下的时间预算的最小值、典型值和最大值:
● Ranging(测距模式):
○ 最小值: 8毫秒
○ 典型值: 16毫秒
○ 最大值: 500毫秒
● MultiZone scanning(多区域扫描模式):
○ 最小值: 8毫秒
○ 典型值: 16毫秒
○ 最大值: 500毫秒
● Autonomous(自主模式):
○ 最小值: 20毫秒
○ 典型值: 40毫秒
○ 最大值: 1000毫秒

在这里插入图片描述

	status = VL53L1_SetMeasurementTimingBudgetMicroSeconds(&VL53L1CBObj1, 500000);

单个ROI(Single ROI)设置

● 默认设置: VL53L1传感器的默认ROI大小是16x16 SPAD(单光子雪崩二极管)矩阵。
● 自定义ROI: 用户可以调用 VL53L1_SetROI() 函数来设置与默认16x16不同的ROI。ROI是由两个角点(左上角和右下角)定义的正方形或矩形区域。
● 四个坐标:
● TopLeftX: 左上角X坐标。
● TopLeftY: 左上角Y坐标。
● BotRightX: 右下角X坐标。
● BotRightY: 右下角Y坐标。
● 结构体: 这些坐标是 VL53L1_UserROI_t 类型的结构体的一部分。用户需要在结构体中定义这些ROI坐标值,然后调用驱动函数应用ROI更改。
● 最小ROI尺寸: 最小的ROI尺寸是4x4 SPAD矩阵。

在这里插入图片描述

在这里插入图片描述
设置完毕之后使用 VL53L1_StartMeasurement 启动测量。

	VL53L1_MultiRangingData_t MultiRangingData;
	VL53L1_MultiRangingData_t *pMultiRangingData = &MultiRangingData;
	uint8_t NewDataReady = 0;
	uint8_t NumROI = 16, RoiNumber=0, RoiStatus=0;
	int no_of_object_found = 0, j, k;
	VL53L1_RoiConfig_t pRoiConfig;
	
	pRoiConfig.NumberOfRoi=NumROI;
  
  printf("Start set Roi");
  for(k=0;k<4;k++)
	  for(j=0;j<4;j++)
	  {
		  pRoiConfig.UserRois[k*4+j].TopLeftX=j*4;
		  pRoiConfig.UserRois[k*4+j].TopLeftY=k*4+3;
		  pRoiConfig.UserRois[k*4+j].BotRightX=j*4+3;
		  pRoiConfig.UserRois[k*4+j].BotRightY=k*4;
		  printf("set Roi %d\n\rx: %d-%d    y: %d-%d\n\r",k*4+j,j*4,j*4+3,k*4,k*4+3);
	  }	
	
  /* VL53L1_SetROI must be called after VL53L1_SetPresetMode */
  status = VL53L1_SetROI(&VL53L1CBObj1, &pRoiConfig);
  if (!status){
    status = VL53L1_StartMeasurement(&VL53L1CBObj1);
  }
  else{
    printf("VL53L1_SetROI failed: error =%d\n\r", status);
    while(1){};
  };	
  if(status){
    printf("VL53L1_StartMeasurement failed: error = %d \n\r", status);
    while(1);
  }	

主程序

● 数据检查:
● VL53L1_GetMeasurementDataReady(&VL53L1CBObj1, &NewDataReady);:这个函数检查传感器的测量数据是否准备好。如果有数据可用,NewDataReady 会被设置为非零值。
● HAL_Delay(1);:插入一个1毫秒的延迟,避免在轮询过程中占用过多的CPU时间。
● 数据获取:
● 如果测量数据已经准备好,代码会调用 VL53L1_GetMultiRangingData(&VL53L1CBObj1, pMultiRangingData); 获取多区域测距数据。
● RoiNumber 和 RoiStatus 从 pMultiRangingData 中提取,表示当前ROI的编号和状态。
● RangeMilliMeter 是从 pMultiRangingData->RangeData[0] 中提取的测量距离(以毫米为单位)。
● 数据输出:
● printf 语句将获取到的数据(ROI编号、状态、测量距离)输出到控制台或串口。
● 数据格式为:RoiNumber, RoiStatus, RangeMilliMeter,每次测量后输出一行。
● 中断清除与新测量开始:
● 如果成功获取到数据并处理完,代码调用 VL53L1_ClearInterruptAndStartMeasurement(&VL53L1CBObj1); 清除中断并启动新的测量。

    do{ // polling mode
      status = VL53L1_GetMeasurementDataReady(&VL53L1CBObj1, &NewDataReady);
      HAL_Delay(1);
      if((!status)&&(NewDataReady!=0)){
        status = VL53L1_GetMultiRangingData(&VL53L1CBObj1, pMultiRangingData);
        RoiNumber=pMultiRangingData->RoiNumber;
        RoiStatus=pMultiRangingData->RoiStatus;

        printf("%1d,", RoiNumber);
        printf("%1d,", RoiStatus);
        printf("%d", pMultiRangingData->RangeData[0].RangeMilliMeter);
        printf ("\n\r");
        if (status==0){
          status = VL53L1_ClearInterruptAndStartMeasurement(&VL53L1CBObj1);
        }
      }
    }
    while (1);	

数据说明

RoiNumber: 8 位整数,表示与该测量数据相关的ROI编号。
RoiStatus: 当前ROI的状态,可能的值为 0, 1 或 2,分别表示“无效ROI”、“有效ROI”和“最后一个ROI”。
如果未检测到目标且测量有效,所有的距离值会被强制设置为最大值,并且其他返回值会设置为默认值(如0或8191)。

在这里插入图片描述

测试结果

VL53L1对着天花板测量数据如下所示,2个数据之间相处时间约为500ms。
在这里插入图片描述

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

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

相关文章

从 Oracle 到 TiDB 丨数据库资源评估指南

原文来源&#xff1a; https://tidb.net/blog/5058e24f 本文作者&#xff1a;柳冬冬 导读 在当今技术飞速发展的时代&#xff0c;传统单机数据库正面临着前所未有的挑战。随着人工智能、云计算和大数据的崛起&#xff0c;企业对数据库的性能、可靠性和扩展性的需求日益增…

wordcloud兼figma的词云图片python生成

文章目录 一.Figma1.简介2.特点 二.代码构成1.详细代码2.word.py代码详解3.成果图 一.Figma 1.简介 Figma是一款全平台可使用的使用软件&#xff0c;和Sketch功能差不多&#xff1b;但是他可以在Mac&#xff0c;Windows PC&#xff0c;Linux计算机甚至Chromebook&#xff0c;…

中国各地级市-产业增加值、产业升级、产业结构高级化(2000-2021年)

产业增加值、产业升级和产业结构高级化是衡量地区经济发展水平的重要指标&#xff1a; 产业增加值&#xff1a;指在一定时期内&#xff0c;单位产值的增长部分&#xff0c;体现了产值、产量和增加值的综合增长能力。 产业升级&#xff1a;指通过技术进步和效率提升&#xff0c…

5.sklearn-朴素贝叶斯算法、决策树、随机森林

文章目录 环境配置&#xff08;必看&#xff09;头文件引用1.朴素贝叶斯算法代码运行结果优缺点 2.决策树代码运行结果决策树可视化图片优缺点 3.随机森林代码RandomForestClassifier()运行结果总结 环境配置&#xff08;必看&#xff09; Anaconda-创建虚拟环境的手把手教程相…

产品售后|基于SprinBoot+vue的产品售后管理​​​​​​​系统(源码+数据库+文档)

产品售后管理系统 目录 基于SprinBootvue的产品售后管理系统 一、前言 二、系统设计 三、系统功能设计 管理员模块实现 客户模块实现 受理人员模块实现 工程师模块实现 厂商模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、…

STM32外部中断(总结了易出现的BUG)

本文主要讲述了&#xff0c;本人在使用STM32F103C8T6做项目时&#xff0c;使用到按键触发外部中断时&#xff0c;发现无法触发外部中断。通过查看寄存器找出问题的过程&#xff0c;并总结了出现该问题的原因。 出现的问题 在使用STM32F103C8T6做一个矩阵键盘任务时&#xff0…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(五)- 3GPP Release19 研究计划

一、引言&#xff1a; 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划&#xff0c;是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析&#xff08;一&#xff…

R语言报错 | object ‘integral‘ not found whilst loading name

1、报错背景 Registered S3 method overwritten by htmlwidgets:method from print.htmlwidget tools:rstudio Error: package or namespace load failed for ‘Seurat’:object integral not found whilst loading namespace spatstat.core 当我想library&…

RabbitMQ~架构、能力、AMQP、工作模式、高可用、死信队列了、事务机制了解

RabbitMQ RabbitMQ是使用Erlang编写的一个开源的消息中间件。它实现了AMQP(高级消息队列协议)&#xff0c;并支持其他消息传递协议&#xff1a;例如STOMP(简单文本定向消息协议)和MQTT(物联网协议)。 支持多种客户端如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、…

4-7 使用bios 中断 读取磁盘

1 首先是逻辑。 首先来看一下 他的编译代码的逻辑。 可以看到我 生成的 实际上是 Boot.bin , 这个文件可不止一个扇区&#xff0c; 然后将这个文件写入到了&#xff0c; disk1.img 这里加载了 disk1.img , disk2.img 我不太理解。 但是可以跑通&#xff0c; 暂时先不管了。…

How can I change from OpenAI to ChatOpenAI in langchain and Flask?

题意&#xff1a;“在 LangChain 和 Flask 中&#xff0c;如何将 OpenAI 更改为 ChatOpenAI&#xff1f;” 问题背景&#xff1a; This is an implementation based on langchain and flask and refers to an implementation to be able to stream responses from the OpenAI …

力扣763-划分字母区间(Java详细题解)

题目链接&#xff1a;763. 划分字母区间 - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷贪心类的题目所以该题就默认用贪心方法来做。 贪心方法&#xff1a;局部最优推出全局最优。 如果一个题你觉得可以用局部最优推出全局最优&#xf…

云服务器系统盘存储空间不够用怎么办?解决方法:扩容或挂载数据盘

云服务器系统盘满了不够用怎么办&#xff1f;服务器百科&#xff1a;可以系统盘扩容&#xff0c;也可以通过挂载数据盘来增大存储空间。 1、系统盘扩容教程&#xff1a;使用云服务器系统盘空间不足时&#xff0c;可以在ECS控制台上扩容云盘的容量以增加存储空间。阿里云支持云…

MCU3.电平等一些名词

1.电平的简单定义 计算机由各种硬件组成&#xff0c;只认识0和1&#xff0c;可以通过改变电压来向计算机输入数据&#xff08;0和1&#xff09; 例如&#xff1a;最大电压为3.3V 电压范围是0~3.3V&#xff0c;可以定义0~1V较低的电压表示0&#xff0c;定义2~3.3V较高的电压表…

领域驱动设计——大型结构(Large-Scale Structure)的综合运用

在一个大的、复杂的系统中&#xff0c;可能需要在一个设计中综合运用几种策略。那么&#xff0c;大型结构如何与CONTEXT MAP共存?应该把构造块放到哪里?第一步先做什么?第二步和第三步呢?如何设计你的战略? 把大型结构与BOUNDED CONTEXT结合起来使用 战略设计的3个基本原…

SpringBoot中@Value获取值和@ConfigurationProperties获取值用法及比较

SpringBoot中Value获取值和ConfigurationProperties获取值用法及比较 更新时间&#xff1a;2024年08月08日 09:41:48 作者&#xff1a;岳轩子 在Spring Boot中,Value注解是一个非常有用的特性,它允许我们将外部的配置注入到我们的Bean中,ConfigurationProperties用于将配置文件…

理解调试和组织 CSS——WEB开发系列26

CSS&#xff08;层叠样式表&#xff09;不仅是为网页提供样式的关键工具&#xff0c;也是调试和优化网页表现的重要部分。无论是调整网页布局&#xff0c;还是确保样式的一致性&#xff0c;掌握调试和组织 CSS 的技巧都是至关重要的。 一、使用浏览器开发者工具 浏览器开发者工…

【国外比较权威的免费的卫星数据网站——Sentinel Open Access Hub】

Sentinel Open Access Hub 网址&#xff1a;https://scihub.copernicus.eu/dhus/#/home简介&#xff1a;哨兵系列卫星科研数据中心&#xff08;Sentinel Open Access Hub&#xff09;是欧洲航天局&#xff08;ESA&#xff09;提供卫星数据的官方网站。该网站提供哨兵系列卫星的…

八、2 DMA数据转运 DMA函数介绍

把数组定义在Flash中&#xff0c;可以节省SRAM的空间 去掉const不会影响程序运行&#xff0c;但会占用SRAM的空间 1、步骤 &#xff08;1&#xff09;RCC开启DMAD的时钟 &#xff08;2&#xff09;调用DMA_Init&#xff0c;初始化参数 &#xff08;3&#xff09;调用DMA_Cmd…

Java的动态代理(实际案例秒懂!)

在看动态代理解决两个案例之前&#xff0c;请先看链接VCR 《java代理》2分钟动画_哔哩哔哩_bilibili 一.动态代理-精致小案例 需求分析 传统方法 就是定义一个接口&#xff0c;然后实现类去实现规定的run方法 缺点&#xff1a;代码很冗余&#xff0c;有一些运行前和运行后…