简介
VL53L3CX是意法半导体新推出的一款激光测距传感器,搭配ST的第三代FlightSense算法,在提高了检测精度的同时,测距范围覆盖了25mm到3000mm,还具有自动污迹校正,抗玻璃盖板串扰等特性。VL53L3CX借助算法和巧妙的模块构造,VL53L3CX还能够通过深度了解来检测视场内的不同对象。
注1:由于算法文件较大,目前只在M0和ESP32上验证通过
注2:多目标检测在特定条件下才能触发,具体请看意法半导体官方
注3: 测距范围25mm-3000mm是意法半导体Rev 2版本的数据手册给出,实际测距范围会因为环境而改变。测量环境请参考WIKI文末的AN5561文件
特性
- 高精度距离测量
- 最远距离可达300cm
- 典型全视角25°
- 多物体测距
- 玻璃盖板串扰的抗扰性
- 污痕补偿功能
应用场景
- 精准距离测量
- 机器人障碍物检测
- 无人机避障/停靠
- 距离触发开关
技术规格
- 供电电压:3.3V~5V
- 工作电流:<20mA
- 测量距离:25-3000mm
- 发射器:940 nm不可见激光(VCSEL)
- 视角范围:25°
- I2C地址:0x29
- 工作温度范围:-20℃~85℃
- 产品尺寸:18*15mm
测量精度
引脚说明
序号 | 丝印 | 功能描述 |
---|---|---|
1 | + | 电源正极 |
2 | - | 电源负极 |
3 | SCL | I2C时钟线 |
4 | SDA | I2C数据线 |
5 | XSHUT | 复位 |
6 | GPIO1 | 中断 |
使用教程
准备
- 硬件
- 1 x Arduino UNO控制板
- 1 x VL53L3CX激光测距传感器
- 若干 杜邦线
- 软件
- Arduino IDE, 点击下载Arduino IDE
- VL53L3CX库文件和示例程序
关于如何安装库文件,点击链接
如果使用ESP32驱动VL53L3CX,需要更改I2C Buffer大小。FireBeetle ESP32更改方法:
1.进入文件目录
%USERPROFILE%\AppData\Local\Arduino15\packages\DFRobot\hardware\esp32\0.2.1\libraries\Wire\src
2.打开Wire.h文件
3.将I2C_BUFFER_LENGTH 宏的值改为256
- 主要API接口函数列表
/**********Status**********/
#define VL53LX_RANGESTATUS_RANGE_VALID 0
/*!<测量正常有效*/
#define VL53LX_RANGESTATUS_SIGMA_FAIL 1
/*!<Sigma故障. */
#define VL53LX_RANGESTATUS_SIGNAL_FAIL 2
/*!<信号故障 */
#define VL53LX_RANGESTATUS_RANGE_VALID_MIN_RANGE_CLIPPED 3
/*!<目标小于最低检测域值 */
#define VL53LX_RANGESTATUS_OUTOFBOUNDS_FAIL 4
/*!<超出有效范围-不同于换行退出 */
#define VL53LX_RANGESTATUS_HARDWARE_FAIL 5
/*!<硬件故障*/
#define VL53LX_RANGESTATUS_RANGE_VALID_NO_WRAP_CHECK_FAIL 6
/*!<范围有效,但未执行环绕检查(wraparound check) */
#define VL53LX_RANGESTATUS_WRAP_TARGET_FAIL 7
/*!<目标被环绕- 其他VCSEL周期定时中无匹配相位 */
#define VL53LX_RANGESTATUS_PROCESSING_FAIL 8
/*!<lite测距中的内部algo下溢或溢出 */
#define VL53LX_RANGESTATUS_XTALK_SIGNAL_FAIL 9
/*!<特定于lite测距 */
#define VL53LX_RANGESTATUS_SYNCRONISATION_INT 10
/*!<返回back模式下开始测距时第一个中断, 忽略数据 */
#define VL53LX_RANGESTATUS_RANGE_VALID_MERGED_PULSE 11
/*!<测距正常,但获得的是多个脉冲合在一起的结果
* RQL用于合并脉冲检测
*/
#define VL53LX_RANGESTATUS_TARGET_PRESENT_LACK_OF_SIGNAL 12
/*!<用于RQL 与相位故障不同 */
#define VL53LX_RANGESTATUS_MIN_RANGE_FAIL 13
/*!<SPAD数组中出现意外错误 */
#define VL53LX_RANGESTATUS_RANGE_INVALID 14
/*!<lld 返回范围有效,但值为负数 ! */
#define VL53LX_RANGESTATUS_NONE 255
/**********Count**********/
uint8_t StreamCount;
/*!<8位计数器. */
/*#Objs*/
uint8_t NumberOfObjectsFound;
/*!< Indicate the number of objects found.
* This is used to know how many ranging data should be get.
* NumberOfObjectsFound is in the range 0 to
* VL53LX_MAX_RANGE_RESULTS.
*/
/**********D**********/
int16_t RangeMinMilliMeter;
/*!< Tells what is the minimum detection distance of the object
* in current setup and environment conditions (Filled when
* applicable)
*/
/**********Signal**********/
FixPoint1616_t SignalRateRtnMegaCps;
/*!< Return signal rate (MCPS)\n these is a 16.16 fix point
* value, which is effectively a measure of target
* reflectance.
*/
/**********Ambient**********/
FixPoint1616_t AmbientRateRtnMegaCps;
/*!< Return ambient rate (MCPS)\n these is a 16.16 fix point
* value, which is effectively a measure of the ambien
* t light.
*/
接线图
样例代码1 - 读取数据
读读取当前传感器的数据
/**
******************************************************************************
* @file VL53L3CX_Sat_HelloWorld.ino
* @author SRA
* @version V1.0.0
* @date 30 July 2020
* @brief Arduino test application for the STMicrolectronics VL53L3CX
* proximity sensor satellite based on FlightSense.
* This application makes use of C++ classes obtained from the C
* components' drivers.
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT(c) 2020 STMicroelectronics</center></h2>
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/*
* To use this sketch you need to connect the VL53L3CX satellite sensor directly to the Nucleo board with wires in this way:
* pin 1 (Interrupt) of the VL53L3CX satellite connected to pin A2 of the Nucleo board
* pin 2 (SCL_I) of the VL53L3CX satellite connected to pin D15 (SCL) of the Nucleo board with a Pull-Up resistor of 4.7 KOhm
* pin 3 (XSDN_I) of the VL53L3CX satellite connected to pin A1 of the Nucleo board
* pin 4 (SDA_I) of the VL53L3CX satellite connected to pin D14 (SDA) of the Nucleo board with a Pull-Up resistor of 4.7 KOhm
* pin 5 (VDD) of the VL53L3CX satellite connected to 3V3 pin of the Nucleo board
* pin 6 (GND) of the VL53L3CX satellite connected to GND of the Nucleo board
* pins 7, 8, 9 and 10 are not connected.
*/
/* Includes ------------------------------------------------------------------*/
#include <Arduino.h>
#include <Wire.h>
#include <vl53lx_class.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include <stdlib.h>
#define DEV_I2C Wire
#define SerialPort Serial
#ifndef LED_BUILTIN
#define LED_BUILTIN 13
#endif
#define LedPin LED_BUILTIN
// Components.
VL53LX sensor_vl53lx_sat(&DEV_I2C, A1);
/* Setup ---------------------------------------------------------------------*/
void setup()
{
// Led.
pinMode(LedPin, OUTPUT);
// Initialize serial for output.
SerialPort.begin(115200);
SerialPort.println("Starting...");
// Initialize I2C bus.
DEV_I2C.begin();
// Configure VL53LX satellite component.
sensor_vl53lx_sat.begin();
// Switch off VL53LX satellite component.
sensor_vl53lx_sat.VL53LX_Off();
//Initialize VL53LX satellite component.
sensor_vl53lx_sat.InitSensor(0x12);
// Start Measurements
sensor_vl53lx_sat.VL53LX_StartMeasurement();
}
void loop()
{
VL53LX_MultiRangingData_t MultiRangingData;
VL53LX_MultiRangingData_t *pMultiRangingData = &MultiRangingData;
uint8_t NewDataReady = 0;
int no_of_object_found = 0, j;
char report[64];
int status;
do
{
status = sensor_vl53lx_sat.VL53LX_GetMeasurementDataReady(&NewDataReady);
} while (!NewDataReady);
//Led on
digitalWrite(LedPin, HIGH);
if((!status)&&(NewDataReady!=0))
{
status = sensor_vl53lx_sat.VL53LX_GetMultiRangingData(pMultiRangingData);
no_of_object_found=pMultiRangingData->NumberOfObjectsFound;
snprintf(report, sizeof(report), "VL53LX Satellite: Count=%d, #Objs=%1d ", pMultiRangingData->StreamCount, no_of_object_found);
SerialPort.print(report);
for(j=0;j<no_of_object_found;j++)
{
if(j!=0)SerialPort.print("\r\n ");
SerialPort.print("status=");
SerialPort.print(pMultiRangingData->RangeData[j].RangeStatus);
SerialPort.print(", D=");
SerialPort.print(pMultiRangingData->RangeData[j].RangeMilliMeter);
SerialPort.print("mm");
SerialPort.print(", Signal=");
SerialPort.print((float)pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65536.0);
SerialPort.print(" Mcps, Ambient=");
SerialPort.print((float)pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65536.0);
SerialPort.print(" Mcps");
}
SerialPort.println("");
if (status==0)
{
status = sensor_vl53lx_sat.VL53LX_ClearInterruptAndStartMeasurement();
}
}
digitalWrite(LedPin, LOW);
}
结果
样例代码2 - 中断
传感器中断输出
/**
******************************************************************************
* @file VL53L3CX_Sat_HelloWorld_Interrupt.ino
* @author SRA
* @version V1.0.0
* @date 30 July 2020
* @brief Arduino test application for the STMicrolectronics VL53L3CX
* proximity sensor satellite based on FlightSense.
* This application makes use of C++ classes obtained from the C
* components' drivers.
******************************************************************************
* @attention
*
* <h2><center>© COPYRIGHT(c) 2020 STMicroelectronics</center></h2>
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
//On some boards like the Arduino Uno the pin used by the sensor to raise interrupts (A2)
//can't be mapped as an interrupt pin. For this this reason this sketch will not work
//unless some additional cabling is done and the interrupt pin is changed.
/*
* To use this sketch you need to connect the VL53L3CX satellite sensor directly to the Nucleo board with wires in this way:
* pin 1 (Interrupt) of the VL53L3CX satellite connected to pin A2 of the Nucleo board
* pin 2 (SCL_I) of the VL53L3CX satellite connected to pin D15 (SCL) of the Nucleo board with a Pull-Up resistor of 4.7 KOhm
* pin 3 (XSDN_I) of the VL53L3CX satellite connected to pin A1 of the Nucleo board
* pin 4 (SDA_I) of the VL53L3CX satellite connected to pin D14 (SDA) of the Nucleo board with a Pull-Up resistor of 4.7 KOhm
* pin 5 (VDD) of the VL53L3CX satellite connected to 3V3 pin of the Nucleo board
* pin 6 (GND) of the VL53L3CX satellite connected to GND of the Nucleo board
* pins 7, 8, 9 and 10 are not connected.
*/
/* Includes ------------------------------------------------------------------*/
#include <Arduino.h>
#include <Wire.h>
#include <vl53lx_class.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include <stdlib.h>
#define DEV_I2C Wire
#define SerialPort Serial
#ifndef LED_BUILTIN
#define LED_BUILTIN 13
#endif
#define LedPin LED_BUILTIN
#define interruptPin A2
// Components.
VL53LX sensor_vl53lx_sat(&DEV_I2C, A1);
volatile int interruptCount=0;
void measure()
{
interruptCount=1;
}
void setup()
{
VL53LX_Error status;
// Led.
pinMode(LedPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(interruptPin, measure, FALLING);
// Initialize serial for output.
SerialPort.begin(115200);
SerialPort.println("Starting...");
// Initialize I2C bus.
DEV_I2C.begin();
// Configure VL53LX satellite component.
sensor_vl53lx_sat.begin();
// Switch off VL53LX satellite component.
sensor_vl53lx_sat.VL53LX_Off();
// Initialize VL53LX satellite component.
status = sensor_vl53lx_sat.InitSensor(0x12);
if(status)
{
SerialPort.println("Init sensor_vl53lx_sat failed...");
}
sensor_vl53lx_sat.VL53LX_StartMeasurement();
}
void loop()
{
VL53LX_MultiRangingData_t MultiRangingData;
VL53LX_MultiRangingData_t *pMultiRangingData = &MultiRangingData;
uint8_t NewDataReady = 0;
int no_of_object_found = 0, j;
char report[64];
if (interruptCount)
{
int status;
interruptCount=0;
// Led blinking.
digitalWrite(LedPin, HIGH);
status = sensor_vl53lx_sat.VL53LX_GetMeasurementDataReady(&NewDataReady);
if((!status)&&(NewDataReady!=0))
{
status = sensor_vl53lx_sat.VL53LX_GetMultiRangingData(pMultiRangingData);
no_of_object_found=pMultiRangingData->NumberOfObjectsFound;
snprintf(report, sizeof(report), "Count=%d, #Objs=%1d ", pMultiRangingData->StreamCount, no_of_object_found);
SerialPort.print(report);
for(j=0;j<no_of_object_found;j++)
{
if(j!=0)SerialPort.print("\r\n ");
SerialPort.print("status=");
SerialPort.print(pMultiRangingData->RangeData[j].RangeStatus);
SerialPort.print(", D=");
SerialPort.print(pMultiRangingData->RangeData[j].RangeMilliMeter);
SerialPort.print("mm");
SerialPort.print(", Signal=");
SerialPort.print((float)pMultiRangingData->RangeData[j].SignalRateRtnMegaCps/65536.0);
SerialPort.print(" Mcps, Ambient=");
SerialPort.print((float)pMultiRangingData->RangeData[j].AmbientRateRtnMegaCps/65536.0);
SerialPort.print(" Mcps");
}
SerialPort.println("");
if (status==0)
{
status = sensor_vl53lx_sat.VL53LX_ClearInterruptAndStartMeasurement();
}
}
digitalWrite(LedPin, LOW);
}
}
结果
常见问题
还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。