(SKU:SEN0302)VL53L1X TOF Laser-ranging sensor

来自DFRobot Product Wiki
跳转至: 导航搜索
Gravity: VL53L0X ToF 激光测距传感器

目录

简介

VL53L1X激光测距传感器是一款基于时间飞行原理(TOF)设计的高精度测距传感器。与传统的技术不同,VL53L1X无论目标反射率如何,都能提供精确的距离测量,最高测量距离4米。
DF基于VL53L1X设计的传感器模块,采用Gravity-I2C接口,即插即用,支持3.3V~5V供电使用,兼容更多的主板,适应更多的应用场景。
相比同类型的VL53L0x测距模块,其测距距离更大,精度更高,达±0.5%,响应时间更快,大于或等于20ms。
VL53L1X的940nm垂直腔面发射激光器对人眼来说是完全不可见的,加上内部物理红外滤波器,可以实现更远的测距,更强的抗环境光的能力,以及更好的覆盖玻璃光学截面。

技术规格

  • 工作电压:3.3V-5V DC
  • 激光波长:940nm
  • 量程范围:10-4000mm
  • 测距角度:25°
  • 测距精度:±1%
  • 测距时间:≥20ms
  • I2C地址:0x52
  • 工作温度:-20-70 ℃
  • 接口类型:标准Gravity接口
  • 产品尺寸:20*22 mm


引脚说明

引脚图
引脚描述
标号 名称 功能描述
1 绿线 D IIC数据线DATA
2 蓝线 C IIC时钟线CLK
3 黑线 - 电源负极GND
4 红线 + 电源正极VCC
  • GPIO1:传感器中断输出引脚,用来指示数据是否准备好
  • XSHUT:传感器关闭引脚,默认被拉高,当引脚被拉低时传感器进入关闭模式


使用教程

Arduino

准备

硬件

  • Arduino UNO控制板 x1
  • VL53L1X TOF Laser-ranging Sensor模块

软件


连接图

SEN0302连接图

样例代码


  • 校准传感器

  校准之前需要在传感器前方208(距离可调)mm处放置一个目标物体。

/*!
   file getDistance.ino
   SEN0302 Distance Ranging Sensor
   The module is connected with Arduino Uno to read the distance
   This demo can be used to calibrate the sensor(both of offset and cross talk)
   This demo output the distance between sensor and target
   Copyright    [DFRobot](http://www.dfrobot.com), 2016
   Copyright    GNU Lesser General Public License
   version  V0.1
   date  2019-4-22
*/

#include "Arduino.h"
#include "Wire.h"
#include "DFRobot_VL53L1X.h" 

DFRobot_VL53L1X sensor(&Wire);
uint16_t actDistance;

void setup(void)
{
  Wire.begin();

  Serial.begin(9600);

  while (sensor.begin() != true){
    Serial.println("Sensor init failed!");
    delay(1000);
  }
  
  actDistance = 208;
  Serial.print("ActDistance(mm): ");
  Serial.println(actDistance);
  
  //sensor.setOffset(20);             //校准偏移值,参数 = 实际距离 - 测量距离,'''0''' 表示清除偏移校准值
  sensor.calibrateOffset(actDistance); //校准偏移值,参数为目标到传感器的距离,若不想校准,可屏蔽
  Serial.print("Offset(mm): ");
  Serial.println(sensor.getOffset());
  
  //sensor.setXTalk(0);              //清除校准参数:窜扰
  sensor.calibrateXTalk(actDistance);       //校准串扰值,参数为目标到传感器的距离,若不想校准可,可屏蔽(一般不用)
  Serial.print("XTalk(cps): ");
  Serial.println(sensor.getXTalk());
  Serial.println();
}

void loop(void)
{
  sensor.startRanging();
  int distance = sensor.getDistance();
  sensor.stopRanging();

  Serial.print("Distance(mm): ");
  Serial.println(distance);

  Serial.println();
  delay(1000);
}

程序功能:校准传感器,并打印校准后的测距结果,单位mm.

  • 校准前,传感器测距效果如下图所示:
校准前
  • 校准后,传感器测距效果如下图所示:
校准后
Warning yellow.png

注:当Offset和XTalk的值均为0时,代表传感器没有被校准,可以用sensor.setXTalk(0)和sensor.setOffset(0)清除校准值

Warning yellow.png

注:使用sensor.setOffset()校准距离偏移值时,需要先清除校准值


  • 设置测距时间和测量间隔

  时间预算及传感器开始测距到数据准备完成的时间,而测量间隔及第一次测距开始到第二次测距开始所用的时间,
测量间隔大于或等于时间预算。

