驴友花雕 发表于 2021-8-14 20:34:05

【Arduino】168种传感器系列实验(183)VL53L0X激光测距模块

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十三:GY-530 VL53L0X 激光测距 ToF测距 飞行时间测距传感器模块 IIC通信协议


紫色微型版





驴友花雕 发表于 2021-8-15 20:09:16

【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十三:GY-530 VL53L0X 激光测距 ToF测距 飞行时间测距传感器模块 IIC通信协议
项目之四:简易测量距离(读数以毫米为单位,可测范围40mm-2200mm)
模块接线:
VL53L0XArduino
VCC      5V
GND      GND
SCL      A5
SDA      A4

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十三:GY-530 VL53L0X 激光测距 ToF测距 飞行时间测距传感器模块 IIC通信协议
项目之四:简易测量距离(读数以毫米为单位,可测范围40mm-2200mm)
模块接线:
VL53L0XArduino
VCC      5V
GND      GND
SCL      A5
SDA      A4
*/

#include <VL53L0X.h>
#include <Wire.h>

VL53L0X sensor; //Create the sensor object

int startTime = millis(); //used for our timing loop
int mInterval = 100; //refresh rate of 10hz

void setup() {

Serial.begin(57600);

Wire.begin(); //Setup your I2C interface
Wire.setClock(400000); // use 400 kHz I2C

sensor.setTimeout(500); //Set the sensors timeout

if (!sensor.init())//try to initilise the sensor
{
    //Sensor does not respond within the timeout time
    Serial.println("VL53L0X is not responding, check your wiring");
}
else
{
    //SET THE SENSOR TO LONG RANGE MODE
    // lower the return signal rate limit (default is 0.25 MCPS)
    sensor.setSignalRateLimit(0.1);
    // increase laser pulse periods (defaults are 14 and 10 PCLKs)
    sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
    sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
    sensor.setMeasurementTimingBudget(40000); //Set its timing budget in microseconds longer timing budgets will give more accurate measurements
    sensor.startContinuous(50); //Sets the interval where a measurement can be requested in milliseconds
}
}

void loop() {
//We have to be careful here. If we request a measurement before the measurement has been taken your
//code will be blocked until the measurement is complete. In order to stop this from happening we
//must ensure that time between measurement requests is greater than the timing budget and the argument
//given in the startContinuous() function. In our case our measurement time must be greater than 50mS.

if ((millis() - startTime) > mInterval)
{
    Serial.println(sensor.readRangeContinuousMillimeters()); //Get a reading in millimeters
    startTime = millis();
}
delay(80);
}

驴友花雕 发表于 2021-8-15 18:46:32

                                          


【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十三:GY-530 VL53L0X 激光测距 ToF测距 飞行时间测距传感器模块 IIC通信协议
项目之二:使用单发射程模式进行简易测量(读数以毫米为单位,测量范围50mm-2000mm)

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十三:GY-530 VL53L0X 激光测距 ToF测距 飞行时间测距传感器模块 IIC通信协议
项目之二:使用单发射程模式进行简易测量(读数以毫米为单位,测量范围50mm-2000mm)
模块接线:
VL53L0XArduino
VCC      5V
GND      GND
SCL      A5
SDA      A4
*/

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

// Uncomment this line to use long range mode. This
// increases the sensitivity of the sensor and extends its
// potential range, but increases the likelihood of getting
// an inaccurate reading because of reflections from objects
// other than the intended target. It works best in dark
// conditions.

#define LONG_RANGE

// Uncomment ONE of these two lines to get
// - higher speed at the cost of lower accuracy OR
// - higher accuracy at the cost of lower speed

#define HIGH_SPEED
//#define HIGH_ACCURACY


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

sensor.setTimeout(500);
if (!sensor.init())
{
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
}

#if defined LONG_RANGE
// lower the return signal rate limit (default is 0.25 MCPS)
sensor.setSignalRateLimit(0.1);
// increase laser pulse periods (defaults are 14 and 10 PCLKs)
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif

#if defined HIGH_SPEED
// reduce timing budget to 20 ms (default is about 33 ms)
sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
// increase timing budget to 200 ms
sensor.setMeasurementTimingBudget(200000);
#endif
}

