Arduino 控制激光测距 4M

发布时间 2023-07-05 16:13:12作者: MKT-porter

VL53L0X飛時測距模組通常有6隻接腳,只需要接電源和I2C腳。

VL53L0X飛時測距模組

Arduino Uno板的接線示範:

安裝Arduino版的VL53L0X程式庫

選擇Arduino IDE主功能表的「草稿碼→匯入程式庫→程式庫管理員」,在「程式庫管理員」中搜尋“VL53L0X ”關鍵字,即可找到相關程式庫,常見的兩個程式庫分別是Adafruit和Polohu公司開發的版本,這兩家公司都是美國的電子零組件供應商。

程式庫管理員

本文採用Polohu的VL53L0X程式庫 ,因為Adafruit的版本佔用的快閃記憶體以及主記憶體都比較多,底下是採用Adafruit程式庫的VL53L0X測距程式,編譯之後的記憶體使用情況(Arduino Uno控制板):

  • 草稿碼使用了 16412 bytes (53%) 的程式儲存空間。
  • 全域變數使用了 1190 bytes (58%) 的動態記憶體,剩餘 858 bytes 給區域變數。

底下則是採用Polohu程式庫的測距程式的記憶體使用情況:

  • 草稿碼使用了 6564 bytes (21%) 的程式儲存空間。
  • 全域變數使用了 458 bytes (22%) 的動態記憶體,剩餘 1590 bytes 給區域變數。

VL53L0X接Arduino

 

Arduino版的測距程式

採用Polohu程式庫的基本測距程式如下,VL53L0X程式庫物件的指令說明請參閱下一節。

 

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;  // 宣告VL53L0X類型物件

void setup() {
  Serial.begin(9600);
  Wire.begin();  // 啟動I2C通訊

  sensor.setTimeout(500);  // 設定感測器超時時間
  // 若無法初始化感測器(如:硬體沒有接好),則顯示錯誤訊息。
  if (!sensor.init()) {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }
}

void loop() {
  // 在序列埠監控視窗顯示測距值
  Serial.print(sensor.readRangeSingleMillimeters());
  // 若發生超時(感測器沒有回應),則顯示“TIMEOUT”。
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.println();
}

  

VL53L0X程式庫的指令說明

下列指令說明摘譯自VL53L0X程式庫的線上說明文件,完整的指令和說明請參閱該文件。

    • setAddress(uint8_t 新位址)
      設定裝置的I2C位址。
    • uint8_t getAddress()
      取得裝置的I2C位址。
    • bool init(bool io_2v8=true)
      初始化並設置感測器,選擇性參數io_2v8預設為true,代表將感測器設成2V8模式(輸出入埠設成2.8V);若io_2v8值為false,則感測器設成1V8模式(1.8V)。傳回值是bool類型,指出初始化是否成功。
    • bool setSignalRateLimit(float limit_Mcps)
      設定傳回訊號速率上限,單位是MCPS(每秒百萬次計數)。這是為了有效解讀目標物反射訊號所需的最低速率設定。較低的設定值可增加感測範圍,但也可能因增加讀取到目標以外的物體的反射訊號,而導致准確率下滑。訊號速率限制的初始預設值為0.25 MCPS。此函式將傳回一個bool值,代表設定值是否有效。
    • float getSignalRateLimit()
      傳回目前的傳回訊號速率上限值,單位是MCPS。
    • bool setMeasurementTimingBudget(uint32_t budget_us)
      設定測量資料更新時間(單位是微秒)。這是一次測距所允許的時間;較長的資料更新時間可獲得更準確的測量。資料更新時間約為33000微秒,也就是33毫秒;最低為20毫秒。傳回值是bool類型,代表設定的資料更新時間是否有效。
    • uint32_t getMeasurementTimingBudget()
      傳回微秒(ms)單位的當前測量資料更新時間(timing budget)。
    • bool setVcselPulsePeriod(vcselPeriodType type, uint8_t period_pclks)
      將VCSEL(模組內部的雷射光發射器)脈衝週期類型(VL53L0X :: VcselPeriodPreRange或VL53L0X :: VcselPeriodFinalRange)設定成指定的週期時脈值。較長的週期時間可加長感測距離。有效值為(僅偶數):

       

      Pre:12到18(預設為14)
      Final:8到14(預設為10)

      傳回值是bool類型,指出設定的週期時間是否有效。

    • uint8_t getVcselPulsePeriod(vcselPeriodType type)
      傳回指定週期類型的當前VCSEL脈衝週期值。
    • void startContinuous(uint32_t period_ms = 0)
      開始連續測距。選擇性參數period_ms預設為0,感測器將盡可能頻繁地進行測距;如果period_ms不是0,則以給定的毫秒值設定感測器的測量間隔時間。
    • void stopContinuous()
      停止連續模式。
    • uint16_t readRangeContinuousMillimeters(void)
      連續模式啟用時,傳回公釐單位的測距值。
    • uint16_t readRangeSingleMillimeters()
      執行單次測距並傳回公釐(mm)單位值。
    • void setTimeout(uint16_t timeout)
      設置超時時間(以毫秒為單位),如果感測器未就緒,則讀取操作將在此時間後中止;設定成0將停用超時。
    • uint16_t getTimeout()
      傳回目前的超時時間設置。
    • bool timeoutOccurred()
      指出自上次呼叫timeoutOccurred()以來是否發生讀取超時。

ESP8266和ESP32控制板的VL53L0X感測器接線

WEMOS D1 mini(ESP8266控制板)的接線示範如下:

VL53L0X接ESP8266

LOLIN32(ESP32控制板)的接線示範:

VL53L0X接ESP32

 

MicroPython版的VL53L0X程式庫與測距範例程式

Radomir Dopieralski編寫了MicroPython版的VL53L0X程式庫,請下載此程式庫,將其中的vl53l0x.py檔,透過ampy put命令上傳到ESP8266或ESP32控制板。

上傳VL53L0X程式庫

用終端機連線之後,即可測試測距功能,以下的I2C接腳設定以WEMOS D1 mini(ESP8266控制板)為例:

MicroPython的VL53L0X程式