0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于STM32CUBEMX驅(qū)動TOF模塊VL6180與VL6180X(5)----驅(qū)動多個VL6180X

嵌入式單片機MCU開發(fā) ? 來源:嵌入式單片機MCU開發(fā) ? 作者:嵌入式單片機MCU開 ? 2023-12-01 14:36 ? 次閱讀

概述

在本章中,我們將探討如何同時驅(qū)動多個VL6180傳感器進行距離測量。我們將介紹如何有效地管理多個傳感器之間的通信和控制,以確保它們能夠同時進行準(zhǔn)確的距離測量。此外,還將擴展我們的教程,展示如何同時驅(qū)動多個VL6180X傳感器進行距離測量和光強測量。VL6180X傳感器在VL6180的基礎(chǔ)上增加了光強測量功能,這使得它們能夠提供關(guān)于環(huán)境光強度的有用信息。對于那些需要考慮光照條件的應(yīng)用場景,這將非常重要。我們將討論如何使用適當(dāng)?shù)拿詈团渲迷O(shè)置,同時利用兩個傳感器的功能,以獲取準(zhǔn)確的距離和光強度數(shù)據(jù)。通過本章的學(xué)習(xí),將能夠了解如何利用多個VL6180X傳感器的優(yōu)勢,為應(yīng)用程序提供更全面的環(huán)境感知能力。
最近在弄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

修改設(shè)備地址

在修改設(shè)備地址方面,VL6180X傳感器使用I2C總線進行通信。默認情況下,每個VL6180X傳感器的7位地址為0x29。然而,為了避免地址沖突并允許多個傳感器共享相同的I2C總線,用戶可以通過向特定寄存器寫入自定義的7位地址來修改傳感器的地址。
要修改傳感器的地址,您需要訪問寄存器I2C_SLAVE__DEVICE_ADDRESS,其地址為0x212。通過向該寄存器寫入新的7位地址,您可以成功修改傳感器的地址。請注意,每個傳感器都需要具有唯一的地址,以確保正確的通信和識別。
在這里插入圖片描述

需要注意的是,通過修改寄存器I2C_SLAVE__DEVICE_ADDRESS(地址為0x212)來修改VL6180X傳感器的地址是一種臨時性的設(shè)置。每次傳感器上電后,地址會恢復(fù)為初始值(默認為0x29)。這意味著在每次上電后,需要重新設(shè)置傳感器的地址,以確保正確的通信和操作。
在這里插入圖片描述

首先,打開VL6180.h文件,該文件包含了VL6180X傳感器的相關(guān)定義和配置。在該文件中,您可以找到定義設(shè)備地址的部分,并進行以下方式的地址常量定義:

#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

以上示例展示了四個設(shè)備地址常量的定義,分別表示不同的傳感器。可以根據(jù)您實際使用的傳感器數(shù)量和配置需求,增加或減少設(shè)備地址常量的定義。
在代碼中,可以使用這些設(shè)備地址常量來指定不同傳感器的地址。例如,如果想要使用第一個傳感器的地址,可以使用DEVICE_ADDRESS_1來表示該地址。請注意,需要根據(jù)實際情況將這些地址常量與傳感器的物理連接和配置相對應(yīng)。確保將正確的地址常量分配給相應(yīng)的傳感器,以確保正確的通信和操作。
在進行地址常量定義時,建議參考VL6180X傳感器的數(shù)據(jù)手冊和相關(guān)文檔,以了解更多關(guān)于傳感器地址和配置的詳細信息。
這里的地址值是根據(jù)實際需求和硬件連接情況選擇的,確保每個設(shè)備具有唯一的地址是非常重要的。通過使用定義的設(shè)備地址常量,可以輕松地管理和操作多個VL6180X傳感器。通過為每個傳感器分配唯一的設(shè)備地址常量,可以在代碼中使用這些常量來指定與每個傳感器對應(yīng)的地址。這樣,可以輕松地區(qū)分不同的傳感器,并發(fā)送適當(dāng)?shù)拿詈团渲脕砼c每個傳感器進行通信和操作。通過使用定義的設(shè)備地址常量,可以輕松管理和操作多個傳感器,無需手動跟蹤和設(shè)置每個傳感器的地址。這提供了方便和靈活性,特別適用于需要同時使用多個VL6180X傳感器的應(yīng)用場景。