void loop(){
Serial.print(sensor.readRangeSingleMillimeters());
if (sensor.timeoutOccurred()) {
    Serial.print(" TIMEOUT");
}
Serial.println();
}

驴友花雕 发表于 2021-8-16 11:11:00

                                          


【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十三:GY-530 VL53L0X 激光测距 ToF测距 飞行时间测距传感器模块 IIC通信协议
项目之八:使用 VL53L0X 进行范围测量并在 SSD1306 OLED 上显示(mm)

实验开源代码

/*
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百八十三:GY-530 VL53L0X 激光测距 ToF测距 飞行时间测距传感器模块 IIC通信协议
项目之八:使用 VL53L0X 进行范围测量并在 SSD1306 OLED 上显示(mm)
模块接线:SSD1306 OLED模块相同
VL53L0XArduino
VCC      5V
GND      GND
SCL      A5
SDA      A4
*/

#include <Wire.h>
#include "Adafruit_VL53L0X.h"
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display = Adafruit_SSD1306();

Adafruit_VL53L0X lox = Adafruit_VL53L0X();

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

void setup() {
Serial.begin(9600);

display.begin(SSD1306_SWITCHCAPVCC, 0x3C);// initialize with the I2C addr 0x3C (for the 128x64)
// init done
display.display();
delay(1000);


Wire.begin();

if (!lox.begin()) {
    Serial.println(F("Failed to boot VL53L0X"));
    while (1);
}

// text display big!
display.setTextSize(4);
display.setTextColor(WHITE);
}

void loop() {
VL53L0X_RangingMeasurementData_t measure;

lox.rangingTest(&measure, false); // pass in 'true' to get debug data printout!

if (measure.RangeStatus != 4) {// phase failures have incorrect data
    display.clearDisplay();
    display.setCursor(0, 0);
    display.print(measure.RangeMilliMeter);
    display.print("mm");
    display.display();
    Serial.println();
    delay(50);
} else {
    display.display();
    display.clearDisplay();
    return;
}
}

驴友花雕 发表于 2021-8-14 20:35:23


黑色双孔版




驴友花雕 发表于 2021-8-14 20:37:34

                                          


                                    

VL53L0X
是新一代飞行时间(ToF)激光测距模块(不同于传统技术),采用目前市场上最小的封装,无论目标反射率如何,都能提供精确的距离测量。它可以测量2m的绝对距离,为测距性能等级设定了新的基准,为各种新应用打开了大门。 img_vl53l0xVL53L0X集成了一个领先的SPAD阵列(单光子雪崩二极管),并内嵌ST的第二代FlightSense™专利技术。VL53L0X的940nm VCSEL发射器(垂直腔面发射激光器)完全不为人眼所见,加上内置的物理红外滤光片,使其测距距离更长,对环境光的免疫性更强,对盖片的光学串扰具有更好的稳定性,号称世界上最小的飞行时间(ToF)测距传感器。

驴友花雕 发表于 2021-8-14 20:40:56

                                          


VL53L0X功能
完全集成的小型化模块
940 nm 激光器 VCSEL
VCSEL驱动器
测距传感器,内嵌高级微控制器
4.4 x 2.4 x 1.0 mm
快速,精确测距
测量的绝对距离达到2m
报告的距离与目标反射率无关
先进的嵌入式光学串扰补偿,简化盖片的选择
人眼安全
1类激光器件,符合最新标准IEC 60825-1:2014(第3版)要求
方便集成
单回流焊元件
无附加光学元件
单电源
用于器件控制和数据传输的I2C接口
Xshutdown(复位)和中断 GPIO
可编程I2C地址

                                                                        

驴友花雕 发表于 2021-8-15 06:03:20

VCSEL简介
VCSEL(Vertical-cavity surface-emitting laser),全称垂直腔面发射激光器,又可译为垂直共振腔面射型激光。1996年,VCSEL首次被应用了到光通信中,尤其在短距离光通信领域,850 nm VCSEL成为了理想的光源之一。而后,3D人脸识别出现,为940 nm VCSEL的发展提供了契机。至此,由以光通信为主的850 nm慢慢转向以应用于消费级设备为主的940 nm。

它是一种半导体激光器,有别于传统的边发射激光器沿平行于衬底表面、垂直于解理面的方向出射激光,而面发射激光器其出光方向垂直于衬底表面。

