之前我们已经介绍如何用PIR人体红外、超声波测距还有雷达微波模块来检测活人/物体接近,今天我们再介绍一种传感器--飞行时间测距传感器,也叫激光测距传感器。

    TOF飞行时间测距传感器    

TOF(Time of Flight) 飞行时间测距传感器的工作原理和超声波测距的原理非常相似,只不过TOF传感器发射的不是声波,而是特定波长的激光。通过光束反射回来的时间T以及已知的光速(3×10^8米/秒),就可以算出距离L。有些TOF是利用相位差,

Python ToF激光测距 tof激光测距传感器_stm32超声波测距代码

Python ToF激光测距 tof激光测距传感器_Python ToF激光测距_02

与传统的PIR人体红外传感器被动地感应红外线不同,TOF传感器会主动发射特定波长(常见的是940nm不伤眼的非可见激光)的方向性一致的光束,这样能较好地排除掉日光等外部光源的干扰,而且光传播的速度远远快于声音传播的速度。测距时间短,精度高,而且体积又很小。这是TOF传感器被广泛地运用到各种电子产品上,普通到比如皂液器、干手机等卫浴产品,高级到比如无人机、无人汽车、扫地机器人、智能手机的相机等等。

    VL53L0X模块    

市面上有很多TOF传感器,它们的能探测的范围,反应时间、成本都不尽相同,本篇我们着重介绍的是由ST(意法半导体)推出的基于VL53L0X芯片的TOF测距模块。

Python ToF激光测距 tof激光测距传感器_stm32超声波测距代码_03

VL53L0X模块主要由VL53L0X芯片和一些外围支持元件构成。VL53L0X芯片上集成了激光发射和接受模块,上面有两个孔,大一点的就是发射孔,它以35度扩散角向外射出940nm波长的不可见光。

Python ToF激光测距 tof激光测距传感器_stm32超声波测距代码_04

VL53L0X虽然探测精度虽然比较高,但测距范围并不长,只有2米以内。VL

53L0X一共有四种测距模式:

模式

更新时间

检测距离

典型应用

默认

30ms

1.2米

标准

高精确度

200ms

1.2米 精确度

精确测量

长距离

33ms

2米

长距离,仅昏暗条件(无红外线干扰)

高速

20ms

1.2米 精确度±5%

精确度非首要考虑条件

VL53L0X模块基本参数:

  • 工作电压:2.8V-5V
  • 测距范围:3cm - 200cm
  • 通信接口:I2C

    Arduino控制VL53L0X模块    

接下去,我们实际操作一下,如何用Arduino控制VL53L0X模块。一般VL53L0X模块有6个引脚,我们只需要用到电源针脚(VCC+GND)和I2C针脚(SCL和SDA),GPIO1和XSHUT不用接,VCC接5V或3.3V都可以。

Python ToF激光测距 tof激光测距传感器_超声波测距_05

如下图连接好Arduino和VL53L0X模块。

Python ToF激光测距 tof激光测距传感器_超声波测距_06

打开Arduino IDE,我们还需要安装VL53L0X模块的库文件。在Sketch(程序)>Include Library(加载库)>Manage Libraries(管理库)打开库管理器,搜索VL53L0X,我们安装Adafruit最新版的VL53L0X库即可。

Python ToF激光测距 tof激光测距传感器_Python ToF激光测距_07

安装好以后,我们重启一下Arduino IDE,从文件>示例>Adafruit_VL53L0X>vl53l0x打开,或者直接复制以下代码:

#include "Adafruit_VL53L0X.h" //引入VL53L0X库文件

Adafruit_VL53L0X lox = Adafruit_VL53L0X(); //创建VL53L0X实例

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

  // 等待串口启动
  while (! Serial) {
    delay(1);
  }
  
  Serial.println("Adafruit VL53L0X test");
  if (!lox.begin()) { //启动VL53L0X
    Serial.println(F("Failed to boot VL53L0X"));
    while(1);
  }
  
  Serial.println(F("VL53L0X API Simple Ranging example\n\n")); 
}


void loop() {
  VL53L0X_RangingMeasurementData_t measure;
    
  Serial.print("Reading a measurement... ");
  lox.rangingTest(&measure, false); 
  // 如果设置为true可以打印出更多调试信息

  if (measure.RangeStatus != 4) {
    Serial.print("Distance (mm): "); 
    Serial.println(measure.RangeMilliMeter);
  } else {
    //测距错误
    Serial.println(" out of range ");
  }
    
  delay(100);
}

#include "Adafruit_VL53L0X.h" //引入VL53L0X库文件

Adafruit_VL53L0X lox = Adafruit_VL53L0X(); //创建VL53L0X实例

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

  // 等待串口启动
  while (! Serial) {
    delay(1);
  }
  
  Serial.println("Adafruit VL53L0X test");
  if (!lox.begin()) { //启动VL53L0X
    Serial.println(F("Failed to boot VL53L0X"));
    while(1);
  }
  
  Serial.println(F("VL53L0X API Simple Ranging example\n\n")); 
}


void loop() {
  VL53L0X_RangingMeasurementData_t measure;
    
  Serial.print("Reading a measurement... ");
  lox.rangingTest(&measure, false); 
  // 如果设置为true可以打印出更多调试信息

  if (measure.RangeStatus != 4) {
    Serial.print("Distance (mm): "); 
    Serial.println(measure.RangeMilliMeter);
  } else {
    //测距错误
    Serial.println(" out of range ");
  }
    
  delay(100);
}

上传烧录,然后打开Arduino IDE的串口监视器。选择115200的波特率,我们就可以看见VL53L0X模块的测距数据:

Python ToF激光测距 tof激光测距传感器_stm32超声波测距代码_08

可以看到,虽然测距范围有限,但VL53L0X模块的测距精度是非常高的(毫米级),Adafruit库的示例里还有VL53L0X模块配合OLED使用的例子,稍作包装就可以做一个“激光尺”。

Python ToF激光测距 tof激光测距传感器_超声波测距_09