在本章中,我们将探讨如何同时驱动多个VL6180传感器进行距离测量。我们将介绍如何有效地管理多个传感器之间的通信和控制,以确保它们能够同时进行准确的距离测量。此外,还将扩展我们的教程,展示如何同时驱动多个VL6180X传感器进行距离测量和光强测量。VL6180X传感器在VL6180的基础上增加了光强测量功能,这使得它们能够提供关于环境光强度的有用信息。对于那些需要考虑光照条件的应用场景,这将非常重要。我们将讨论如何使用适当的命令和配置设置,同时利用两个传感器的功能,以获取准确的距离和光强度数据。通过本章的学习,将能够了解如何利用多个VL6180X传感器的优势,为应用程序提供更全面的环境感知能力。。
https://www.wjx.top/vm/OhcKxJk.aspx#
https://www.bilibili.com/video/BV1mW4y1o7yY/
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(4)----测量环境光
https://download.csdn.net/download/qq_24312945/88051751
在修改设备地址方面,VL6180X传感器使用I²C总线进行通信。默认情况下,每个VL6180X传感器的7位地址为0x29。然而,为了避免地址冲突并允许多个传感器共享相同的I2C总线,用户可以通过向特定寄存器写入自定义的7位地址来修改传感器的地址。
要修改传感器的地址,您需要访问寄存器I2C_SLAVE__DEVICE_ADDRESS,其地址为0x212。通过向该寄存器写入新的7位地址,您可以成功修改传感器的地址。请注意,每个传感器都需要具有唯一的地址,以确保正确的通信和识别。
需要注意的是,通过修改寄存器I2C_SLAVE__DEVICE_ADDRESS(地址为0x212)来修改VL6180X传感器的地址是一种临时性的设置。每次传感器上电后,地址会恢复为初始值(默认为0x29)。这意味着在每次上电后,需要重新设置传感器的地址,以确保正确的通信和操作。
首先,打开VL6180.h文件,该文件包含了VL6180X传感器的相关定义和配置。在该文件中,您可以找到定义设备地址的部分,并进行以下方式的地址常量定义:
#define VL6180X_DEFAULT_I2C_ADDR1 0x29 ///< The fixed I2C addres
#define VL6180X_DEFAULT_I2C_ADDR2 0x2A ///< The fixed I2C addres
#define VL6180X_DEFAULT_I2C_ADDR3 0x2B ///< The fixed I2C addres
#define VL6180X_DEFAULT_I2C_ADDR4 0x2C ///< The fixed I2C addres
以上示例展示了四个设备地址常量的定义,分别表示不同的传感器。可以根据您实际使用的传感器数量和配置需求,增加或减少设备地址常量的定义。
在代码中,可以使用这些设备地址常量来指定不同传感器的地址。例如,如果想要使用第一个传感器的地址,可以使用DEVICE_ADDRESS_1来表示该地址。请注意,需要根据实际情况将这些地址常量与传感器的物理连接和配置相对应。确保将正确的地址常量分配给相应的传感器,以确保正确的通信和操作。
在进行地址常量定义时,建议参考VL6180X传感器的数据手册和相关文档,以了解更多关于传感器地址和配置的详细信息。
这里的地址值是根据实际需求和硬件连接情况选择的,确保每个设备具有唯一的地址是非常重要的。通过使用定义的设备地址常量,可以轻松地管理和操作多个VL6180X传感器。通过为每个传感器分配唯一的设备地址常量,可以在代码中使用这些常量来指定与每个传感器对应的地址。这样,可以轻松地区分不同的传感器,并发送适当的命令和配置来与每个传感器进行通信和操作。通过使用定义的设备地址常量,可以轻松管理和操作多个传感器,无需手动跟踪和设置每个传感器的地址。这提供了方便和灵活性,特别适用于需要同时使用多个VL6180X传感器的应用场景。
在对应的demo板子中,管脚图如下所示。
在下面代码中,展示了对多个VL6180X传感器进行初始化和配置的过程。每个传感器通过不同的管脚连接到主板上,并通过控制GPIO引脚的电平来选择对应的传感器进行操作。
以下是对代码的扩展说明:
/* USER CODE BEGIN 2 */
//VL6180_1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET);
//VL6180_3
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
//VL6180_2
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET);
//VL6180_4
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_SET);
uint8_t ii;
uint8_t id;
HAL_Delay(1);
/************修改VL6180_4地址为VL6180X_DEFAULT_I2C_ADDR4(0x2C)*********************/
VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);
VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR4);
// HAL_Delay(100);
ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR4,0x0212);
printf("VL6180_4地址为=0x%X\n",ii);
VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR4,3);//缩放x3
id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR4);
printf("VL6180_4 id=%d\n",id);
/************修改VL6180_3地址为VL6180X_DEFAULT_I2C_ADDR3(0x2B)*********************/
//VL6180_3
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
HAL_Delay(1);
VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);
VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR3);
ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR3,0x0212);
printf("VL6180_3地址为=0x%X\n",ii);
VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR3,3);//缩放x3
id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR3);
printf("VL6180_3 id=%d\n",id);
/************修改VL6180_2地址为VL6180X_DEFAULT_I2C_ADDR2(0x2A)*********************/
//VL6180_2
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);
HAL_Delay(1);
VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);
VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR2);
// HAL_Delay(100);
ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR2,0x0212);
printf("VL6180_2地址为=0x%X\n",ii);
VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR2,3);//缩放x3
id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR2);
printf("VL6180_2 id=%d\n",id);
/************修改VL6180_1地址为VL6180X_DEFAULT_I2C_ADDR3(0x29)*********************/
//VL6180_1
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
HAL_Delay(1);
VL6180X_Init(VL6180X_DEFAULT_I2C_ADDR1);
// VL6180X_WriteByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212,VL6180X_DEFAULT_I2C_ADDR1);
ii=VL6180X_ReadByte(VL6180X_DEFAULT_I2C_ADDR1,0x0212);
printf("VL6180_1地址为=0x%X\n",ii);
VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR1,3);//缩放x3
id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR1);
printf("VL6180_1 id=%d\n",id);
/* USER CODE END 2 */
在代码中,展示了如何在主程序中循环读取4个VL6180X传感器的数据。以下是代码的扩展说明:
/* USER CODE BEGIN WHILE */
while (1)
{
VL6180_L4=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR4);
printf("VL6180_L4=%dmm\n",VL6180_L4*3);
lux_L3=VL6180X_Read_Lux(VL6180X_DEFAULT_I2C_ADDR3,VL6180X_ALS_GAIN_40);
printf("lux=%lf\n",lux_L3);
VL6180_L3=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR3);
printf("VL6180_L3=%dmm\n",VL6180_L3*3);
VL6180_L2=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR2);
printf("VL6180_L2=%dmm\n",VL6180_L2*3);
lux_L1=VL6180X_Read_Lux(VL6180X_DEFAULT_I2C_ADDR1,VL6180X_ALS_GAIN_40);
printf("lux=%lf\n",lux_L1);
VL6180_L3=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR1);
printf("VL6180_L1=%dmm\n",VL6180_L1*3);
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */