激光測距在生產生活中有很多應用,例如測距、定位、避障等等。而飛行時間(ToF)測距作為激光測距技術的一種,因為其測量精準、響應快速、低功耗等特點,常被用于機器人、自動駕駛汽車、交通管理中的實時對象檢測,我們手機的面部檢測功能,也用到這種技術。
本文將介紹一款 ToF 激光測距傳感器模塊 WisBlock RAK12014,并利用 WisBlock開發板演示該模塊如何工作。
什么是 ToF激光測距傳感器模塊?
ToF 激光測距傳感器模塊是一種使用激光脈沖來測量自身與目標物體之間距離的模塊。WisBlock RAK12014 ToF 激光測距傳感器模塊基于意法半導體 ST VL53L0X而設計。VL53L0X采用目前市場上最小的封裝,可謂世界上最小的 ToF 測距傳感器。
WisBlock RAK12014 能提供精確的距離測量,可測量 2米的絕對距離。其 940nm VCSEL發射器(垂直腔面發射激光器)完全不為人眼所見,再加上內置的物理紅外濾光片,使其測距距離更長、對環境光的抗干擾性更強、對蓋片的光學串擾具有更好的穩定性。換言之,無論目標反射率如何,該傳感器都能提供精確的距離測量。上述特點使之能勝任高精度的測距任務,適用于更多應用場景中。
RAK12014 是模塊化的硬件開發平臺 WisBlock 的一款傳感器模塊RAK12014模塊規格與特性:
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 實現“在 OLED 顯示屏上顯示出測試的距離”應用所需的產品配置- RAK12014
- RAK4631
- RAK5005-O
- RAK1921 OLED顯示屏
- 跳線
- 電源線
以下是實現這一應用的具體步驟:
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()函數
在 GetDistance() 中,定義一個 report數據。當有數據的時候打印出當前讀到的數據測量值,當沒有數據時打印如下所示內容:
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()函數
在 setup()中,ToF 激光測距傳感器和 OLED顯示器都會被初始化。在串口監視器上打印一條消息,這樣就能知道 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()函數
在 loop() 中,代碼在 OLED顯示屏上顯示了主屏幕,而這其實是在 GetDistance() 函數中完成的。
void loop() { uint32_t distance; int status; GetDistance(); delay(300); }
7、代碼上傳
完成前面的代碼撰寫之后,選擇所使用的開發板 RAK4631,選擇正確的端口之后開始代碼上傳燒錄,然后打開 Arduino IDE的串口監視器。選擇 115200的波特率,我們就可以看見ToF 激光測距傳感器模塊的測距數據:
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); }
-
傳感器
+關注
關注
2548文章
50691瀏覽量
752033 -
TOF
+關注
關注
9文章
478瀏覽量
36271 -
RAK
+關注
關注
0文章
48瀏覽量
2066
發布評論請先 登錄
相關推薦
評論