驴友花雕 发表于 2021-8-15 06:08:41

由于VCSEL的激光是从垂直的衬底发出来的,LED也是从垂直的衬底发出来的,所以VCSEL激光器和LED的芯片结构、制程和封装工艺就比较接近。

它的基本结构是由上下两个DBR(Distributed Bragg Reflector)反射镜和有源区这三部分组成。上下两个DBR反射镜与有源区构成谐振腔。有源区由几个量子阱组成,作为VCSEL的核心部分,决定着器件的阈值增益、激射波长等重要参数。



VCSEL常用的原材料有砷化镓、磷化铟或氮化镓等发光化合物半导体。

VCSEL垂直发光,这使得构建垂直于芯片的VCSEL阵列变得很容易,而且它们在相当宽的温度范围内都非常稳定。它集高输出功率和高转换效率和高质量光束等优点于一身,与传统发射激光器相比优点具有较小的原场发散角,发射光束窄且圆,易与光纤进行耦合,同时VCSEL还具有阈值电流低、调制频率高、不必解理即可完成工艺制作和检测和成本低、易于实现大规模阵列及光电集成等优点。

驴友花雕 发表于 2021-8-15 06:31:25

意法半导体(ST)发布了第二代激光测距智能传感器VL53L0,新的智能传感器基于成功的FlightSense技术,实现更快、更远、更精确的测距功能,大幅提升手机和平板电脑的拍照性能,为智能机器人、用户检测、无人机、物联网和穿戴式装置市场开拓新的应用机会。

4.4 x 2.4 x 1mm的外观尺寸使VL53L0成为世界上最小的ToF(Time-of-Flight,飞行时间)模块,同时还是首款集成940纳米 VCSEL 光源、SPAD光子检测器和先进微控制器(管理整个测距功能)的测距智能传感器。市场首款应用940纳米发射光的模块,配合先进的红外滤波器,VL53L0具有业内最好的环境光抗干扰性能,将环境光的影响降至最低。在终端产品应用中,嵌入式微控制器和数字算法可以最大限度降低主机处理负荷和系统功耗。

意法半导体影像产品部总经理Eric Aussedat表示:“意法半导体在ToF传感器领域的技术进步正在为数以万计的消费者带来更好的用户体验,彻底颠覆他们用智能手机和平板电脑拍照摄像的方式。意法半导体在2014年推出了首款完全集成的ToF测距智能传感器,随后被多家世界领先的OEM厂商成功地应用于激光辅助自动对焦功能。今天,随着新一代产品VL53L0问世,意法半导体正在树立新的测距产品性能基准,为开发人员在智能机器人和物联网市场开发新应用开启新的机会。”

VL53L0能够在一帧画面内完成全部测量操作,用时通常小于30ms,距离小于2米。这样的测距性能让拍照系统在摄像和连拍模式下瞬间对焦,甚至在低光或低对比度场景中保持同样的性能表现,而对于没有装备ToF技术的拍照系统,低光源或低对比度场景则是一个巨大的挑战。由于测距精确度非常出色,VL53L0还可提升智能手机应用性能,包括双摄像头深度图。意法半导体的VL53L0模块简单易用(6个有效引脚),提供I2C接口,配备全套的API驱动程序和技术文档,使系统集成变得快速、简单。模块封装支持回流焊工艺,符合RoHS有害物质限用标准,完全兼容各种玻璃盖板和外观设计。

驴友花雕 发表于 2021-8-15 06:44:30

                                                               



ST为进一步加强其在飞行时间测距传感器(ToF)市场的领导地位,推出第二代FlightSense? 技术,并用于新的VL53L0X激光测距传感器上。

VL53L0X将ToF测距长度扩至两米,精确度在±3百范围内。测量速度较上一代产品更快,测距时间不足30ms;更高能效,正常工作模式下功耗仅20mW,待机功耗只有5μA。封装尺寸为2.4mm x 4.4mm x 1mm,在市面上同类产品中小。

不同于传统的红外接近检测传感器(infrared proximity sensors),VL53L0X输出的是精确到毫米的测距结果,目标物体的颜色和反射光不会影响测距结果。快速响应的FlightSenseTM技术,因被大品牌智能手机摄像头激光辅助自动对焦所采用而享誉业界,能够区分目标物体的横向或纵向移动。传感器内部完成测距计算,通过I2C总线接口输出数据,因而对系统主控制器的需求降至最低。

