概述
在本章中,我們將探討如何同時(shí)驅(qū)動(dòng)多個(gè)VL6180傳感器進(jìn)行距離測(cè)量。我們將介紹如何有效地管理多個(gè)傳感器之間的通信和控制,以確保它們能夠同時(shí)進(jìn)行準(zhǔn)確的距離測(cè)量。此外,還將擴(kuò)展我們的教程,展示如何同時(shí)驅(qū)動(dòng)多個(gè)VL6180X傳感器進(jìn)行距離測(cè)量和光強(qiáng)測(cè)量。VL6180X傳感器在VL6180的基礎(chǔ)上增加了光強(qiáng)測(cè)量功能,這使得它們能夠提供關(guān)于環(huán)境光強(qiáng)度的有用信息。對(duì)于那些需要考慮光照條件的應(yīng)用場(chǎng)景,這將非常重要。我們將討論如何使用適當(dāng)?shù)拿詈团渲迷O(shè)置,同時(shí)利用兩個(gè)傳感器的功能,以獲取準(zhǔn)確的距離和光強(qiáng)度數(shù)據(jù)。通過本章的學(xué)習(xí),將能夠了解如何利用多個(gè)VL6180X傳感器的優(yōu)勢(shì),為應(yīng)用程序提供更全面的環(huán)境感知能力。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請(qǐng):615061293 。
樣品申請(qǐng)
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總線進(jìn)行通信。默認(rèn)情況下,每個(gè)VL6180X傳感器的7位地址為0x29。然而,為了避免地址沖突并允許多個(gè)傳感器共享相同的I2C總線,用戶可以通過向特定寄存器寫入自定義的7位地址來修改傳感器的地址。
要修改傳感器的地址,您需要訪問寄存器I2C_SLAVE__DEVICE_ADDRESS,其地址為0x212。通過向該寄存器寫入新的7位地址,您可以成功修改傳感器的地址。請(qǐng)注意,每個(gè)傳感器都需要具有唯一的地址,以確保正確的通信和識(shí)別。
需要注意的是,通過修改寄存器I2C_SLAVE__DEVICE_ADDRESS(地址為0x212)來修改VL6180X傳感器的地址是一種臨時(shí)性的設(shè)置。每次傳感器上電后,地址會(huì)恢復(fù)為初始值(默認(rèn)為0x29)。這意味著在每次上電后,需要重新設(shè)置傳感器的地址,以確保正確的通信和操作。
首先,打開VL6180.h文件,該文件包含了VL6180X傳感器的相關(guān)定義和配置。在該文件中,您可以找到定義設(shè)備地址的部分,并進(jìn)行以下方式的地址常量定義:
#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
以上示例展示了四個(gè)設(shè)備地址常量的定義,分別表示不同的傳感器??梢愿鶕?jù)您實(shí)際使用的傳感器數(shù)量和配置需求,增加或減少設(shè)備地址常量的定義。
在代碼中,可以使用這些設(shè)備地址常量來指定不同傳感器的地址。例如,如果想要使用第一個(gè)傳感器的地址,可以使用DEVICE_ADDRESS_1來表示該地址。請(qǐng)注意,需要根據(jù)實(shí)際情況將這些地址常量與傳感器的物理連接和配置相對(duì)應(yīng)。確保將正確的地址常量分配給相應(yīng)的傳感器,以確保正確的通信和操作。
在進(jìn)行地址常量定義時(shí),建議參考VL6180X傳感器的數(shù)據(jù)手冊(cè)和相關(guān)文檔,以了解更多關(guān)于傳感器地址和配置的詳細(xì)信息。
這里的地址值是根據(jù)實(shí)際需求和硬件連接情況選擇的,確保每個(gè)設(shè)備具有唯一的地址是非常重要的。通過使用定義的設(shè)備地址常量,可以輕松地管理和操作多個(gè)VL6180X傳感器。通過為每個(gè)傳感器分配唯一的設(shè)備地址常量,可以在代碼中使用這些常量來指定與每個(gè)傳感器對(duì)應(yīng)的地址。這樣,可以輕松地區(qū)分不同的傳感器,并發(fā)送適當(dāng)?shù)拿詈团渲脕砼c每個(gè)傳感器進(jìn)行通信和操作。通過使用定義的設(shè)備地址常量,可以輕松管理和操作多個(gè)傳感器,無需手動(dòng)跟蹤和設(shè)置每個(gè)傳感器的地址。這提供了方便和靈活性,特別適用于需要同時(shí)使用多個(gè)VL6180X傳感器的應(yīng)用場(chǎng)景。
配置vl6180x
在對(duì)應(yīng)的demo板子中,管腳圖如下所示。
在下面代碼中,展示了對(duì)多個(gè)VL6180X傳感器進(jìn)行初始化和配置的過程。每個(gè)傳感器通過不同的管腳連接到主板上,并通過控制GPIO引腳的電平來選擇對(duì)應(yīng)的傳感器進(jìn)行操作。
以下是對(duì)代碼的擴(kuò)展說明:
- 首先,通過控制GPIO引腳的電平,將相應(yīng)的引腳設(shè)置為RESET狀態(tài),以準(zhǔn)備初始化對(duì)應(yīng)的傳感器。具體來說,對(duì)于每個(gè)傳感器,通過控制兩個(gè)GPIO引腳,即片選,將它們?cè)O(shè)置為RESET狀態(tài)。
- 然后,通過控制GPIO引腳的電平,將相應(yīng)的引腳設(shè)置為SET狀態(tài),以選擇對(duì)應(yīng)的傳感器進(jìn)行操作。對(duì)于每個(gè)傳感器,通過控制兩個(gè)GPIO引腳,即片選,將它們?cè)O(shè)置為SET狀態(tài)。
- 在每次切換傳感器之后,添加了一段延時(shí),以確保引腳狀態(tài)的切換穩(wěn)定。這段延時(shí)的長度可以根據(jù)實(shí)際需求進(jìn)行調(diào)整。
對(duì)每個(gè)傳感器執(zhí)行以下操作:
a. 初始化傳感器,使用VL6180X_Init函數(shù),將傳感器的地址作為參數(shù)傳遞。
b. 通過VL6180X_WriteByte函數(shù),修改傳感器的地址,使用VL6180X_DEFAULT_I2C_ADDR1作為源地址,將自定義地址寫入0x0212寄存器。
c. 使用VL6180X_ReadByte函數(shù)讀取修改后的地址,并進(jìn)行打印輸出,以確認(rèn)地址修改成功。
d. 使用VL6180x_UpscaleSetScaling函數(shù)設(shè)置傳感器的縮放因子。
e. 使用VL6180X_Read_ID函數(shù)讀取傳感器的ID,并進(jìn)行打印輸出,以確認(rèn)傳感器正常工作。
通過代碼,可以初始化和配置多個(gè)VL6180X傳感器,并根據(jù)需要選擇不同的傳感器進(jìn)行操作。請(qǐng)注意,以上代碼示例僅為參考,您需要根據(jù)自己的硬件連接和需求進(jìn)行相應(yīng)的修改和調(diào)整。確保參考VL6180X傳感器的文檔和數(shù)據(jù)手冊(cè),以了解更多關(guān)于初始化、配置和操作傳感器的詳細(xì)信息。
/* 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個(gè)VL6180X傳感器的數(shù)據(jù)。以下是代碼的擴(kuò)展說明:
- 在主程序的while循環(huán)中,首先使用VL6180X_Read_Range函數(shù)從VL6180X傳感器4(設(shè)備地址為VL6180X_DEFAULT_I2C_ADDR4)讀取距離數(shù)據(jù),并將其乘以3(根據(jù)縮放因子)以得到準(zhǔn)確的距離值。然后,使用printf函數(shù)打印輸出距離值。
- 接下來,使用VL6180X_Read_Lux函數(shù)從VL6180X傳感器3(設(shè)備地址為VL6180X_DEFAULT_I2C_ADDR3)讀取光強(qiáng)度數(shù)據(jù),并使用printf函數(shù)打印輸出光強(qiáng)度值。請(qǐng)注意,此處使用了指定的增益參數(shù)(VL6180X_ALS_GAIN_40),您可以根據(jù)實(shí)際需求選擇適當(dāng)?shù)脑鲆嬷怠?/li>
- 然后,使用VL6180X_Read_Range函數(shù)從VL6180X傳感器2(設(shè)備地址為VL6180X_DEFAULT_I2C_ADDR2)讀取距離數(shù)據(jù),并將其乘以3(根據(jù)縮放因子)以得到準(zhǔn)確的距離值。然后,使用printf函數(shù)打印輸出距離值。
- 接下來,使用VL6180X_Read_Lux函數(shù)從VL6180X傳感器1(設(shè)備地址為VL6180X_DEFAULT_I2C_ADDR1)讀取光強(qiáng)度數(shù)據(jù),并使用printf函數(shù)打印輸出光強(qiáng)度值。同樣地,使用指定的增益參數(shù)(VL6180X_ALS_GAIN_40),您可以根據(jù)實(shí)際需求選擇適當(dāng)?shù)脑鲆嬷怠?/li>
- 最后,在每次循環(huán)迭代之間添加適當(dāng)?shù)难訒r(shí),例如使用HAL_Delay函數(shù)延時(shí)1秒。
請(qǐng)注意,代碼示例僅為參考,您需要根據(jù)您的實(shí)際硬件配置、VL6180X庫和應(yīng)用需求進(jìn)行相應(yīng)的修改和調(diào)整。確保參考VL6180X傳感器的文檔和數(shù)據(jù)手冊(cè),以了解更多關(guān)于數(shù)據(jù)讀取和解析的詳細(xì)信息。
/* 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 */
測(cè)試結(jié)果
測(cè)試結(jié)果如下所示。
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2551文章
51097瀏覽量
753527 -
模塊
+關(guān)注
關(guān)注
7文章
2706瀏覽量
47468 -
TOF
+關(guān)注
關(guān)注
9文章
483瀏覽量
36349 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14807
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論