最近在弄ST的课程,需要样片的可以加群申请:615061293 。
VL53L8CX传感器内置了一个固件功能,可以检测场景中的运动。这个运动指示器是基于连续帧之间来计算的。使用插件vl53l8cx_plugin_motion_indicator可以使用这个选项。
运动指示器通过vl53l8cx_motion_indicator_init()函数进行初始化。如果用户想要更改传感器的分辨率,他必须使用专用函数vl53l8cx_motion_indicator_set_resolution()来更新运动指示器的分辨率。
用户还可以更改检测运动的最小和最大距离。最小距离和最大距离之间的差异不能超过1500毫米。默认情况下,距离是在400毫米到1500毫米之间初始化的。
结果存储在motion_indicator字段中。在这个字段里,数组motion给出了每个区域的运动强度值。高值表示帧之间的高运动变化。典型的运动会给出一个在100到500之间的值。这种敏感性取决于集成时间、目标距离和目标反射率。
对于低功耗应用,理想的组合是使用运动指示器与自主测距模式,并在运动上编程检测阈值。这允许在FoV(视场)中检测运动变化,同时保持最小的功耗。
https://www.bilibili.com/video/BV17T421S7qx/
https://www.wjx.top/vm/OhcKxJk.aspx#
https://download.csdn.net/download/qq_24312945/89328515
首先需要准备一个开发板,这里我准备的是自己绘制的开发板,需要的可以进行申请。
主控为STM32G431CB,TOF为VL53L8CX
测试版所用的MCU为STM32G431CB。
查看原理图,PA9和PA10设置为开发板的串口。
配置串口。
在这个应用中,VL53L8CX模块通过I2C(IIC)接口与主控器通信。具体来说,VL53L8CX模块的I2C引脚连接到主控器的PA8和PB5两个IO口。
配置IIC为快速模式,速度为400k。
若进行IIC通讯,LPn设置为高电平状态。
这里对应管脚为PA12。
配置为PA12。
自主模式可以通过获取INT管脚进行判断数据是否准备好。
配置PA11为输入模式。
本节介绍在不需要使用样例应用时如何使用STM32CubeMX将X-CUBE-TOF1软件包添加到项目中。有了这样的设置,就只配置了驱动层。
打开魔术棒,勾选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口驱动VL53L8CX进行复位的代码,由于没有配置对应的IO,所以需要注释掉。
在main.c中添加对应头文件。
/* USER CODE BEGIN Includes */ #include "stdio.h" #include "custom_ranging_sensor.h" #include "vl53l8cx_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; VL53L8CX_Motion_Configuration motion_config; /* 运动配置 */ VL53L8CX_Object_t *pL8obj = CUSTOM_RANGING_CompObj[CUSTOM_VL53L8CX]; VL53L8CX_ResultsData Results; /* 来自VL53L5CX的结果数据 */ /*********************************/ /* 编程运动指示器 */ /*********************************/ /* 使用4x4分辨率创建运动指示器 */ status = vl53l8cx_motion_indicator_init(&pL8obj- >Dev, &motion_config, VL53L8CX_RESOLUTION_4X4); if(status) { printf("运动指示器初始化失败,状态 : %un", status); return status; } /* (可选) 更改用于检测运动的最小和最大距离。最小和最大之间的差异 * 不得超过1500mm,最小值不能小于400mm,否则下面的函数返回错误127 */ status = vl53l8cx_motion_indicator_set_distance_motion(&pL8obj- >Dev, &motion_config, 1000, 2000); if(status) { printf("设置运动指示器距离失败,状态 : %un", status); return status; } /* 如果用户想要更改分辨率,他还需要更新运动指示器的分辨率 */ //status = vl53l5cx_set_resolution(&Dev, VL53L5CX_RESOLUTION_4X4); //status = vl53l5cx_motion_indicator_set_resolution(&Dev, &motion_config, VL53L5CX_RESOLUTION_4X4); /* 为了示例,增加测距频率 */ status = vl53l8cx_set_ranging_frequency_hz(&pL8obj- >Dev, 2); if(status) { printf("设置vl53l8cx测距频率失败,状态 : %urn", status); return status; } /*********************************/ /* 测距循环 */ /*********************************/ status = vl53l8cx_start_ranging(&pL8obj- >Dev); /* USER CODE END 2 */
主程序来获取对应的isReady位状态来判定数据是否准备好或者判断INT的IO状态也可。
/* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(HAL_GPIO_ReadPin ( GPIOA, GPIO_PIN_11) ==0) { status = vl53l8cx_check_data_ready(&pL8obj- >Dev, &isReady); if(isReady) { vl53l8cx_get_ranging_data(&pL8obj- >Dev, &Results); /* 由于传感器默认设置为4x4模式,我们总共有 * 16个区域要打印。在此示例中,只打印第一个区域的数据 */ printf("打印数据编号 : %3un", pL8obj- >Dev.streamcount); for(i = 0; i < 16; i++) { printf("区域 : %3d, 运动强度 : %3lun", i, Results.motion_indicator.motion[motion_config.map_id[i]]); } printf("n"); } } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */
静止状态下运动强度如下所示。
检测运动情况下运动强度如下所示。
全部0条评论
快来发表一下你的评论吧 !