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

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

3天内不再提示

基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(5)----驱动多个VL6180X

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

概述

在本章中,我们将探讨如何同时驱动多个VL6180传感器进行距离测量。我们将介绍如何有效地管理多个传感器之间的通信和控制,以确保它们能够同时进行准确的距离测量。此外,还将扩展我们的教程,展示如何同时驱动多个VL6180X传感器进行距离测量和光强测量。VL6180X传感器在VL6180的基础上增加了光强测量功能,这使得它们能够提供关于环境光强度的有用信息。对于那些需要考虑光照条件的应用场景,这将非常重要。我们将讨论如何使用适当的命令和配置设置,同时利用两个传感器的功能,以获取准确的距离和光强度数据。通过本章的学习,将能够了解如何利用多个VL6180X传感器的优势,为应用程序提供更全面的环境感知能力。
最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。
在这里插入图片描述

样品申请

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

视频教程

https://www.bilibili.com/video/BV1mW4y1o7yY/

完整代码下载

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传感器的应用场景。

配置vl6180x

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

  1. 首先,通过控制GPIO引脚的电平,将相应的引脚设置为RESET状态,以准备初始化对应的传感器。具体来说,对于每个传感器,通过控制两个GPIO引脚,即片选,将它们设置为RESET状态。
  2. 然后,通过控制GPIO引脚的电平,将相应的引脚设置为SET状态,以选择对应的传感器进行操作。对于每个传感器,通过控制两个GPIO引脚,即片选,将它们设置为SET状态。
  3. 在每次切换传感器之后,添加了一段延时,以确保引脚状态的切换稳定。这段延时的长度可以根据实际需求进行调整。
    对每个传感器执行以下操作:
    a. 初始化传感器,使用VL6180X_Init函数,将传感器的地址作为参数传递。
    b. 通过VL6180X_WriteByte函数,修改传感器的地址,使用VL6180X_DEFAULT_I2C_ADDR1作为源地址,将自定义地址写入0x0212寄存器。
    c. 使用VL6180X_ReadByte函数读取修改后的地址,并进行打印输出,以确认地址修改成功。
    d. 使用VL6180x_UpscaleSetScaling函数设置传感器的缩放因子。
    e. 使用VL6180X_Read_ID函数读取传感器的ID,并进行打印输出,以确认传感器正常工作。
    通过代码,可以初始化和配置多个VL6180X传感器,并根据需要选择不同的传感器进行操作。请注意,以上代码示例仅为参考,您需要根据自己的硬件连接和需求进行相应的修改和调整。确保参考VL6180X传感器的文档和数据手册,以了解更多关于初始化、配置和操作传感器的详细信息。
/* 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%Xn",ii);		
	VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR4,3);//缩放x3
	id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR4);
	printf("VL6180_4 id=%dn",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%Xn",ii);		
	VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR3,3);//缩放x3
	id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR3);
	printf("VL6180_3 id=%dn",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%Xn",ii);		
	VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR2,3);//缩放x3
	id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR2);
	printf("VL6180_2 id=%dn",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%Xn",ii);		
	VL6180x_UpscaleSetScaling(VL6180X_DEFAULT_I2C_ADDR1,3);//缩放x3
	id=VL6180X_Read_ID(VL6180X_DEFAULT_I2C_ADDR1);
	printf("VL6180_1 id=%dn",id);

  /* USER CODE END 2 */