/*!
   file setRangeCycle.ino
   SEN0302 Distance Ranging Sensor
   The module is connected with Arduino Uno to read the distance
   This demo can set timing budget and inter measurement
   This demo output the distance between sensor and obstacles at the inter measurement that you set
   Copyright    [DFRobot](http://www.dfrobot.com), 2016
   Copyright    GNU Lesser General Public License
   version  V0.1
   date  2019-4-18
*/
#include "Arduino.h"
#include "Wire.h"
#include "DFRobot_VL53L1X.h"

DFRobot_VL53L1X sensor(&Wire);

void setup(void)
{
  Wire.begin();

  Serial.begin(9600);

  while (sensor.begin() != true){
    Serial.println("Sensor init failed!");
    delay(1000);
  }
  /*Set Distance Mode:
                 setDistanceModeShort  ranging up to 2.2m
                 setDistanceModeLong   ranging up to 4m
 */
  sensor.setDistanceModeShort();
  //sensor.setDistanceModeLong();
  /*The timing budget (TB) is the time the sensor needed to complete one distance measurement*/
  /*TimingBudgetInMs = eBudget_20ms  = 20ms
                       eBudget_33ms  = 33ms
                       eBudget_50ms  = 50ms
                       eBudget_100ms = 100ms
                       eBudget_200ms = 200ms
                       eBudget_500ms = 500ms
   */
  sensor.setTimingBudgetInMs(eBudget_20ms);
  Serial.print("TimingBudget(ms) :");
  Serial.println(sensor.getTimingBudgetInMs());
  /* The intermeasurement period  must be greater than or equal to the timing budget*/
  sensor.setInterMeasurementInMs(300);
  Serial.print("InterMeasurement(ms): ");
  Serial.println(sensor.getInterMeasurementInMs());
  Serial.println();
  
  sensor.startRanging();
}

void loop(void)
{
  while(sensor.checkForDataReady() == true){
    int distance;
    distance = sensor.getDistance();
    Serial.print("Distance(mm): ");
    Serial.println(distance);
    Serial.println();
    delay(50);
  }
}

程序功能:将传感器设置为短距模式(最大能测2.2m),设置并获取打印传感器的测距时间、测量间隔以及距离数据,如下图所示:

打印测量时间,测量间隔,及距离值


  • 设置测距范围

当检测到范围内的距离,传感器的GPIO1引脚会产生一个中断信号

#include "Arduino.h"
#include "Wire.h"
#include "DFRobot_VL53L1X.h"

bool flag = false;// 定义中断标志位,并初始化
DFRobot_VL53L1X sensor(&Wire);

void setup() {
  // put your setup code here, to run once:
    Wire.begin();
    Serial.begin(9600);
    
    /* 传感器初始化 */
    while (sensor.begin() != true){
    Serial.println("Sensor init failed!");
    delay(1000);
    }
    sensor.setDistanceThreshold(100, 200, eVL53L1X_In);//设置测距范围,eVL53L1X_In代表检测在100~200mm范围内的物体,传感器的GPIO1会产生一个中断信号
    //sensor.setDistanceThreshold(100, 200,  eVL53L1X_Above);//检测到大于100mm范围内的距离,GPIO1中断
    //sensor.setDistanceThreshold(100, 200, eVL53L1X_Out);//检测到【100,200】范围外的距离,GPIO1中断
    //sensor.setDistanceThreshold(100, 200, eVL53L1X_Below);//检测到小于100mm范围内的距离,GPIO1中断
   
    Serial.print("测距最低范围(mm):");
    Serial.println(sensor.getDistanceThresholdLow());
    Serial.print("测距最高范围(mm):");
    Serial.println(sensor.getDistanceThresholdHigh());
   
    //0 = eVL53L1X_Below, 1 = eVL53L1X_Above, 2 = eVL53L1X_Out and 3 = eVL53L1X_In
    switch(sensor.getDistanceThresholdWindow())
    {
      case eVL53L1X_Below:
                          Serial.print("测距范围:小于 ");
                          Serial.println(sensor.getDistanceThresholdLow());
                          break;
      case eVL53L1X_Above:
                          Serial.print("测距范围:大于 ");
                          Serial.print(sensor.getDistanceThresholdHigh());
                          break;
      case eVL53L1X_Out:
                          Serial.print("测距范围:小于 ");
                          Serial.print(sensor.getDistanceThresholdLow());
                          Serial.print(" 或大于 ");
                          Serial.print(sensor.getDistanceThresholdHigh());
                          break;
      default:
                          Serial.print("测距范围:[");
                          Serial.print(sensor.getDistanceThresholdLow());
                          Serial.print(", ");
                          Serial.print(sensor.getDistanceThresholdHigh());
                          Serial.print("]");
                          break;
      }
     Serial.println("mm");
     Serial.println();
    /*中断0上升沿中断,则调用interrupt函数,UNO的中断0引脚为D2脚,需将传感器的GPIO1引脚连接到UNO的D2口*/
    attachInterrupt(0, interrupt, RISING);
    sensor.startRanging();//开始测距
}
void interrupt()
{
    flag = true;
  }