配置vl6180x

在對應(yīng)的demo板子中,管腳圖如下所示。
在這里插入圖片描述
在下面代碼中,展示了對多個VL6180X傳感器進行初始化和配置的過程。每個傳感器通過不同的管腳連接到主板上,并通過控制GPIO引腳的電平來選擇對應(yīng)的傳感器進行操作。
以下是對代碼的擴展說明:

  1. 首先,通過控制GPIO引腳的電平,將相應(yīng)的引腳設(shè)置為RESET狀態(tài),以準(zhǔn)備初始化對應(yīng)的傳感器。具體來說,對于每個傳感器,通過控制兩個GPIO引腳,即片選,將它們設(shè)置為RESET狀態(tài)。
  2. 然后,通過控制GPIO引腳的電平,將相應(yīng)的引腳設(shè)置為SET狀態(tài),以選擇對應(yīng)的傳感器進行操作。對于每個傳感器,通過控制兩個GPIO引腳,即片選,將它們設(shè)置為SET狀態(tài)。
  3. 在每次切換傳感器之后,添加了一段延時,以確保引腳狀態(tài)的切換穩(wěn)定。這段延時的長度可以根據(jù)實際需求進行調(diào)整。
    對每個傳感器執(zhí)行以下操作:
    a. 初始化傳感器,使用VL6180X_Init函數(shù),將傳感器的地址作為參數(shù)傳遞。
    b. 通過VL6180X_WriteByte函數(shù),修改傳感器的地址,使用VL6180X_DEFAULT_I2C_ADDR1作為源地址,將自定義地址寫入0x0212寄存器。
    c. 使用VL6180X_ReadByte函數(shù)讀取修改后的地址,并進行打印輸出,以確認地址修改成功。
    d. 使用VL6180x_UpscaleSetScaling函數(shù)設(shè)置傳感器的縮放因子。
    e. 使用VL6180X_Read_ID函數(shù)讀取傳感器的ID,并進行打印輸出,以確認傳感器正常工作。
    通過代碼,可以初始化和配置多個VL6180X傳感器,并根據(jù)需要選擇不同的傳感器進行操作。請注意,以上代碼示例僅為參考,您需要根據(jù)自己的硬件連接和需求進行相應(yīng)的修改和調(diào)整。確保參考VL6180X傳感器的文檔和數(shù)據(jù)手冊,以了解更多關(guān)于初始化、配置和操作傳感器的詳細信息。
/* 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 */

主程序