内部激光器发射940nm波长非可见光,不伤害眼睛,消除了与其它红外接近检测传感器发射红光分散人们注意力的问题,增强了对外部光源的抗干扰性能。该传感器的数字架构和自动补偿功能使其在环境光强较高的场景中仍然具有很高的性能表现。

VL53L0X的感测能力可以支持各种功能,包括各种创新用户界面的手势感测或接近检测;扫地机器人等家电的墙壁探测、悬崖探测、碰撞探测;卫浴产品,例如:水龙头、皂液器、干手机和冲洗器;其它目标应用包括笔记本电脑用户存在检测或电源开关监控器、无人机和物联网(IoT)产品。

驴友花雕 发表于 2021-8-15 06:52:19

Cadence 的杰出工程师 Gilles Lamant 说:“VCSEL 光往往接近可见光范围,当你提高功率时,这会使它们变得危险。” “使用 LiDAR,您需要非常高的功率才能获得任何类型的范围,这可能会对视力造成风险。然而,即使接近可见光谱,它们对于低功率应用也是安全的,这就是为什么人们关注它们来进行面部识别和诸如相机测距之类的事情。”

Lamant 说,与其他激光源相比,VCSELS 的真正优势在于其便利性、灵活性和功率以及热效率。

“VCSELS 垂直发光,这使得构建垂直于芯片的阵列变得容易,并且它们非常稳定,具有相当大的温度变化,”Lamant 说。“他们还被证明在一个系统内发送数据,而在一个系统内对数据信号进行编码。这将受到您可以做到的频率的限制,尽管如此,我们仍在寻找一种将光学与基于硅的解决方案集成的方法。”

Thompson 说,VCSEL 每瓦功率提供的光比替代激光源要多得多。接线更容易,因为当激光器从顶部出现时,可以从下面进行电气和热管理。

VCSEL 输出的功率量也可按尺寸线性扩展。每个激光孔径都是独立的并且基本相同。芯片上的孔径越多,输出的功率就越大。将它们全部连接到单个电源会使它们全部一致发射。将芯片连接到区域中可以让它们在不同的时间和不同的模式下发射——其功率输出由孔的数量决定。



VCSEL从诞生起,是作为新一代光存储和光通信应用的核心器件,应用在光并行处理、光识别、光互联系统、光存储等领域。


随着工艺、材料技术改进和VCSEL技术的成熟,VCSEL元器件在功耗、制造成本、集成、散热等领域的优势开始显现,以其作为核心元件的光学感测技术进入了行业级应用,同时已在激光打印机、光学鼠标、汽车激光雷达(LiDAR)、辅助驾驶、气体传感器、活体检测、虹膜识别、AR/VR、机器人视觉、医疗美容等领域得以初探,并逐渐应用于工业加热、环境监测、医疗设备等商业级应用以及3D感知、ToF镜头等消费级应用。


驴友花雕 发表于 2021-8-15 07:10:59

本帖最后由 驴友花雕 于 2021-8-15 07:15 编辑

                                                               



VL53L0X 参数
超小体积:4.4 x 2.4 x 1.0mm
最大测距:2m
发射的激光对眼镜安全,且完全不可见。
工作电压:2.6 to 3.5 V
通信方式:IIC,400KHz,设备地址0x52,最低位是读写标志位。0表示写,1表示读。



因此进行写的时候,此8位数据为:0101 0010,即0x52。进行读的时候,此8位数据为:0101 0011,即0x53。


驴友花雕 发表于 2021-8-15 07:16:32

本帖最后由 驴友花雕 于 2021-8-15 07:22 编辑

                                          


VL53L0X 芯片内部框图


   

驴友花雕 发表于 2021-8-15 07:24:03

VL53L0X上有两个孔,一个是VCSEL激光发射孔,一个是SPAD激光检测阵列的孔。


   

驴友花雕 发表于 2021-8-15 08:16:05

                                          




VL53L0X引脚图

