ESP32驱动TFmini-S红外激光测距ToF模块进行测距

0 阅读4分钟

概要

在这里插入图片描述

TFmini-S LiDAR Sensor是基于 TFmini 的升级项目,它是一款小型化,单点测距的产品,基于 ToF(飞行时间)原理,配合独特的光学、电学、算法设计,主要实现稳定、精准、高灵敏度和高速的距离测量的功能。产品本身除了具有 TFmini 的低成本、小体积、测距远等特点外,测距精度更高,对于室外强光、不同温度、不同反射率等不同环境下适应性更强,更低功耗,探测频率也更加灵活。产品同时兼容 UART 和 I2C 通信接口,可通过指令进行切换。

TFmini-S 基于 ToF(Time of Flight)即飞行时间原理。具体为产品周期性的向外发出近红外光调制波,调制波遇物体后反射。产品通过测量调制波往返相位差,得到飞行时间,再计算出产品与被测目标之间的相对距离。 在这里插入图片描述

TFmini-S模块基本参数

在这里插入图片描述

TFmini-S模块引脚

在这里插入图片描述

TFmini-S通信接口

UART数据通信协议 在这里插入图片描述

IIC数据通信协议 在这里插入图片描述

I/O工作模式

I/O 输出模式下,不能输出测距值,只是在距离从小变大超过高阈值的时候或者从大到小低 于低阈值的时候让 I/O 口电平反转。当输出为近区电平时,测量值大于滞回区间的远端点后,输出切换为远区电平;当输出为远区电平时,测量值小于滞回区间的近端点时,输出切换为近区电平。(高电平:3.3V,低电平:0V)

串口数据通信

TFmini-S 有两种数据输出格式,标准数据输出格式和字符串数据格式,两种格式可通过指令代码相互切换。

⚫ 标准数据输出格式(默认):
数据结构:数据帧长度为9字节。包含距离信息(Distance)、信号强度信息(Strength)、 温度(Temp)、数据校验字节(Checksum)等。数据格式为 16 进制(HEX) 在这里插入图片描述 Dist(Distance):代表 TFmini-S 测量输出的距离值,默认单位为cm,解析为十进制的值范围为0-2000。实际使用过程中,当信号强度值Strength<100时,Dist的测量值被认为不可信,默认输出-1。 Strength:指信号强度,默认输出值会在0-65535之间。当测距档位一定时,测距越远,信号强度越低;目标物反射率越低,信号强度越低。 Temp(Temperature):表征芯片内部温度值。摄氏度 = Temp / 8 – 256。

⚫ 字符串数据格式 以字符串形式输出,单位为m,比如测距为1.21m,则输出字符串1.21,后跟转义字符\r\n。

ESP32与TFmini-S接线

在这里插入图片描述 TFmini-S模块接到了ESP32的串口2引脚上

ESP32TFmini-S
5V5V
GNDGND
16TXD
17RXD

Arduino串口驱动代码

#include <HardwareSerial.h> // Reference the ESP32 built-in serial port library
HardwareSerial lidarSerial(2); // Using serial port 2
#define RXD2 16
#define TXD2 17

void setup() {
  Serial.begin(115200); // Initializing serial port
  lidarSerial.begin(115200, SERIAL_8N1, RXD2, TXD2); // Initializing serial port
}

void loop() {
  uint8_t buf[9] = {0}; // An array that holds data
  if (lidarSerial.available() > 0) {
    lidarSerial.readBytes(buf, 9); // Read 9 bytes of data
    if( buf[0] == 0x59 && buf[1] == 0x59)
    {
      uint16_t distance = buf[2] + buf[3] * 256;
      uint16_t strength = buf[4] + buf[5] * 256;
      int16_t temperature = buf[6] + buf[7] * 256;
      Serial.print("Distance: ");
      Serial.print(distance);
      Serial.print(" cm, strength: ");
      Serial.print(strength);
      Serial.print(", temperature: ");
      Serial.println(temperature / 8.0 - 256.0);
    }
  }
  delay(10); 
}

ESP32的串口1作为测量数据显示到串口助手上,ESP32的串口2与TFmini-S模块的串口通信。将以上代码上传到ESP32中,将TFmini-S模块与测量目标离开一定距离,打开串口监视器可得到测量距离结果如下:

在这里插入图片描述

总结

以上实验使用的TFmini-S模块默认的串口通信协议,没做任何内部参数的修改,ESP32作为主控读取并转换出TFmini-S模块的测量数据。其他的通信协议的使用和参数的修改,可详细参考TFmini-S模块的说明书。