主程序

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

  1. 在主程序的while循环中,首先使用VL6180X_Read_Range函数从VL6180X传感器4(设备地址为VL6180X_DEFAULT_I2C_ADDR4)读取距离数据,并将其乘以3(根据缩放因子)以得到准确的距离值。然后,使用printf函数打印输出距离值。
  2. 接下来,使用VL6180X_Read_Lux函数从VL6180X传感器3(设备地址为VL6180X_DEFAULT_I2C_ADDR3)读取光强度数据,并使用printf函数打印输出光强度值。请注意,此处使用了指定的增益参数(VL6180X_ALS_GAIN_40),您可以根据实际需求选择适当的增益值。
  3. 然后,使用VL6180X_Read_Range函数从VL6180X传感器2(设备地址为VL6180X_DEFAULT_I2C_ADDR2)读取距离数据,并将其乘以3(根据缩放因子)以得到准确的距离值。然后,使用printf函数打印输出距离值。
  4. 接下来,使用VL6180X_Read_Lux函数从VL6180X传感器1(设备地址为VL6180X_DEFAULT_I2C_ADDR1)读取光强度数据,并使用printf函数打印输出光强度值。同样地,使用指定的增益参数(VL6180X_ALS_GAIN_40),您可以根据实际需求选择适当的增益值。
  5. 最后,在每次循环迭代之间添加适当的延时,例如使用HAL_Delay函数延时1秒。
    请注意,代码示例仅为参考,您需要根据您的实际硬件配置、VL6180X库和应用需求进行相应的修改和调整。确保参考VL6180X传感器的文档和数据手册,以了解更多关于数据读取和解析的详细信息。
/* USER CODE BEGIN WHILE */
  while (1)
  {
		VL6180_L4=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR4);
		printf("VL6180_L4=%dmmn",VL6180_L4*3);
		
		
		lux_L3=VL6180X_Read_Lux(VL6180X_DEFAULT_I2C_ADDR3,VL6180X_ALS_GAIN_40);
		printf("lux=%lfn",lux_L3);				
		VL6180_L3=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR3);
		printf("VL6180_L3=%dmmn",VL6180_L3*3);		
		
		VL6180_L2=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR2);
		printf("VL6180_L2=%dmmn",VL6180_L2*3);
		
		
		lux_L1=VL6180X_Read_Lux(VL6180X_DEFAULT_I2C_ADDR1,VL6180X_ALS_GAIN_40);
		printf("lux=%lfn",lux_L1);		
		VL6180_L3=VL6180X_Read_Range(VL6180X_DEFAULT_I2C_ADDR1);
		printf("VL6180_L1=%dmmn",VL6180_L1*3);			
		HAL_Delay(1000);			
		
		
    /* USER CODE END WHILE */

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

测试结果

