Arduino 使用 GY-530 VL53L0X 雷射測距感測器模組 範例與教學
Arduino 使用 GY-530 VL53L0X 雷射測距感測器模組 範例與教學
GY-530 感測器內建 VL53L0X 感測元件,並搭載電源管理 IC,模組可接受 2.8V 至 5V 的電源範圍。
VL53L0X 是新一代的飛行時間 (Time-of-Flight, ToF) 雷射測距模組,採用市場上最小封裝,可精確測量距離,無論目標反射率如何,都能提供準確的結果,突破傳統技術的限制。該模組可測量最遠 2 公尺的絕對距離,並在測距性能上樹立新標竿,為多種應用場景開啟新可能性。
VL53L0X 整合了先進的 SPAD 陣列(單光子雪崩二極體)以及 ST 第二代 FlightSense™ 專利技術。其內建的 940nm VCSEL(垂直腔面發射雷射)發射器完全隱形於人眼,搭配內部物理紅外線濾波器,提供更長的測距範圍、更高的環境光免疫力以及對保護玻璃光學干擾的更強韌性。
購買連結: GY-530 VL53L0X 雷射測距感測器模組
應用範圍:
- 個人電腦/筆記型電腦/平板與 IoT 的用戶檢測(節能)。
- 機器人(障礙物檢測)。
- 白色家電(自動水龍頭、皂液機的手部檢測等)。
- 一維手勢辨識。
- 雷射輔助自動對焦:提升與加速相機對焦系統性能,尤其在低光源、低對比度場景或快速移動的錄影模式下。
產品特點:
- 完全整合的小型化模組:
- 940nm 雷射 VCSEL
- VCSEL 驅動器
- 搭載先進嵌入式微控制器的測距感測器
- 封裝尺寸:4.4 x 2.4 x 1.0 mm
- 快速且準確的距離測量:
- 可測量最遠 2 公尺的絕對距離
- 測距結果不受目標反射率影響
- 在高紅外線環境光下運行
- 內建先進的光學干擾補償,簡化保護玻璃選擇
- 安全性:
- 符合最新 IEC 60825-1:2014 第三版標準的 1 級雷射設備
- 簡易整合:
- 單一回焊元件
- 無需額外光學元件
- 單一電源供應
- 提供 I2C 接口進行設備控制與數據傳輸
- 支援 Xshutdown(重置)與中斷 GPIO
- 可編程的 I2C 位址
引腳介紹
| 引腳介紹 | |
|---|---|
| 車架號 | 連接至電源正極 |
| 接地 | 連接至地線 |
| SCL | 12C SCK |
| SDA | I2C序列資料線 |
| X關閉 | 復位引腳僅在低電平下可用 |
| GPIO1 | 中斷引腳 |
工作原理

說明:
- 電容配置建議:
外部電源 AVDD 的電容應盡可能靠近模組的 AVDDVCSEL 和 AVSSVCSEL 腳位放置,以減少電源雜訊干擾。 - 備註:
- I2C 總線的上拉電阻建議:
外部上拉電阻的阻值可參考 I2C 總線規範。上拉電阻通常僅需在總線上配置一次,且應靠近主機安裝。
當 AVDD 為 2.8V 且 I2C 時鐘頻率為 400kHz 時,建議的上拉電阻阻值範圍為 1.5k 至 2k 歐姆。 - XSHUT 腳位注意事項:
- XSHUT 腳位必須始終由主機驅動,以避免漏電流的發生。
- 如果主機狀態未知,則需要配置上拉電阻。
- 使用硬體待機模式(無 I2C 通訊)時需要 XSHUT 腳位。
- XSHUT 和 GPIO1 的上拉電阻建議:
建議 XSHUT 和 GPIO1 的上拉電阻阻值為 10k 歐姆。- 注意: 若 GPIO1 未使用,應保持腳位未連接。
- I2C 總線的上拉電阻建議:

