加入星計劃,您可以享受以下權益:

  • 創(chuàng)作內容快速變現(xiàn)
  • 行業(yè)影響力擴散
  • 作品版權保護
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入
  • 正文
    • 什么是 ToF 激光測距傳感器模塊?
    • RAK12014 典型示例:在 OLED 顯示屏上顯示測試距離
    • 總結
  • 相關推薦
  • 電子產業(yè)圖譜
申請入駐 產業(yè)圖譜

全球最小的 ToF 激光測距傳感器展現(xiàn)多種用途

2022/09/11
3308
閱讀需 9 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

激光測距在生產生活中有很多應用,例如測距、定位、避障等等。而飛行時間(ToF)測距作為激光測距技術的一種,因為其測量精準、響應快速、低功耗等特點,常被用于機器人、自動駕駛汽車、交通管理中的實時對象檢測,我們手機的面部檢測功能,也用到這種技術。

由瑞科慧聯(lián)(RAK)出品的 ToF 傳感器模塊 WisBlock RAK12014,采用 ST VL53L0X,后者是世界上最小的 ToF 測距傳感器

本文將介紹一款 ToF 激光測距傳感器模塊 WisBlock RAK12014,并利用 WisBlock 開發(fā)板演示該模塊如何工作。

什么是 ToF 激光測距傳感器模塊?

ToF 激光測距傳感器模塊是一種使用激光脈沖來測量自身與目標物體之間距離的模塊。WisBlock RAK12014 ToF 激光測距傳感器模塊基于意法半導體 ST VL53L0X 而設計。VL53L0X 采用目前市場上最小的封裝,可謂世界上最小的 ToF 測距傳感器。

WisBlock RAK12014 能提供精確的距離測量,可測量 2 米的絕對距離。其 940nm VCSEL 發(fā)射器(垂直腔面發(fā)射激光器)完全不為人眼所見,再加上內置的物理紅外濾光片,使其測距距離更長、對環(huán)境光的抗干擾性更強、對蓋片的光學串擾具有更好的穩(wěn)定性。換言之,無論目標反射率如何,該傳感器都能提供精確的距離測量。上述特點使之能勝任高精度的測距任務,適用于更多應用場景中。

RAK12014 是模塊化的硬件開發(fā)平臺 WisBlock 的一款傳感器模塊

 

RAK12014 模塊規(guī)格與特性:

RAK12014 模塊包含一個兼容 WisBlock 基板傳感器插槽的 24 引腳連接器。通過該連接器可以將 RAK12014 模塊安裝在 WisBlock 基板(如RAK5005-O)模塊上。該連接器的引腳順序以及引腳定義如下圖所示。

RAK12014 的引腳分布

注意:僅 I2C 相關引腳、XSHUT(復位)、INT、3V3_S 以及 GND 連接到了該模塊的連接器上。

RAK12014 典型示例:在 OLED 顯示屏上顯示測試距離

RAK12014 有一個很典型的應用,能夠很形象地給我們展示 ToF 激光測距傳感器模塊的特性,即“在 OLED 顯示屏上顯示出測試的距離”。

在這個例子中,將 RAK12014 連接到 RAK 5005-O 基板上,通過核心模塊 RAK4631 驅動它的測量距離功能,并將其測量到的距離信息在 OLED 顯示屏上顯示。

讓 RAK12014 實現(xiàn)“在 OLED 顯示屏上顯示出測試的距離”應用所需的產品配置

 

以下是實現(xiàn)這一應用的具體步驟:

1、安裝 OLED庫

要控制 OLED 顯示屏,需要使用到“U8g2”庫。

 

2、安裝 ToF 激光測距傳感器庫

要控制 ToF 激光測距傳感器模塊,需要使用“stm32duino_vl53l0x”庫。

注意:所有的庫安裝完成之后需要重啟 Arduino IDE,才能使安裝的庫生效。

3、導入代碼
接著將代碼導入 OLED 顯示屏和 ToF 激光測距傳感器模塊所需的庫當中,然后定義兩個名為“u8g2”和“sensor_vl53l0”的對象。

#include #include // Click to install library: http://librarymanager/All#stm32duino_vl53l0x #include // Click to install library: http://librarymanager/All#u8g2 U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); VL53L0X sensor_vl53l0x(&Wire, WB_IO2);  

4、GetDistance()函數(shù)
在 GetDistance() 中,定義一個 report 數(shù)據。當有數(shù)據的時候打印出當前讀到的數(shù)據測量值,當沒有數(shù)據時打印如下所示內容:

void GetDistance(){ int status; char report[64]; uint32_t distance; u8g2.clearBuffer(); // clear the internal memory u8g2.setFont(u8g2_font_ncenB10_tr); // choose a suitable font // Read Range. status = sensor_vl53l0x.GetDistance(&distance); if (status == VL53L0X_ERROR_NONE) { // Output data. snprintf(report, sizeof(report), "Range: %ld mm", distance); } else { snprintf(report, sizeof(report), "Nothing at all", distance); } Serial.println(report); u8g2.drawStr(15, 30, report); u8g2.sendBuffer(); }

5、setup()函數(shù)
在 setup() 中,ToF 激光測距傳感器和 OLED 顯示器都會被初始化。在串口監(jiān)視器上打印一條消息,這樣就能知道 ToF 激光測距傳感器是否成功找到了。如下所示:

void setup() {   int status;   pinMode(LED_BUILTIN, OUTPUT);   digitalWrite(LED_BUILTIN, LOW);   pinMode(WB_IO2, OUTPUT);   digitalWrite(WB_IO2, HIGH);   // Initialize Serial for debug output   Serial.begin(115200);   time_t serial_timeout = millis();   // On nRF52840 the USB serial is not available immediately   while (!Serial)   {     if ((millis() - serial_timeout) < 5000)     {       delay(100);       digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));     }     else     {       break;     }   }   u8g2.begin();   // Initialize I2C bus.   Wire.begin();   // Configure VL53L0X component.   sensor_vl53l0x.begin();   // Switch off VL53L0X component.   sensor_vl53l0x.VL53L0X_Off();   // Initialize VL53L0X component.   status = sensor_vl53l0x.InitSensor(0x52);   if(status)   {     Serial.println("Init sensor_vl53l0x failed...");   } }

6、loop()函數(shù)
在 loop() 中,代碼在 OLED 顯示屏上顯示了主屏幕,而這其實是在 GetDistance() 函數(shù)中完成的。
 

void loop() {   uint32_t distance;   int status;   GetDistance();   delay(300); }

 
7、代碼上傳

完成前面的代碼撰寫之后,選擇所使用的開發(fā)板 RAK4631,選擇正確的端口之后開始代碼上傳燒錄,然后打開 Arduino IDE 的串口監(jiān)視器。選擇 115200 的波特率,我們就可以看見 ToF 激光測距傳感器模塊的測距數(shù)據:

 
8、演示程序

完成以上操作后,一旦 ToF 激光測距傳感器上方有物體,OLED 顯示屏就會顯示當前物體與傳感器的距離;當傳感器上方沒有物體時,OLED 顯示屏則會顯示當前無物體,點擊鏈接查看視頻展示了詳細的演示過程。

總結

ToF 激光測距傳感器模塊可以應用的范圍很廣泛,它可以根據場景的不同調整距離。另外,所有來自傳感器的信息都可以直接上傳到云上,便于實時調整。本文主要向大家展示了如何使用 ToF 激光測距傳感器模塊測量物體離傳感器的距離。今后再向大家介紹該模塊在我們生活中的更多實際應用。

備注:以下是本次用例的完整代碼,僅大家參考:
 

/** @file RAK12014_Distance_Detection.ino @author rakwireless.com @brief Distance detection by laser @version 0.1 @date 2021-8-28 @copyright Copyright (c) 2020 **/ #include #include // Click to install library: http://librarymanager/All#stm32duino_vl53l0x #include // Click to install library: http://librarymanager/All#u8g2 U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0); VL53L0X sensor_vl53l0x(&Wire, WB_IO2); void GetDistance(){ int status; char report[64]; uint32_t distance; u8g2.clearBuffer(); // clear the internal memory u8g2.setFont(u8g2_font_ncenB10_tr); // choose a suitable font // Read Range. status = sensor_vl53l0x.GetDistance(&distance); if (status == VL53L0X_ERROR_NONE) { // Output data. snprintf(report, sizeof(report), "Range: %ld mm", distance); } else { snprintf(report, sizeof(report), "Nothing at all", distance); } Serial.println(report); u8g2.drawStr(15, 30, report); u8g2.sendBuffer(); } void setup() { int status; pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); pinMode(WB_IO2, OUTPUT); digitalWrite(WB_IO2, HIGH); // Initialize Serial for debug output Serial.begin(115200); time_t serial_timeout = millis(); // On nRF52840 the USB serial is not available immediately while (!Serial) { if ((millis() - serial_timeout) < 5000) { delay(100); digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); } else { break; } } u8g2.begin(); // Initialize I2C bus. Wire.begin(); // Configure VL53L0X component. sensor_vl53l0x.begin(); // Switch off VL53L0X component. sensor_vl53l0x.VL53L0X_Off(); // Initialize VL53L0X component. status = sensor_vl53l0x.InitSensor(0x52); if(status) { Serial.println("Init sensor_vl53l0x failed..."); } } void loop() { uint32_t distance; int status; GetDistance(); delay(300); }

相關推薦

電子產業(yè)圖譜

瑞科慧聯(lián)(RAK)是領先業(yè)界的物聯(lián)網應用與服務提供商,專注于低功耗廣域網絡系統(tǒng)方案,致力于為系統(tǒng)集成商、應用開發(fā)商提供產品和解決方案。