VL53L0X飛時測距模組通常有6隻接腳,只需要接電源和I2C腳。
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 給區域變數。
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控制板)的接線示範如下:
LOLIN32(ESP32控制板)的接線示範:
MicroPython版的VL53L0X程式庫與測距範例程式
Radomir Dopieralski編寫了MicroPython版的VL53L0X程式庫,請下載此程式庫,將其中的vl53l0x.py檔,透過ampy put命令上傳到ESP8266或ESP32控制板。
用終端機連線之後,即可測試測距功能,以下的I2C接腳設定以WEMOS D1 mini(ESP8266控制板)為例:
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() # 讀取感測值
赵老师您好,您的micropython的VL53L0X程式库给的两个下载地址无法打开,能否可以更新一下或者麻烦您发到我的邮箱呢,万分感谢
请下载这个试试,这是另一个驱动,
thanks,
jeffrey
想試著更改位址,使用setAddress(uint8_t 0x2B),卻出現’ expected primary-expression before numeric constant’,是哪裡出錯了?
語法錯誤,底下敘述是函式定義,說明「新位址」參數的型態是uint8_t。
setAddress(uint8_t 新位址)
程式碼要寫成:
setAddress(0x2B)