0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于STM32CUBEMX驱动TOF模块VL53l0x(3)----驱动多个VL53L0X

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-12-01 15:47 次阅读

概述

在本章中,我们将探讨如何同时驱动多个VL53L0X传感器进行距离测量。我们将介绍如何有效地管理多个传感器之间的通信和控制,以确保它们能够同时进行准确的距离测量。通过本章的学习,将能够了解如何利用多个VL53L0X传感器的优势,为应用程序提供更全面的环境感知能力。
最近在弄ST的课程,需要样片的可以加群申请:615061293 。

在这里插入图片描述

视频教学

[https://www.bilibili.com/video/BV1wN4y1X7aw/]

样品申请

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

源码下载

[https://download.csdn.net/download/qq_24312945/88332775]

修改设备地址

VL53L0X使用I²C总线进行通信。默认情况下,VL53L0X的7位地址为0x29。然而,为了避免地址冲突并允许多个传感器共享相同的I2C总线,用户可以通过向寄存器I2C_SLAVE_DEVICE_ADDRESS(寄存器地址为0x8A)写入自定义的7位地址来修改传感器的地址。

在这里插入图片描述

修改后如下所示。

// Public Methods //////////////////////////////////////////////////////////////

void VL53L0X_setAddress(uint8_t add,uint8_t new_addr)
{
  VL53L0X_WriteByte(add,I2C_SLAVE_DEVICE_ADDRESS, new_addr & 0x7F);

}

在VL53L0X.h文件,该文件包含了VL53L0X传感器的相关定义和配置。
在VL53L0X.h文件中,可以定义2个设备的地址常量,分别表示不同的传感器。例如,可以使用以下方式定义地址常量:

#define VL53L0X_DEFAULT_I2C_ADDR1 0x29  ///< The fixed I2C addres
#define VL53L0X_DEFAULT_I2C_ADDR2 0x30  ///< The fixed I2C addres

以上示例展示了两个设备地址常量的定义,分别表示不同的传感器。可以根据您实际使用的传感器数量和配置需求,增加或减少设备地址常量的定义。
在代码中,可以使用这些设备地址常量来指定不同传感器的地址。例如,如果想要使用第一个传感器的地址,可以使用VL53L0X_DEFAULT_I2C_ADDR1来表示该地址。请注意,需要根据实际情况将这些地址常量与传感器的物理连接和配置相对应。确保将正确的地址常量分配给相应的传感器,以确保正确的通信和操作。
在进行地址常量定义时,建议参考VL53L0X传感器的数据手册和相关文档,以了解更多关于传感器地址和配置的详细信息
这里的地址值是根据实际需求和硬件连接情况选择的,确保每个设备具有唯一的地址是非常重要的。通过使用定义的设备地址常量,可以轻松地管理和操作多个VL53L0X传感器。通过为每个传感器分配唯一的设备地址常量,可以在代码中使用这些常量来指定与每个传感器对应的地址。这样,可以轻松地区分不同的传感器,并发送适当的命令和配置来与每个传感器进行通信和操作。通过使用定义的设备地址常量,可以轻松管理和操作多个传感器,无需手动跟踪和设置每个传感器的地址。这提供了方便和灵活性,特别适用于需要同时使用多个VL53L0X传感器的应用场景。

配置VL53L0X

在对应的demo板子中,管脚图如下所示。
在这里插入图片描述

在下面代码中,展示了对多个VL53L0X传感器进行初始化和配置的过程。每个传感器通过不同的管脚连接到主板上,并通过控制GPIO引脚的电平来选择对应的传感器进行操作。
以下是对代码的扩展说明:

  1. 首先,通过控制GPIO引脚的电平,将相应的引脚设置为RESET状态,以准备初始化对应的传感器。具体来说,对于每个传感器,通过控制两个GPIO引脚,即片选,将它们设置为RESET状态。
  2. 然后,通过控制GPIO引脚的电平,将相应的引脚设置为SET状态,以选择对应的传感器进行操作。对于每个传感器,通过控制两个GPIO引脚,即片选,将它们设置为SET状态。
  3. 在每次切换传感器之后,添加了一段延时,以确保引脚状态的切换稳定。这段延时的长度可以根据实际需求进行调整。
    对每个传感器执行以下操作:
    a. 初始化传感器,使用VL53L0X_Init函数,将传感器的地址作为参数传递。
    b. 通过VL53L0X_setAddress函数,修改传感器的地址,使用VL53L0X_DEFAULT_I2C_ADDR2作为源地址。

通过代码,可以初始化和配置多个VL53L0X传感器,并根据需要选择不同的传感器进行操作。请注意,以上代码示例仅为参考,您需要根据自己的硬件连接和需求进行相应的修改和调整。确保参考VL53L0X传感器的文档和数据手册,以了解更多关于初始化、配置和操作传感器的详细信息。

/* USER CODE BEGIN 2 */
	// 启动第一个VL53L0X传感器并关闭第二个VL53L0X传感器
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_RESET);

	// 等待200ms以确保第一个VL53L0X传感器启动完成
	HAL_Delay(200);

	// 使用默认地址初始化第一个VL53L0X传感器
	if (!VL53L0X_Init(VL53L0X_DEFAULT_I2C_ADDR1, true))
	{
			printf("Failed to detect and initialize sensor!");
			while (1) {}  // 如果初始化失败,则无限循环
	}

	// 修改第一个VL53L0X的I2C地址,以便我们可以与第二个VL53L0X传感器通信
	VL53L0X_setAddress(VL53L0X_DEFAULT_I2C_ADDR1, VL53L0X_DEFAULT_I2C_ADDR2);

	// 启动第二个VL53L0X传感器
	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4, GPIO_PIN_SET);
	HAL_Delay(200);  // 等待200ms以确保第二个VL53L0X传感器启动完成

	// 使用之前的默认地址初始化第二个VL53L0X传感器
	if (!VL53L0X_Init(VL53L0X_DEFAULT_I2C_ADDR1, true))
	{
			printf("Failed to detect and initialize sensor!");
			while (1) {}  // 如果初始化失败,则无限循环
	}
	
  /* USER CODE END 2 */

