多区域扫描模式是 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/]
[https://www.wjx.top/vm/OhcKxJk.aspx#]
[https://download.csdn.net/download/qq_24312945/89703992]
首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32WB55RGV6,TOF为VL53L1。
● 多区域检测:支持对投影图像的多个区域进行独立测距,有助于精确的梯形校正。
● 高精度与灵活性:用户可以根据投影需求自定义 ROI 的数量和大小,实现更精细的图像调整。
● 应用场景:除了投影机梯形校正,该模式还适用于需要多点距离测量的其他应用,如机器人导航和环境映射。
用STM32CUBEMX生成例程,这里使用MCU为STM32WB55RG。
配置时钟树,配置时钟为32M。
查看原理图,PB6和PB7设置为开发板的串口。
配置串口。
在这个应用中,VL53L1模块通过I2C(IIC)接口与主控器通信。具体来说,VL53L1模块的I2C引脚连接到主控器的PB8和PB9两个IO口。
配置IIC为快速模式,速度为400k。
XSHUT引脚是由主机连接和控制的,这种设计优化了功耗,因为设备在不使用时可以被完全关闭,然后通过主机使用XSHUT引脚来唤醒。当AVDD存在且XSHUT为低电平时,设备处于硬件待机模式(HW Standby mode)。如果XSHUT引脚不由主机控制,而是通过上拉电阻连接到AVDD,那么设备在固件启动(FW BOOT)后会自动进入软件待机(SW STANDBY),而不会进入硬件待机。
在VL53L1X传感器中,GPIO1(通用输入输出引脚1)通常用于中断信号输出。
配置如下所示。
本节介绍在不需要使用样例应用时如何使用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。
在 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 传感器的一个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 传感器的一个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);
● 默认设置: 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 %dnrx: %d-%d y: %d-%dnr",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 =%dnr", status);
while(1){};
};
if(status){
printf("VL53L1_StartMeasurement failed: error = %d nr", 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 ("nr");
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。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !