VL53L0X飛時測距(ToF)感應器模組(二):Arduino與MicroPython測距程式

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

VL53L0X飛時測距模組

Arduino Uno板的接線示範:

VL53L0X接Arduino

安裝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 給區域變數。

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();
}

編譯之後上傳到Arduino控制板,再開啟序列埠監控視窗,即可看見感測距離。

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程式

from vl53l0x import VL53L0X
from machine import I2C, Pin
I2C = I2C(scl=Pin(5), sda=Pin(4), freq=100000)
vl=VL53L0X(I2C)  # 建立VL53L0X物件
vl.init()        # 初始化VL53L0X
vl.read()        # 讀取感測值
Posts created 486

4 thoughts on “VL53L0X飛時測距(ToF)感應器模組(二):Arduino與MicroPython測距程式

  1. 赵老师您好,您的micropython的VL53L0X程式库给的两个下载地址无法打开,能否可以更新一下或者麻烦您发到我的邮箱呢,万分感谢

  2. 想試著更改位址,使用setAddress(uint8_t 0x2B),卻出現’ expected primary-expression before numeric constant’,是哪裡出錯了?

    1. 語法錯誤,底下敘述是函式定義,說明「新位址」參數的型態是uint8_t。

      setAddress(uint8_t 新位址)

      程式碼要寫成:

      setAddress(0x2B)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

Related Posts

Begin typing your search term above and press enter to search. Press ESC to cancel.

Back To Top