主程序

在代码中,展示了如何在主程序中循环读取2个VL53L0X传感器的数据。以下是代码的扩展说明:

  1. 在主程序的while循环中,首先使用VL53L0X_readRangeSingleMillimeters函数从VL53L0X传感器2(设备地址为VL53L0X_DEFAULT_I2C_ADDR2)读取距离数据然后,使用printf函数打印输出距离值。
  2. 之后等待0.5秒。
  3. 接下来,使用VL53L0X_readRangeSingleMillimeters函数从VL53L0X传感器1(设备地址为VL53L0X_DEFAULT_I2C_ADDR1)读取距离数据然后,使用printf函数打印输出距离值。
  4. 之后等待0.5秒。
    请注意,代码示例仅为参考,您需要根据您的实际硬件配置、VL53L0X库和应用需求进行相应的修改和调整。确保参考VL53L0X传感器的文档和数据手册,以了解更多关于数据读取和解析的详细信息。
/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    // 从第二个VL53L0X传感器读取距离值(单位:毫米)
    L = VL53L0X_readRangeSingleMillimeters(VL53L0X_DEFAULT_I2C_ADDR2);
    printf("L=%d", L);  // 打印从第二个VL53L0X传感器读取的距离值
    HAL_Delay(500);  // 延迟500ms(0.5秒)

    // 从第一个VL53L0X传感器读取距离值(单位:毫米)
    R = VL53L0X_readRangeSingleMillimeters(VL53L0X_DEFAULT_I2C_ADDR1);
    printf("R=%d", R);  // 打印从第一个VL53L0X传感器读取的距离值
    HAL_Delay(500);  // 延迟500ms(0.5秒)
		
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

测试结果

测试距离结果如下所示。

在这里插入图片描述

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 驱动
    +关注

    关注

    11

    文章

    1717

    浏览量

    84343
  • TOF
    TOF
    +关注

    关注

    9

    文章

    435

    浏览量

    35902
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14447
  • VL53L0X
    +关注

    关注

    0

    文章

    7

    浏览量

    2401