测试结果如下所示。
在这里插入图片描述
审核编辑:汤梓红

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

    关注

    2526

    文章

    48093

    浏览量

    740062
  • 模块
    +关注

    关注

    7

    文章

    2484

    浏览量

    46530
  • TOF
    TOF
    +关注

    关注

    9

    文章

    435

    浏览量

    35902
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14447
收藏 人收藏

    评论

    相关推荐

    基于STM32CUBEMX驱动TOF模块VL6180VL6180X(2)----修改测量范围

    当使用VL6180传感器进行测距时,可以通过修改缩放因子来改变可测量的距离范围。VL6180是一种基于飞行时间原理的传感器,通过测量光信号的往返时间来确定物体与传感器之间的距离。
    的头像 发表于 12-01 13:52 321次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TOF</b><b class='flag-5'>模块</b><b class='flag-5'>VL6180</b>与<b class='flag-5'>VL6180X</b>(2)----修改测量范围

    基于STM32CUBEMX驱动TOF模块VL6180VL6180X(3)----修改设备地址

    本章主要介绍如何修改VL6180X传感器的I2C地址,并成功驱动设备以使用新的地址。VL6180X是一种多功能、高性能的接近和环境光传感器,常用于测量物体与传感器之间的距离、检测物体的接近程度以及测量环境光强度等应用。
    的头像 发表于 12-01 14:30 256次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TOF</b><b class='flag-5'>模块</b><b class='flag-5'>VL6180</b>与<b class='flag-5'>VL6180X</b>(3)----修改设备地址

    基于STM32CUBEMX驱动TOF模块VL6180VL6180X(4)----测量环境光

    在本章中,我们将介绍如何配置VL6180X传感器以测量环境光,并获取环境光的强度值。VL6180X是一种多功能、高性能的接近和环境光传感器,其环境光测量功能可以用于检测周围环境的亮度水平。
    的头像 发表于 12-01 14:34 329次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TOF</b><b class='flag-5'>模块</b><b class='flag-5'>VL6180</b>与<b class='flag-5'>VL6180X</b>(4)----测量环境光

    多个VL6180x连接到机械臂上是否存在干扰的可能性?

    嗨, 我正在尝试使用多个VL6180X传感器并将它们连接到机械臂上。它们之间是否存在干扰的可能性?如果答案是肯定的,有什么办法可以避免吗? 谢谢 码头#多vl6180x以上来自于谷歌翻译以下为原文
    发表于 09-20 09:50

    VL6180X该设备的功耗是多少?

    亲, VL6180X的功耗是多少? 问候。 一个。#proximity-sensor#vl6180x以上来自于谷歌翻译以下为原文 Dear, What is the power
    发表于 09-25 17:21

    VL6180X包含多少个传感器?

    VL6180X包含多少个传感器? #vl6180x#vl6180x-outline-drawing #sensor以上来自于谷歌翻译以下为原文 How many sensors does
    发表于 09-25 17:14

    VL6180X操作如何测量距离

    的问题是:由于VL6180X计算距离作为发射和接收红外线之间的时间,它如何测量距离(例如约1cm),其对应于皮秒级的飞行时间? 谢谢#vl6180x以上来自于谷歌翻译以下为原文 I
    发表于 10-10 10:47

    VL6180X:什么是线性误差率?

    亲, VL6180X的线性误码率是多少? Tks和问候。 一个。 #proximity-sensor#vl6180x以上来自于谷歌翻译以下为原文 Dear, What
    发表于 10-22 16:29

    VL6180X范围偏移怎么更改

    大家好我在自定义主板上使用了一些VL6180X设备。 然后,它们的范围偏移似乎每次启动都会改变大约mm5mm,尽管我按应用说明中的指示调整了偏移。什么影响范围偏移?在正常情况下,只需一次调整就够了吗
    发表于 10-23 16:52

    VL6180X寄存器的基址是什么?

    查看VL6180X的数据手册(p49-50),列出了寄存器的“偏移”地址。这是否意味着我必须在偏移地址中添加基地址?如果是这样,请在文档中找到哪个位置?并且,是否存在具有实际寄存器地址的寄存器列表
    发表于 03-01 13:32

    VL6180X增加了范围

    嗨,我想增加VL6180X的范围,但我不知道我必须修改哪个寄存器。我看到RangingAndALS_NucleoXXX样本中的代码,但我不明白VL6180X寄存器是如何被修改的,以便增加测量范围
    发表于 04-08 16:02

    近距离测量VL6180X错误

    嘿,我正在使用VL6180X卫星传感器进行测距测量。连接后,我收到一些测量值 - 但它们是错误的。传感器不会对0mm和~50mm之间的距离变化做出反应。它不断向我显示'4 mm'的值。超过50毫米
    发表于 05-13 07:13

    请问VL6180X的基本功能有哪些?

    VL6180X的基本功能有哪些? #vl6180x #features以上来自于谷歌翻译以下为原文 What are the basic features of VL6180X ?#vl61
    发表于 06-05 09:26

    Vl6180x 官方盖玻片模型的使用

    本帖最后由 yppc 于 2019-12-31 12:09 编辑 我最近在使用Vl6180x芯片,因为应用环境,我准备增加盖玻片防尘,我在ST官网上查询到Vl6180芯片的盖玻片模型,我想咨询
    发表于 12-31 11:41

    基于STM32CUBEMX驱动TOF模块VL6180VL6180X(1)----单模块距离获取的最佳实践

    VL6180X是基于ST FlightSense™专利技术的最新产品。作为一项突破性技术,它实现了独立于目标反射率的绝对距离测量。传统的测量方法通过测量反射光的光量来估算距离,然而这种方法存在
    的头像 发表于 07-27 09:47 1297次阅读
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驱动</b><b class='flag-5'>TOF</b><b class='flag-5'>模块</b><b class='flag-5'>VL6180</b>与<b class='flag-5'>VL6180X</b>(1)----单<b class='flag-5'>模块</b>距离获取的最佳实践