1脚AVDDVCSEL:VCSEL电源正
2脚AVSSVCSEL:VCSEL电源地
3脚、4脚、6脚、12脚GND:地
5脚XSHUT:电源模式控制,如果不需要休眠功能,此脚可以直接接到AVDD上。
7脚GPIO1:中断输出。开漏输出,因此必须要外部上拉。
8脚DNC:悬空
9脚和10脚:IIC通信端口
11脚AVDD:电源正。

驴友花雕 发表于 2021-8-15 08:17:31

                                          


VL53L0X原理图



驴友花雕 发表于 2021-8-15 09:04:41

VL53L0X激光测距模块
VL53L0X 飞行时间测距传感器是新一代测距传感器。VL53LOX 是一款完全集成的传感器,配备嵌入式红外、高级滤光片和超高速光子检测阵列。它可以测量更远的距离,并具有更高的速度和准确性。VL53L0X的感应能力可以支持多种功能,包括各种创新用户界面的手势感应或接近检测、清洁机器人、服务机器人、家电感应面板和笔记本电脑用户的障碍检测和防碰撞系统。检测或电源开关监视器,以及无人机和物联网 (IoT) 产品。

使用这款革命性的传感器测量长达 2m 的距离。它的工作原理是测量光速,它发出一束光并测量它反射回传感器的时间。得益于 I2C 接口,它可以轻松集成到许多项目中。得益于 IR 滤光片,该传感器还可以在强光环境中工作。

驴友花雕 发表于 2021-8-15 09:22:25

模块规格
工作电压:3~5V;
通讯方式:IIC;
测量绝对距离:2m;
Xshutdown/GPIO(中断);
工作温度从-20°C到70°C;
频率 I2C 高达 400kHz,地址 0x52
间距:2.54mm;
尺寸:25 x 12mm;



模块说明
1、传感器在默认模式下可以测量大约 30 毫米到 1.2 米
2、与传感器的通信是通过 I2C 使用 ST 编写的 API 完成的
3、工作电压范围为 DC 3.3 V 至 5.5 V
4、距离测量范围可达 2 m (6.6 ft),有效范围取决于配置、目标和环境。

驴友花雕 发表于 2021-8-15 09:26:08

VL53L0X模块电原理图


驴友花雕 发表于 2021-8-15 09:29:57

VL53L0X模块参考电原理图




驴友花雕 发表于 2021-8-15 09:31:36

                                          


VL53L0X模块与超声波模块的对比



驴友花雕 发表于 2021-8-15 11:44:17

电源引脚:Vin -这是电源引脚。由于该芯片使用2.8 VDC,因此我们在板载了一个稳压器,该稳压器将采用3-5VDC电压并将其安全地转换为低压。要为电路板供电,请为其提供与微控制器逻辑电平相同的功率-例如,对于像Arduino这样的5V微型电池,请使用5V2v8 -这是稳压器的2.8V输出,如果您愿意,您可以从中获取100mA电流GND -电源和逻辑的公共接地
I2C逻辑引脚:SCL -I2C时钟引脚,连接到微控制器的I2C时钟线。SDA -I2C数据引脚,连接到微控制器的I2C数据线。
控制引脚:GPIO -这是一个引脚传感器使用它来指示数据已准备就绪。在进行连续感应时很有用。请注意,此引脚上没有电平转换,您可能无法读取5V微控制器上的2.8V逻辑电平电压(我们可以在arduino UNO上读取,但没有保证)。我们的库没有使用此引脚,但对于高级用户来说,它就在这里!
SHDN -传感器的关闭引脚。默认情况下,它被拉高。有一个电平转换二极管,因此您可以在此引脚上使用3-5V逻辑。当该引脚被拉低时,传感器进入关机模式。

驴友花雕 发表于 2021-8-15 14:28:22

                                          


安装VL53L0X Arduino 库
接下来我们需要一个库来与 Arduino 端的传感器进行通信。有两个流行的库:Adafruit的 Adafruit_VL53L0X 和Pololu的 VL53L0X。两个库都有非常相似的 API,使用博世传感器驱动程序代码,并且可以通过 Arduino IDE 库管理器安装。Pololu 的库需要更少的闪存空间和 RAM,但仍然不小,可以与 Arduino Pro Micro 上的 ROS 库一起使用。



页: [1] 2 3
查看完整版本: 【Arduino】168种传感器系列实验(183)VL53L0X激光测距模块