Arduino 實驗步驟
步驟 1:連接電路
依照以下指示連接電路,確保所有元件正確接線,並使用穩定的電源供應:
- 電源連接:
- 將模組的 VCC 腳位連接至 Arduino 的 5V(或 3.3V,依模組規格)。
- 將模組的 GND 腳位連接至 Arduino 的 GND。
- I2C 連接:
- 將模組的 SDA 腳位連接至 Arduino 的 A4(或標記 SDA 的腳位,取決於 Arduino 型號)。
- 將模組的 SCL 腳位連接至 Arduino 的 A5(或標記 SCL 的腳位)。
- 控制腳位連接(如果適用):
- 將 XSHUT 腳位連接至 Arduino 的數位腳位(如 D2),用於啟用或重置模組。
- 將 GPIO1 留空或連接至數位腳位,根據應用需求設定。
- 檢查連線:
確保所有連線穩固,無短路或接觸不良。
完成電路連接後,繼續進行 Arduino 程式設置與實驗操作!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 | #include <Wire.h> #define VL53L0X_REG_IDENTIFICATION_MODEL_ID 0xc0 #define VL53L0X_REG_IDENTIFICATION_REVISION_ID 0xc2 #define VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD 0x50 #define VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD 0x70 #define VL53L0X_REG_SYSRANGE_START 0x00 #define VL53L0X_REG_RESULT_INTERRUPT_STATUS 0x13 #define VL53L0X_REG_RESULT_RANGE_STATUS 0x14 #define address 0x29 byte gbuf[16]; void setup() { // put your setup code here, to run once: Wire.begin(); // join i2c bus (address optional for master) Serial.begin(9600); // start serial for output Serial.println("VLX53LOX test started."); } void loop() { Serial.println("----- START TEST ----"); test(); Serial.println("----- END TEST ----"); Serial.println(""); delay(1000); } void test() { byte val1 = read_byte_data_at(VL53L0X_REG_IDENTIFICATION_REVISION_ID); Serial.print("Revision ID: "); Serial.println(val1); val1 = read_byte_data_at(VL53L0X_REG_IDENTIFICATION_MODEL_ID); Serial.print("Device ID: "); Serial.println(val1); val1 = read_byte_data_at(VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD); Serial.print("PRE_RANGE_CONFIG_VCSEL_PERIOD="); Serial.println(val1); Serial.print(" decode: "); Serial.println(VL53L0X_decode_vcsel_period(val1)); val1 = read_byte_data_at(VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD); Serial.print("FINAL_RANGE_CONFIG_VCSEL_PERIOD="); Serial.println(val1); Serial.print(" decode: "); Serial.println(VL53L0X_decode_vcsel_period(val1)); write_byte_data_at(VL53L0X_REG_SYSRANGE_START, 0x01); byte val = 0; int cnt = 0; while (cnt < 100) { // 1 second waiting time max delay(10); val = read_byte_data_at(VL53L0X_REG_RESULT_RANGE_STATUS); if (val & 0x01) break; cnt++; } if (val & 0x01) Serial.println("ready"); else Serial.println("not ready"); read_block_data_at(0x14, 12); uint16_t acnt = makeuint16(gbuf[7], gbuf[6]); uint16_t scnt = makeuint16(gbuf[9], gbuf[8]); uint16_t dist = makeuint16(gbuf[11], gbuf[10]); byte DeviceRangeStatusInternal = ((gbuf[0] & 0x78) >> 3); Serial.print("ambient count: "); Serial.println(acnt); Serial.print("signal count: "); Serial.println(scnt); Serial.print("distance "); Serial.println(dist); Serial.print("status: "); Serial.println(DeviceRangeStatusInternal); } uint16_t bswap(byte b[]) { // Big Endian unsigned short to little endian unsigned short uint16_t val = ((b[0] << 8) & b[1]); return val; } uint16_t makeuint16(int lsb, int msb) { return ((msb & 0xFF) << 8) | (lsb & 0xFF); } void write_byte_data(byte data) { Wire.beginTransmission(address); Wire.write(data); Wire.endTransmission(); } void write_byte_data_at(byte reg, byte data) { // write data word at address and register Wire.beginTransmission(address); Wire.write(reg); Wire.write(data); Wire.endTransmission(); } void write_word_data_at(byte reg, uint16_t data) { // write data word at address and register byte b0 = (data &0xFF); byte b1 = ((data >> 8) && 0xFF); Wire.beginTransmission(address); Wire.write(reg); Wire.write(b0); Wire.write(b1); Wire.endTransmission(); } byte read_byte_data() { Wire.requestFrom(address, 1); while (Wire.available() < 1) delay(1); byte b = Wire.read(); return b; } byte read_byte_data_at(byte reg) { //write_byte_data((byte)0x00); write_byte_data(reg); Wire.requestFrom(address, 1); while (Wire.available() < 1) delay(1); byte b = Wire.read(); return b; } uint16_t read_word_data_at(byte reg) { write_byte_data(reg); Wire.requestFrom(address, 2); while (Wire.available() < 2) delay(1); gbuf[0] = Wire.read(); gbuf[1] = Wire.read(); return bswap(gbuf); } void read_block_data_at(byte reg, int sz) { int i = 0; write_byte_data(reg); Wire.requestFrom(address, sz); for (i=0; i<sz; i++) { while (Wire.available() < 1) delay(1); gbuf[i] = Wire.read(); } } uint16_t VL53L0X_decode_vcsel_period(short vcsel_period_reg) { // Converts the encoded VCSEL period register value into the real // period in PLL clocks uint16_t vcsel_period_pclks = (vcsel_period_reg + 1) << 1; return vcsel_period_pclks; } |
你會看到 Serial 回應下列訊息


發佈留言
很抱歉,必須登入網站才能發佈留言。