void loop() {
  // put your main code here, to run repeatedly:
     /*当检测到中断发生,就打印距离值,并将中断标志置 0 */
     if(flag == true)
    {
        flag = false;
        int distance = sensor.getDistance();
        Serial.print("Distance(mm): ");
        Serial.println(distance);
        Serial.println();
      }
}

程序功能:测量在100~200范围内的距离,串口打印如下图所示:

串口打印[100,200]范围内的距离值
Warning yellow.png

注:需将传感器的GPIO1引脚连接到UNO的D2引脚(中断0),以检测中断是否发生。



  • 测量运动物体的运动速度
/*!
   file speedMeasure.ino
   SEN0302 Distance Ranging Sensor
   The module is connected with Arduino Uno to read the distance
   This demo can get the 1D gesture(up and down)
   Copyright    [DFRobot](http://www.dfrobot.com), 2016
   Copyright    GNU Lesser General Public License
   version  V0.1
   date  2018-4-12
*/
#include "Arduino.h"
#include "Wire.h"
#include "DFRobot_VL53L1X.h"

// volatile  int8_t GPIO1TRIG = 0;

DFRobot_VL53L1X sensor(&Wire);

float dis1 = 0;
float dis2;
uint16_t time;
float speed;
int i = 0;

void setup(void)
{
    Wire.begin();

    Serial.begin(9600);

    while (sensor.begin() != true){
        Serial.println("Sensor init failed!");
        delay(1000);
    }
    sensor.setDistanceModeShort();
    sensor.setTimingBudgetInMs(eBudget_500ms);
    sensor.setInterMeasurementInMs(500);
    Serial.println();
    Serial.print("InterMeasurement: ");
    Serial.println(sensor.getInterMeasurementInMs());
    Serial.print("TimingBudget: ");
    Serial.println(sensor.getTimingBudgetInMs());
    Serial.println();
    
    time = sensor.getInterMeasurementInMs();
    sensor.startRanging();
    delay(100);
}

void loop(void)
{
    while (sensor.checkForDataReady() == true){
        dis2 = dis1;
        dis1 = sensor.getDistance();
        speed = (dis1/time) - (dis2/time);
        if(abs(speed) < 2){
            if(speed > 0){
                Serial.print("Target is go away ,   speed is ");
                Serial.print(speed);
                Serial.println(" m/s");
            }else{
                Serial.print("Target is get closed ,speed is ");
                Serial.print(speed);
                Serial.println(" m/s");
            }
        }else
            Serial.println("No target");
    }
}

程序功能:串口打印物体的运动方向及运动速度。

运动物体的方向和速度


树莓派

硬件

  • 树莓派主控 x1
  • VL53L1X TOF Laser-ranging Sensor模块 x1


准备步骤

step1:连接VL53L1X传感器和树莓派主板.
step2:检测I2C接口是否使能。输入命令i2cdetect -y 1,若未使能,会显示如下图所示提示:

I2C接口失能提示

step3:使能I2C接口。(若已开启可忽略此步)键入命令sudo raspi-config,进入配置界面,操作流程如下所示:

步骤1
步骤2
步骤3

配置完成后,键入命令sudo reboot重启树莓派。
step4:检测I2C地址。键入命令i2cdetect -y 1检查设备I2C地址,如下图所示:

检测I2C地址0x29


step5:下载VL53L1X库。键入命令sudo git clone https://github.com/DFRobot/DFRobot_VL53L1X,输入ls查看命令,如下图所示:

下载DFRobot_VL53L1X库

样例程序

进入VL53L1X库python示例所在目录

   cd /DFRobot_VL53L1X/Python/RaspberryPi
  • 校准功能

运行getDistance.py示例,实现校准测距。校准之前,需要知道一个固定的目标距离。

   python getDistance.py

在树莓派上测得校准后的数据

校准后测距
  • 设置测距时间和测距间隔

运行setRangeCycle.py示例,设置传感器的测距时间、测距间隔并获取,打印设置后的距离。

   python setRangeCycle.py

串口打印后的数据

获取测距时间,测距间隔,及距离值
  • 设置测距范围

运行setDistanceMode.py示例,若检测到范围内的距离,传感器的GPIO1引脚会产生一个中断信号(默认上升沿触发),并打印距离值。

   python setDistanceMode.py

串口打印后的数据

检测并打印超过400mm外的距离
Warning yellow.png

注:需将传感器的GPIO1引脚连接到树莓派的21引脚(中断0),以检测中断是否发生。

  • 测量运动物体速度

运行speedMeasure.py示例,测量并打印运动物体的运动方向和速度。

   python speedMeasure.py

串口打印运动物体的速度

运动物体的方向和速度

产品尺寸

SEN0245 尺寸图 1.jpg


常见问题

还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。


更多


DFshopping car1.png DFRobot商城购买链接

个人工具
名字空间

变换
操作
导航
工具箱