在代碼中,展示了如何在主程序中循環(huán)讀取4個VL6180X傳感器的數(shù)據(jù)。以下是代碼的擴展說明:

  1. 在主程序的while循環(huán)中,首先使用VL6180X_Read_Range函數(shù)從VL6180X傳感器4(設(shè)備地址為VL6180X_DEFAULT_I2C_ADDR4)讀取距離數(shù)據(jù),并將其乘以3(根據(jù)縮放因子)以得到準(zhǔn)確的距離值。然后,使用printf函數(shù)打印輸出距離值。
  2. 接下來,使用VL6180X_Read_Lux函數(shù)從VL6180X傳感器3(設(shè)備地址為VL6180X_DEFAULT_I2C_ADDR3)讀取光強度數(shù)據(jù),并使用printf函數(shù)打印輸出光強度值。請注意,此處使用了指定的增益參數(shù)(VL6180X_ALS_GAIN_40),您可以根據(jù)實際需求選擇適當(dāng)?shù)脑鲆嬷怠?/li>
  3. 然后,使用VL6180X_Read_Range函數(shù)從VL6180X傳感器2(設(shè)備地址為VL6180X_DEFAULT_I2C_ADDR2)讀取距離數(shù)據(jù),并將其乘以3(根據(jù)縮放因子)以得到準(zhǔn)確的距離值。然后,使用printf函數(shù)打印輸出距離值。
  4. 接下來,使用VL6180X_Read_Lux函數(shù)從VL6180X傳感器1(設(shè)備地址為VL6180X_DEFAULT_I2C_ADDR1)讀取光強度數(shù)據(jù),并使用printf函數(shù)打印輸出光強度值。同樣地,使用指定的增益參數(shù)(VL6180X_ALS_GAIN_40),您可以根據(jù)實際需求選擇適當(dāng)?shù)脑鲆嬷怠?/li>
  5. 最后,在每次循環(huán)迭代之間添加適當(dāng)?shù)难訒r,例如使用HAL_Delay函數(shù)延時1秒。
    請注意,代碼示例僅為參考,您需要根據(jù)您的實際硬件配置、VL6180X庫和應(yīng)用需求進行相應(yīng)的修改和調(diào)整。確保參考VL6180X傳感器的文檔和數(shù)據(jù)手冊,以了解更多關(guān)于數(shù)據(jù)讀取和解析的詳細信息。
/* 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 */

測試結(jié)果

測試結(jié)果如下所示。
在這里插入圖片描述
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2542

    文章

    50260

    瀏覽量

    750149
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2628

    瀏覽量

    47214
  • TOF
    TOF
    +關(guān)注

    關(guān)注

    9

    文章

    475

    瀏覽量

    36198
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    280

    瀏覽量

    14684
