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

news2025/1/11 9:52:50

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

  • 概述
  • 样品申请
  • 修改设备地址
  • 配置vl6180x
  • 主程序
  • 测试结果

概述

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

样品申请

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

修改设备地址

在修改设备地址方面,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%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传感器的数据。以下是代码的扩展说明:

  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=%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 */

测试结果

测试结果如下所示。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/751851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

❤️创意网页:创造精彩的登录体验-3D翻转登录页面

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

(9)基础强化:元字符,正则表达式,匹配,提取组,Regex,Match与Matches

一、作业 1、问&#xff1a;下面解压程序出错&#xff0c;什么原因&#xff1f; string src "E:\1.txt";string des "E:\2.txt";using (FileStream read File.OpenRead(src)){using (GZipStream gzip new GZipStream(read, CompressionMode.Decompress…

FPGA——按键控制led灯

文章目录 一、实验环境二、实验任务三、系统设计四、实验过程4.1 编写verilog代码4.2 引脚配置 五、仿真5.1 仿真代码5.2 仿真结果 六、实验结果七、总结 一、实验环境 quartus 18.1 modelsim vscode Cyclone IV开发板 二、实验任务 使用开发板上的四个按键控制四个LED灯。按…

“反AI斗士”马斯克进军AI,你怎么看?

“反AI斗士”马斯克进军AI&#xff0c;你怎么看&#xff1f; 当地时间7月12日&#xff0c;马斯克在Twitter上宣布&#xff1a;“xAI正式成立&#xff0c;去了解现实。”马斯克表示&#xff0c;推出xAI的原因是想要“了解宇宙的真实本质”。公司由马斯克本人亲自带队&#xff0c…

软件外包开发的原型图工具

在软件开发中需要用到原型图工具来将需求转化为图形界面&#xff0c;这样可以更好更准确的表达需求的实现方式。与传统的需求文档相比&#xff0c;原型图的表达更直接&#xff0c;不但可以画出UI&#xff0c;也支持UI之间的跳转连接&#xff0c;与最终的实现效果基本是一样的。…

【雕爷学编程】Arduino动手做(149)---MAX9814咪头传感器模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

如何在Windows 8和10中检查最后一次的启动模式

Windows 8、Windows 8.1 和 Windows 10 中的用户可以在 PC 上执行混合关机(快速启动)、完全关机或休眠。 快速启动(又名:hiberboot、混合启动或混合关机)在 Windows 中默认打开,是一种帮助你的电脑在关机后更快启动的设置。甚至比休眠还要快。 休眠是一种主要为笔记本电…

Linux下Nginx升级

nginx版本升级不会覆盖配置文件&#xff0c;但以防万一升级前请先备份配置文件或者配置文件夹 默认配置文件地址&#xff1a;/usr/local/nginx/conf/nginx.conf 1.下载 wget -c http://nginx.org/download/nginx-1.24.0.tar.gz 2.解压 tar -xvf nginx-1.24.0.tar.gz 3.nginx…

【图像处理】使用 Python 进行图像增强

一、说明 图像增强技术的深度和复杂性往往在一系列捕获和共享中被忽视。从傅里叶变换到白平衡和直方图处理&#xff0c;各种方法都可以将普通照片转换为引人注目的图像。这篇博文旨在解开这些技术。 我在节日期间拍了一张照片&#xff0c;在夜间庆祝活动中。遗憾的是&#xff0…

OpenCV中掩膜(Mask)、setTo()、copyTo()、clone()、inRange()的定义与使用

文章目录 1、掩膜(Mask)是什么&#xff08;1&#xff09;从物理的角度来看&#xff1a;&#xff08;2&#xff09;图像处理中的掩膜Mask&#xff08;3&#xff09;掩膜的用法&#xff1a;&#xff08;4&#xff09;掩膜Mask 的运算&#xff1a; 2、setTo()函数&#xff1a;将图…

【动手学习深度学习--逐行代码解析合集】17使用块的网络(VGG)

【动手学习深度学习】逐行代码解析合集 17使用块的网络&#xff08;VGG&#xff09; 视频链接&#xff1a;动手学习深度学习–使用块的网络&#xff08;VGG&#xff09; 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、VGG网络…

【UniApp开发小程序】顶部导航栏和底部导航栏设置+iconfont图标引入

文章目录 顶部导航栏和底部导航栏设置创建几个需要底部导航栏切换的页面使用阿里巴巴矢量图标库完成底部导航栏tabBar设置页面顶部导航栏标题 样式优化 顶部导航栏和底部导航栏设置 在正式开发小程序的功能之前&#xff0c;首先需要确定小程序的主要框架。 创建几个需要底部导…

组件的创建,引用,样式隔离以及methods,data,properties和数据事件监听

组件的创建&#xff0c;引用&#xff0c;样式隔离以及methods,data,properties和数据事件监听 1. 组件的创建2. 组件的引用2.1. 局部引用2.2. 全局引用2.3. 组件和页面的区别 3. 组件的样式隔离3.1. 默认情况&#xff0c;组件样式隔离性3.2. 修改组件的样式隔离选项 4. 组件的d…

短视频抖音seo矩阵系统源码开发者思路(一)

一套优秀的短视频获客系统&#xff0c;支持短视频智能剪辑、短视频定时发布&#xff0c;短视频排名查询及优化&#xff0c;短视频智能客服等&#xff0c;那么短视频seo系统具体开发应该具备哪些功能呢&#xff1f;今天小编就跟大家分享一下我们的技术开发思路。 抖音矩阵系统源…

go-zero微服务实战——etcd服务注册与发现

etcd简介 浅谈etcd服务注册与发现 etcd官网 etcd中文文档 apt安装etcd&#xff0c;启动命令十分简单etcd。 etcd分为v2版本和v3版本&#xff0c;命令有所不一样&#xff0c;使用命令etcdctl h查看 如上图所示并没有出现API的版本&#xff0c;此时是使用默认的v2版本&#x…

android editText获取不到数据

问题分析&#xff1a;在onActivityCreated一开始就创建了findViewById&#xff0c;这时获取的是默认值&#xff0c;需要在点击按钮时重新加载才能获取到输入数据。 需要在点击按钮时重新加载数据&#xff1a;

Android Studio中java编程时禁止生成警告

1、打开Android Studio&#xff0c;进入主界面 2、进入软件后&#xff0c;点击菜单栏的File 3、在File选项中选择Settings 4、进入Settings选择Version Control -> Subversion -> Presentation 5、去掉勾选 Show merge source in history and anotations 6、最后点击确定…

在vite创建的vue3项目中使用Cesium加载czml路径信息和无人机模型

在vite创建的vue3项目中使用Cesium加载czml路径信息和无人机模型 用到的区域文件、地图标记文件、路径信息文件、模型文件 提取码&#xff1a;99jq 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium…

一文详解常见标准化组织

从事软件研发工作多年&#xff0c;在工作中有时会查阅一些通信相关的国际标准。然而&#xff0c;对于制定这些标准的组织&#xff0c;一直缺乏一个系统的了解。本文将对几个常见的标准化组织进行介绍&#xff0c;其中包括ITU、3GPP、GSMA和CCSA&#xff0c;了解它们的背景、成立…

零基础学习C#编程的步骤和建议

如果你是零基础&#xff0c;希望学习C#编程语言&#xff0c;以下是一些建议的学习步骤&#xff1a; 基础概念和语法&#xff1a;开始学习C#之前&#xff0c;了解基本的编程概念和语法是很重要的。可以通过在线教程、编程书籍或视频教程来学习C#的基础知识&#xff0c;包括变量…