收藏 人收藏

    评论

    相关推荐

    新一代ToF 激光测距模块VL53L0X

    ,所以回程距离的计算公式也很简单,即“光速” x “时间延迟”。VL53L0X 是新一代 ToF 激光测距模块,采用目前市场上最小型的封装,可基于各种目标物颜色和反射特性进行精确测距。
    发表于 04-06 14:03

    怎么使用VL53L0XSTM32L476 Nucleo64?

    嗨,我是一个新手试图通过将它们连接到STM32L476核64板来研究它们。目前我正在尝试使用飞行时间传感器VL53L0X分线板,通过在核64上的I2C引脚连接它。此外,我正在使用系统工作台来运行生成
    发表于 10-18 17:13

    VL53L0X可以永久更改I2C地址吗?

    大家好!关于VL53L0X飞行时间测距和手势检测传感器的简短问题。数据表提到了“可编程I2C地址”。是否可以永久地将默认I2C地址更改为另一个地址?新的I2C地址是否会永久存储在VL53L0X中?我
    发表于 10-23 16:46

    在Windows 10中怎么安装VL53L0X/P-NUCLEO-53L0A1 GUI

    嗨, 任何人都可以帮我在Windows 10机器上安装VL53L0X / P-NUCLEO-53L0A1 GUI吗? 我使用UM2072作为指导,但由于我没有“管理员权限”,因此exe安装没有完成
    发表于 11-12 10:35

    如何减少VL53L0X FOV?

    你好。有谁知道是否有可能减少VL53L0X FOV放在它前面一小块塑料(黑暗?)管道? 它可以运作得足够好还是串扰会变得不可接受?任何其他选项,以减少检测FOV?提前感谢
    发表于 11-29 10:21

    Vl53L0X测距传感器如何通过GPIO中断

    #interrupt#vl53l0x#stm32f103#interrupt-status-register以上来自于谷歌翻译以下为原文 hi,how does the Vl53L0X ranging sensor adress the GPIO for the in
    发表于 03-22 09:25

    是否可以为VL53L0X设置最小可检测范围?

    嗨,是否可以为VL53L0X设置最小可检测范围?我有一个在10cm区域有一些寄生反射的应用,我想忽略它。是否可以设置VL53L0X的可检测范围?以上来自于谷歌翻译以下为原文 Hi
    发表于 04-11 15:39

    VL53L0x不会受到什么样的材料干扰

    大家好,在我的项目中,它有一个覆盖VL53L0x(约5厘米)以上。我想知道VL53L0x不会受到什么样的材料干扰。这意味着VL53L0x在其上方有盖子时可以正常工作。非常感谢。火星
    发表于 04-12 15:17

    VL53L0x环境光灵敏度无法测量距离

    ?Best regardsSoren #light-intensity #light #vl53l0x #vl53l0 #tof #ir #time-of-flight #ambient-light #halogen
    发表于 04-15 16:42

    VL53L0X X-NUCLEO-53L0A1盖玻片材料是什么

    我们正在使用VL53L0X IR飞行时间传感器开发产品。传感器必须位于塑料外壳内,透过IR透射窗口材料。为了测试这样的布置,X-NUCLEO-53L0A1配有气隙垫片和覆盖玻璃材料。我想知道这种玻璃
    发表于 06-12 07:15

    RT-Thread VL53L0X TOF传感器驱动设计资料实现

    1、RT-Thread VL53L0X TOF传感器驱动实现  Time of flight(TOF),中文翻译为“飞行时间”。飞行时间技术在广义上可理解为通过测量物体、粒子或波在固定
    发表于 09-15 17:08

    请问VL53L0X的FOV范围是多少?

    数据表显示 VL53L0X 具有 25 度的 FOV。然而,每个 VL53L0X 显示的 FOV 略有不同。比如一只VL53L0X好像是24度,另一只VL53L0X好像是26度。
    发表于 12-08 06:12

    如何添加多个vl53l0x传感器?

    我已经成功实现了一个 vl53l0x 传感器,但希望添加更多。我找到了“AN4846 Application note Using multiple VL53L0X in a single
    发表于 12-27 06:48

    为什么VL53L0X库总是返回RangeStatus非零?

    我们使用出厂时默认配置的 VL53L0X 传感器。我们在传感器上运行 VL53L0X_DataInit(),然后每 100 毫秒调用一次
    发表于 12-28 08:27

    VL53L0X GUI无法识别NUCLEO-L476RG板怎么解决?

    大家好,当我尝试使用 VL53L0X GUI 应用程序时遇到问题:它无法识别 NUCLEO-L476RG 板。首先,我按照手册安装了 STSW-LINK007和STSW-LINK009。然后我将
    发表于 01-09 06:06