收藏 人收藏

    評論

    相關(guān)推薦

    基于STM32CUBEMX驅(qū)動TOF模塊VL6180VL6180X(2)----修改測量范圍

    當(dāng)使用VL6180傳感器進行測距時,可以通過修改縮放因子來改變可測量的距離范圍。VL6180是一種基于飛行時間原理的傳感器,通過測量光信號的往返時間來確定物體與傳感器之間的距離。
    的頭像 發(fā)表于 12-01 13:52 ?538次閱讀
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驅(qū)動</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驅(qū)動TOF模塊VL6180VL6180X(3)----修改設(shè)備地址

    本章主要介紹如何修改VL6180X傳感器的I2C地址,并成功驅(qū)動設(shè)備以使用新的地址。VL6180X是一種多功能、高性能的接近和環(huán)境光傳感器,常用于測量物體與傳感器之間的距離、檢測物體的接近程度以及測量環(huán)境光強度等應(yīng)用。
    的頭像 發(fā)表于 12-01 14:30 ?544次閱讀
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驅(qū)動</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)----修改設(shè)備地址

    基于STM32CUBEMX驅(qū)動TOF模塊VL6180VL6180X(4)----測量環(huán)境光

    在本章中,我們將介紹如何配置VL6180X傳感器以測量環(huán)境光,并獲取環(huán)境光的強度值。VL6180X是一種多功能、高性能的接近和環(huán)境光傳感器,其環(huán)境光測量功能可以用于檢測周圍環(huán)境的亮度水平。
    的頭像 發(fā)表于 12-01 14:34 ?723次閱讀
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驅(qū)動</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)----測量環(huán)境光

    多個VL6180x連接到機械臂上是否存在干擾的可能性?

    嗨, 我正在嘗試使用多個VL6180X傳感器并將它們連接到機械臂上。它們之間是否存在干擾的可能性?如果答案是肯定的,有什么辦法可以避免嗎? 謝謝 碼頭#多vl6180x以上來自于谷歌翻譯以下為原文
    發(fā)表于 09-20 09:50

    VL6180X該設(shè)備的功耗是多少?

    親, VL6180X的功耗是多少? 問候。 一個。#proximity-sensor#vl6180x以上來自于谷歌翻譯以下為原文 Dear, What is the power
    發(fā)表于 09-25 17:21

    VL6180X包含多少個傳感器?

    VL6180X包含多少個傳感器? #vl6180x#vl6180x-outline-drawing #sensor以上來自于谷歌翻譯以下為原文 How many sensors does
    發(fā)表于 09-25 17:14

    VL6180X操作如何測量距離

    的問題是:由于VL6180X計算距離作為發(fā)射和接收紅外線之間的時間,它如何測量距離(例如約1cm),其對應(yīng)于皮秒級的飛行時間? 謝謝#vl6180x以上來自于谷歌翻譯以下為原文 I
    發(fā)表于 10-10 10:47

    VL6180X:什么是線性誤差率?

    親, VL6180X的線性誤碼率是多少? Tks和問候。 一個。 #proximity-sensor#vl6180x以上來自于谷歌翻譯以下為原文 Dear, What
    發(fā)表于 10-22 16:29

    VL6180X范圍偏移怎么更改

    大家好我在自定義主板上使用了一些VL6180X設(shè)備。 然后,它們的范圍偏移似乎每次啟動都會改變大約mm5mm,盡管我按應(yīng)用說明中的指示調(diào)整了偏移。什么影響范圍偏移?在正常情況下,只需一次調(diào)整就夠了嗎
    發(fā)表于 10-23 16:52

    VL6180X寄存器的基址是什么?

    查看VL6180X的數(shù)據(jù)手冊(p49-50),列出了寄存器的“偏移”地址。這是否意味著我必須在偏移地址中添加基地址?如果是這樣,請在文檔中找到哪個位置?并且,是否存在具有實際寄存器地址的寄存器列表
    發(fā)表于 03-01 13:32

    VL6180X增加了范圍

    嗨,我想增加VL6180X的范圍,但我不知道我必須修改哪個寄存器。我看到RangingAndALS_NucleoXXX樣本中的代碼,但我不明白VL6180X寄存器是如何被修改的,以便增加測量范圍
    發(fā)表于 04-08 16:02

    請問VL6180X的基本功能有哪些?

    VL6180X的基本功能有哪些? #vl6180x #features以上來自于谷歌翻譯以下為原文 What are the basic features of VL6180X ?#vl61
    發(fā)表于 06-05 09:26

    Vl6180x 官方蓋玻片模型的使用

    本帖最后由 yppc 于 2019-12-31 12:09 編輯 我最近在使用Vl6180x芯片,因為應(yīng)用環(huán)境,我準(zhǔn)備增加蓋玻片防塵,我在ST官網(wǎng)上查詢到Vl6180芯片的蓋玻片模型,我想咨詢
    發(fā)表于 12-31 11:41

    使用VL6180X ToF傳感器與Particle Argon控制伺服器

    電子發(fā)燒友網(wǎng)站提供《使用VL6180X ToF傳感器與Particle Argon控制伺服器.zip》資料免費下載
    發(fā)表于 10-19 09:52 ?0次下載
    使用<b class='flag-5'>VL6180X</b> <b class='flag-5'>ToF</b>傳感器與Particle Argon控制伺服器

    基于STM32CUBEMX驅(qū)動TOF模塊VL6180VL6180X(1)----單模塊距離獲取的最佳實踐

    VL6180X是基于ST FlightSense?專利技術(shù)的最新產(chǎn)品。作為一項突破性技術(shù),它實現(xiàn)了獨立于目標(biāo)反射率的絕對距離測量。傳統(tǒng)的測量方法通過測量反射光的光量來估算距離,然而這種方法存在一個
    的頭像 發(fā)表于 07-27 09:47 ?1817次閱讀
    基于<b class='flag-5'>STM32CUBEMX</b><b class='flag-5'>驅(qū)動</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>距離獲取的最佳實踐