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


    概述

    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#

    在这里插入图片描述

    源码下载

    https://download.csdn.net/download/qq_24312945/88430756

    生成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 */
    
    • 1
    • 2
    • 3

    函数声明和串口重定向:

    /* 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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    代码配置

    在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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    函数与变量定义:

    /* 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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    添加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 */
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    主程序

    主程序来获取对应的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 */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    演示结果

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

    在这里插入图片描述

  • 相关阅读:
    5.23 BCC工具之drsnoop.py解读
    C#复习:面向对象基本概念
    css3 中选择器间有空格与没空格的区别?
    Linux驱动开发 数据的传输和辅助信息的作用
    量化投资 离散时间随机过程
    <C++>多态之纯虚函数与抽象类,学习不一样的析构函数
    【前端】Vue+Element UI案例:通用后台管理系统-登陆页面功能:登录权限跳转、路由守卫、退出
    GPT-4对编程开发的支持
    【Vue】input框自动聚焦且输入验证码后跳至下一位
    模拟实现vue3.x中的计算属性
  • 原文地址:https://blog.csdn.net/qq_24312945/article/details/133844518