TOF Laser Range Sensor (C) 使用教程

说明

产品简介

TOF Laser Range Sensor 系列是基于 TOF (飞行时间) 技术的激光测距传感器。内置控制器和测距算法,测距范围可达25m,精度高达 ±3cm。支持 UART、I2C和 I/O互补电平输出通信,具备超小的 FOV 角,使得距离更远抗光干扰能力更强,室内外环境均适用,抗环境光能力最高约 100K LUX 照度,可以作为测距工具进行距离检测,也可作为机器人避障/路线规划,还可用于无人机定高/天花板检测和料位测量等领域。

免责声明


应用场景

  • 无人机定高、天花板检测
  • 机器人避障
  • 测量与检测
  • 智能手势控制
  • 料位测量

工作原理

TOF是一种绝对距离检测技术,即传感器发出经过调试的近红外光,遇物体后反射,传感器通过计算光线发射和反射时差或相位差,来换算被拍摄景物的距离,以产生深度信息。相比于双目方案与3D结构光方案,TOF具有工作距离远,适用场景广,较远距离精度高等优点。因此常被应用于人员接近检测、机器人避障、照相机自动对焦等场合。


产品参数



功能描述

【ID | 身份标识】

  • ID是用于区分不同传感器而设定的一个变量,在级联连接时用于识别各个传感器。

【Interface & Baudrate | 接口与波特率】

TOF Laser Range Sensor (C) 支持配置为UART、IIC、I/O 通信方式:

UART|串口

UART串口通信波特率设置范围如下:

UART串口波特率说明
115200,230400,460800,921600,1000000,1200000,2000000,3000000默认波特率为921600

UART接口模式支持“主动输出”和“查询输出”,两种输出方式可以通过在 Waveshare TOFAssistant 软件上修改数据输出方式进行切换,通过 USB 转 TTL 模块(线序和供电电压参考数据手册)连接 TOF Laser Range Sensor 系列产品到Waveshare TOFAssistant 软件,识别成功后点击 TOF Laser Range Sensor C 1.png进入设置页面,配置完参数后需要点击写入参数按钮来保存参数,写入参数成功后可以读取一次参数来确认参数是否写入成功。
上位机下载:

  • Active Output | 主动输出:
    • UART 主动输出模式可在单模块时使用,数据输出方式设置为 ACTIVE,该模式下模块以 50Hz (最高100Hz) 的频率主动输出测量信息,输出格式遵循 NLink_TOFSense_Frame0 协议。
    • UART主动输出模式配置图


  • Query Output | 查询输出:
    • UART 查询输出模式可在单模块时使用,数据输出方式设置为 INQUIRE,写入参数后将不会再主动上报数据。该模式下通过控制器向期望查询模块发送包含该模 块 ID 的查询指令,模块即可输出一帧测量信息。查询帧格式遵循协议 NLink_TOFSense_Read_Frame0,输出帧格式遵循协议 NLink_TOFSense_Frame0。
    • UART 查询输出模式配置图


I2C | 集成电路总线

  • I2C 输出模式下,波特率设置范围如表
I2C波特率说明
最高400KHz最高400KHz,有主机决定
  • I2C Address | I2C 地址
I2C地址说明
0x08~0x77默认地址为 0x08(7 位地址),从机地址为 0x08+模块 ID,更改模块 的 ID 参数即可更改从机地址。通信时要注意移位和增加读写位,即 地址为 0x08 时发送带读写位的字节为 0x10(写)、0x11(读)

I2C 通信模式下通过控制器按照 I2C 通信时序向指定从机地址的期望查询模块发送读取帧, 即可获得模块的距离等相关信息。此外,也可以通过 I2C 通信来更改模块的输出方式等各项参数。 读取帧和写入帧格式遵循协议 NLink_TOFSense_IIC_Frame0。

模块处于 UART 模式时(注意 Waveshare TOFAssistant 无法识别处于 I2C 模式下的模块),通过 USB TO TTL 模块(线序和供电电压参考数据手册)连接 TOF 系列产品到 Wavshare TOFAssistant 软件,识别成功后点击 TOF Laser Range Sensor C 1.png进入设置页面,I2C 输出模式配置如下图,可以通过设置模块的 ID 来改变该模块 的 I2C 从机地址(7 位从机地址为 0x08+模块 ID,ID 设置范围为 0~111),配置完参数后需要点 击写入参数按钮来保存参数。注:切换到 I2C 模式后,可以参考 FAQ 章节中的方式来更改回 UART 模式。


I/O Output | I/O 输出

  • I/O 输出模式下,仅可在单模块时使用,不能输出测距值,只是在距离从小变大超过高阈值的时候或者从大到小低 于低阈值的时候让 I/O 口电平反转。

模块处于 UART 模式时(注意 Waveshare TOFAssistant 无法识别处于 I/O 模式下的模块),通过 USB TO TTL 模块(线序和供电电压参考数据手册)连接 TOF 系列产品到 Waveshare TOFAssistant 软件,识别 成功后点击 TOF Laser Range Sensor C 1.png 进入设置页面,首先设置滞环起点 Band_Start 与滞环宽度 Bandwidth 确定滞环区 间,I/O 输出模式配置如图 4;距离值通过滞环比较转换为高低电平输出,I/O_L 与 I/O_H 输出互补电平,滞环比较示意图如图 5 所示。配置完参数后需要点击写入参数按钮来保存参数。 注:切换到 I/O 模式后,可以参考 FAQ 章节中的方式来更改回 UART 模式。

例如,Band_Start 和 Bandwidth 都设置成 500,对应的是 0.5 米。当测距值为 0.3 米时,I/O_H 为高,I/O_L 为低,测距值变大到 0.8 米,I/O_H 为高,I/O_L 为低,测距值超过 1 米时,电平反转,I/O_H 为低,I/O_L 为高。测距值从 1 米多降到 0.8 米,I/O_H 为低,I/O_L 为高,测距值降到低于 0.5 米时, 电平反转,I/O_H 为高,I/O_L 为低。


其中 TOF (C) 的 Band_Start、Bandwidth 取值范围[0~25000], 单位:mm。


【Distance Status | 距离状态指示】

模块可以输出当前距离状态,用户可结合距离状态进行数据处理,距离状态含义如下:

数值说明
0测量距离无效
1测量距离有效

【Signal Strength | 信号强度】

  • 指示当前返回信号的强度,该值越大表明返回信号越强。在距离被测物体相同距离情况下,被测物体表面的反射率不同会导致信号强度变化,反射率越高信号强度越大,反之越小

【Range Precision | 测距精度】

  • 指示当前测距的精度,该值越小表明测距精度越好。

【FOV | 视场角】

  • FOV 视场角的大小决定了 TOF 的视野范围,TOF (C)模块的视场角为 1~2°。

【Mode Switch | 模式切换】

  • 如果模块处于 UART 模式,可以连接 Waveshare TOFAssistant 软件来切换到 IIC 或 I/O 模式。如果模块处 于 IIC 模式,需要通过 IIC 通信向模块发送指令来切换回 UART 模式。此外,在没有 IIC 测试 环境或者切换到 I/O 模式后可以参考用户手册 FAQ 章节的方式来切换回 UART 模式。

协议解析

UART 通信流程

  • 串口默认配置为:数据位 8bit,停止位 1bit,无奇偶校验,无流控制,默认波特率 921600。
  • UART 接口下每个包含距离的数据帧由 16 个字节的十六进制数组成。
  • 协议由 Frame Header(帧头)、Function Mark(功能字)、Data(数据)、Sum Check(校验和)组成。
    • 其中 Frame Header、Function Mark 为固定不变的数值,具体可以查阅以下表格;
    • Data 为传输的数据内容,包含模块ID、系统时间System_time、测量值dis、距离状态dis status、信号强度 signal strength,查询协议帧仅包含被查询模块的 ID;
    • Sum Check 为 Frame Header、Function Mark、Data 相加求和(即前面所有字节相加)后的最低字节。
  • 协议组成:
Frame Header + Function Mark + Data + Sum Check

说明:协议包遵循小端模式原则,即低字节在前,高字节在后。

  • 协议内容概述
协议类型概述
NLINK_TOFSENSE_FRAME0定长UART 输出协议, 内容包括节点时间戳、距离、距离状态、 信号强度
NLINK_TOFSENSE_READ _FRAME0定长UART 读取协议, 内容包括节点 ID
NLINK_TOFSENSE_IIC_FRAME0变长IIC 通信协议, 内容包括距离、距离状态、信号强度等
  • 数据来源: 将模块连接上位机,配置 UART 为主动输出模式,NLink_TOFSense_Frame0 协 议,距离数据解析可以参考 FAQ
  • 原始数据:
57 00 ff 00 9e 8f 00 00 ad 08 00 00 03 00 06 41
  • 解析表:
DataTypeLength (Bytes)HexResult
Frame Headeruint81570x57
Function Markuint81000x00
reserveduint81ff*
iduint81000
System_timeuint3249e 8f 00 0036766ms
dis*1000uint243ad 08 002.221m
dis_statusuint81000
signal_strengthuint16203 003
range_precisionuint81066cm
Sum Checkuint81410x41
  • 数据来源: 将模块连接上位机,配置为 UART 查询输出模式,id 为 0,通过上位机发送下列 数据实现数据查询。如需查询其他 ID 的模块,更改 id 和校验和字节发送即可。
  • 原始数据:
57 10 FF FF 00 FF FF 63
  • 例如:查询ID=3的模块,指令为:57 10 FF FF 00 FF FF 63
  • 解析表:
DataTypeLength (Bytes)HexResult
Frame Headeruint81570x57
Function Markuint81100x10
reserveduint82FF FF*
iduint81000
reserveduint82FF FF*
Sum Checkuint81630x63
  • reserved :预留位、占位符,没有意义,但必须加
  • 使用上位机进行查询,操作如下:

  • 1、确定好端口号跟波特率,点击连接
  • 2、连接成功后,点击配置
  • 3、选择INQUIRE
  • 4、写入配置
  • 5、输入查询命令,我这里的ID=0,所以就是57 10 FF FF 00 FF FF 63
  • 6、发送查询命令
  • 7、显示当前测试到的数据
  • 从机地址:模块在 IIC 总线中作为从机,默认地址为 0x08(7 位地址),从机地址为 0x08+ 模块 ID,更改模块的 ID 参数即可更改从机地址。通信时要注意地址移位和增加读写位,即地址 为 0x08 时发送带读写位的字节为 0x10(写)、0x11(读)。
  • 寄存器地址:若寄存器中无对应参数则默认输出 0xff
AD 08 00 00 03 00 FF FF
  • 解析表:


    NLink_TOFSense_IIC_Frame0 寄存器解析及通信流程表

IIC 通信流程


  • 数据来源: 设置指令。
  • 解析表:


软件说明

TOF Assistant是TOF激光测距模块配套的调试软件,主要作用为:配置调试、状态显示、功能应用、固件升级:

  • 配置调试:用于配置节点相关参数,如ID、工作模式、波特率等。
  • 功能应用:用于应用开发,如数据导入导出、运动轨迹存储、历史轨迹回放等。
  • 固件升级:用于给产品进行有线固件升级。

产品尺寸


树莓派使用

  • 成功开机后,进行树莓派环境配置

下载程序

wget https://www.waveshare.net/w/upload/0/01/TOF_Laser_Range_Sensor_demo.zip
unzip TOF_Laser_Range_Sensor_demo.zip
cd TOF_Laser_Range_Sensor_demo/

UART示例使用

开启树莓派 UART

  • 在树莓派终端输入命令:sudo raspi-config nonint do_serial 2
  • 再弹出的窗口中第一个选择NO,第二个选择YES,最后选择OK.

使用上位机配置成UART

  • 默认是不需要配置的,可以直接使用,如果之前配置成了I2C或者I/O模式,需要参考FAQ的方法,将传感器复原。
  • 复原视频请参考这个:

硬件连接

  • 参考下图进行连接:


运行C程序

cd ~/TOF_Laser_Range_Sensor_demo/Raspberry/c/UART/
make
./main
  • 终端就会输出相关的信息,如下图:


运行Python程序

cd ~/TOF_Laser_Range_Sensor_demo/Raspberry/python/UART/example
python main.py 
  • 终端就会输出相关的信息,如下图:


I2C示例使用

开启树莓派 I2C

  • 在树莓派终端输入命令:sudo raspi-config nonint do_i2c 0

使用上位机配置成I2C

  • 如何配置成I2C模式,请参考功能描述中的 I2C | 集成电路总线

硬件连接

接入树莓派I2C的参考如下: 


运行C程序

cd ~/TOF_Laser_Range_Sensor_demo/Raspberry/c/I2C/
make
./main
  • 终端就会输出相关的信息,如下图:


运行Python程序

cd ~/TOF_Laser_Range_Sensor_demo/Raspberry/python/I2C/example
python main.py 
  • 终端就会输出相关的信息,如下图:


IO示例使用

使用上位机配置成IO

  • 如何配置成IO模式,请参考功能描述中的 I/O Output | I/O 输出

硬件连接

接入树莓派IO的参考如下: 


安装C库

sudo apt-get update
sudo apt install gpiod libgpiod-dev

运行C程序

cd ~/TOF_Laser_Range_Sensor_demo/Raspberry/c/IO/
make
./main
  • 终端就会输出相关的信息,如下图:


运行Python程序

cd ~/TOF_Laser_Range_Sensor_demo/Raspberry/python/IO/
python TOF_IO_Demo.py 
  • 终端就会输出相关的信息,如下图:


ESP32S3使用

  • 环境搭建完成后,即可连接传感器,下载示例

硬件连接

  • 参考下图进行连接:


Arduino示例使用

UART

  • 使用上位机配置成UART,默认是不需要配置的,可以直接使用,如果之前配置成了I2C或者I/O模式,需要参考FAQ的方法,将传感器复原。
  • 复原视频请参考这个:


  • 进入到TOF_Laser_Range_Sensor_demo\ESP32S3\UART\Arduino\TOF_URAT_Demo,双击TOF_URAT_Demo.ino文件
  • 选择开发板:


  • 选择ESP32S3的端口,然后进行编译上传
  • 上传完成后,打开串口监测器,就会输出相关的信息,如下图:


I2C

  • 如何配置成I2C模式,请参考功能描述中的 I2C | 集成电路总线
  • 进入到TOF_Laser_Range_Sensor_demo\ESP32S3\I2C\Arduino\TOF_I2C_Demo,双击TOF_I2C_Demo.ino文件
  • 选择开发板:


  • 选择ESP32S3的端口,然后进行编译上传
  • 上传完成后,打开串口监测器,就会输出相关的信息,如下图:


IO

  • 如何配置成IO模式,请参考功能描述中的 I/O Output | I/O 输出
  • 进入到TOF_Laser_Range_Sensor_demo\ESP32S3\IO\Arduino\TOF_IO_Demo,双击TOF_IO_Demo.ino文件
  • 选择开发板:


  • 选择ESP32S3的端口,然后进行编译上传
  • 上传完成后,打开串口监测器,就会输出相关的信息,如下图:


Micropython示例使用

UART

  • 使用上位机配置成UART,默认是不需要配置的,可以直接使用,如果之前配置成了I2C或者I/O模式,需要参考FAQ的方法,将传感器复原。
  • 复原视频请参考这个:


  • 进入到TOF_Laser_Range_Sensor_demo\ESP32S3\UART\micropython,双击TOF_URAT_Demo.py文件
  • 选择开发板:


  • 选择ESP32S3的端口,然后运行程序
  • Shell就会输出相关的信息,如下图:


I2C

  • 如何配置成I2C模式,请参考功能描述中的 I2C | 集成电路总线
  • 进入到TOF_Laser_Range_Sensor_demo\ESP32S3\I2C\micropython,双击TOF_I2C_Demo.py文件
  • 选择开发板:


  • 选择ESP32S3的端口,然后运行程序
  • Shell就会输出相关的信息,如下图:


IO

  • 如何配置成IO模式,请参考功能描述中的 I/O Output | I/O 输出
  • 进入到TOF_Laser_Range_Sensor_demo\ESP32S3\IO\micropython,双击TOF_IO_Demo.py文件
  • 选择开发板:


  • 选择ESP32S3的端口,然后运行程序
  • Shell就会输出相关的信息,如下图:


Arduino使用

  • 环境搭建完成后,即可连接传感器,下载示例

Arduino示例使用

UART

  • 使用上位机配置成UART,默认是不需要配置的,可以直接使用,如果之前配置成了I2C或者I/O模式,需要参考FAQ的方法,将传感器复原。
  • 复原视频请参考这个:


硬件连接

  • 参考下图进行连接:

Arduino UNO R3

Arduino UNO R4

运行程序

  • 进入到TOF_Laser_Range_Sensor_demo\Arduino\UART\TOF_URAT_Demo,双击TOF_URAT_Demo.ino文件
  • 选择开发板:

Arduino UNO R3

Arduino UNO R4

  • 选择开发板的端口,然后进行编译上传
  • 上传完成后,打开串口监测器,就会输出相关的信息,如下图:


I2C

  • 如何配置成I2C模式,请参考功能描述中的 I2C | 集成电路总线

硬件连接

  • 参考下图进行连接:


运行程序

  • 进入到TOF_Laser_Range_Sensor_demo\Arduino\I2C\TOF_I2C_Demo,双击TOF_I2C_Demo.ino文件
  • 选择开发板:

Arduino UNO R3

Arduino UNO R4

  • 选择开发板的端口,然后进行编译上传
  • 上传完成后,打开串口监测器,就会输出相关的信息,如下图:

TOF Laser Range Sensor C 28.png

IO

  • 如何配置成IO模式,请参考功能描述中的 I/O Output | I/O 输出

硬件连接

  • 参考下图进行连接:


运行程序

  • 进入到TOF_Laser_Range_Sensor_demo\Arduino\IO\TOF_IO_Demo,双击TOF_IO_Demo.ino文件
  • 选择开发板:

Arduino UNO R3

Arduino UNO R4

  • 选择开发板的端口,然后进行编译上传
  • 上传完成后,打开串口监测器,就会输出相关的信息,如下图:


FAQ

Q1. 室外(强光)条件下可以用吗?

  模块可以抵抗一定的自然光影响。可以在室外使用。

Q2. 多个模块是否有干扰?

  当多个模块同时工作时,即使相互之间的红外光线交叉或打到同一个位置,也不会影响实际测量。如果两个模块处于同一水平高度,且分别朝向对方时测量会对双方都有影响。

Q3. 为什么模块没有数据输出?

  各个模块均经过严格的测试后发货,没有数据时请先自行检查模式、接线(供电电压、线序 是否正确,以及推荐使用万用表测试通信双方两端的引脚是否导通)、波特率等配置是否正确; 对于 IIC 输出模式,需要使用主机通过 IIC 通信向设置的从机地址按照手册的通信时序来读取数 据;对于 I/O 输出模式,请参考 I/O 模式相关章节介绍。

Q4. 安装时需要注意什么?

安装时需避免 FOV 角度内有遮挡。另外需要注意与地面高度,应避免 FOV 内出现地面遮挡 等类似反射面,如果安装高度离地面较近,可以考虑将模块稍微倾斜向上进行安装。

Q5. 模块的 UART、IIC 和 I/O 是同一个接口吗?

模块的 UART、IIC、I/O 接口共用相同的物理接口,针对不同的通讯模式转换对应线序即可。

Q6. 切换到 IIC 或 I/O 模式后,为什么 Waveshare TOFAssistant 软件识别不了模块?如何在不同通讯模式间 进行切换?

目前 NAssistant 软件只支持识别 UART 模式下的模块。在 UART 模式下时,可以通过上位机识别成功后进入设置页面将模块配置为 IIC 或 I/O 通讯模式;在 IIC 通讯模式下,可以按照IIC通信协议通过 IIC 通信向模块发送指令来切换回 UART 或 I/O 模式;此外,在没有IIC 测试环境或者切换到 I/O 模式后可以通过以下方式来切换回 UART 模式:
1、用户需要准备一个支持 921600 波特率的 USB 转 TTL 模块(推荐CP2102)并且安装对应的驱动程序,将 USB 转 TTL 模块的 TX、RX、GND 三根线连接到 TOF 模块的对应引脚,VCC引脚暂时先不连接,然后把 USB 转 TTL 模块插入电脑。
2、打开 NAssistant 软件,点击 图标进入串口调试助手,把波特率改为921600,选择USB转 TTL 模块对应的 COM 口然后点击 连接按钮连接 COM 口(大部分情况下会自动连接),在单项发送的文本框内输入 54 20 00 ff 00 ff ff ff ff 00 ff ff 00 10 0e ff ff ff ff ff ff ff ff ff ff ff 00 ff ff ff ff 7c,在右下角的定时发送栏将发送间隔改为 20ms,然后勾选定时发送。
3、此时将 USB 转 TTL 模块的 5V 接到 TOF 模块的 VCC 引脚,模块会切换到UART模式并开始输出数据,此时取消勾选定时发送按钮,然后拔掉 USB 转 TTL 模块重新给模块上电后点击主页面的 识别按钮即可识别模块。
如果切换失败,将 USB 转 TTL 模块拔掉再重复一下整个步骤,切勿在发送命令的情况下多次插拔 VCC 引脚。如果能够正常识别模块但是串口输出数据异常,可以在设置页面中手动更改到 UART 模式。
PS:如果将 TOF 模块的 VCC 引脚接到 USB 转 TTL 模块的 5V 后出现模块一直发送80 00 8000..类似的协议数据的情况,先点击 连接按钮暂时断开 COM 口,把波特率改为115200 然后点击 连接按钮重新连接 COM 口,如果此时串口调试助手的数据为 b3 b1 开头的数据则需要在单项发送的文本框内输入 de ed 00 00 05 04 3b 01 00 00 10 ,单击发送,然后拔掉USB 转TTL模块重新给模块上电后点击主页面的识别按钮即可识别模块。如果重新插上后数据还是b3 b1 开头,重复一下 PS 的步骤。

Q7. 超量程时模块会输出什么数据?

超过 25 米量程时,距离输出固定值 0 米,此时可以参考数据手册的距离状态指示来判断数据是否有效。

Q8. 模块是否支持输出点云信息?

模块单次只能输出一个距离,暂时不支持点云信息的输出。

Q9. 模块使用的串口通信端子型号是什么?飞控、单片机上没有这个端子的接口怎么办?

模块使用的是 GH1.25 的端子。可以自行购买 GH1.25 转其他端子的转接线,或者剪断产 品 附带的 GH1.25-GH1.25 接线,自行焊接其他的端子。线序、供电电压、信号线电平等请参 考数 据手册。

Q10. 接收到的 ad 08 00 如何解算为距离值?

协议帧中的数据是小端模式存储的,而且编码时乘了一定的倍率,举例来说 ad 08 00 先恢复 成 16 进制数据 0x0008ad 换算成 10 进制为 2221,除以 1000 为 2.221 米。

Q11. 校验和是怎么计算的?

校验和就是前面所有的字节相加然后取最低字节的数据,比如 55 01 00 ef 03 的校验和就是 0x55+0x01+0x00+0xef+0x03=0x0148,那校验和就是 48,所以这一帧的完整数据是 55 01 00 ef 03 48。

Q12. 为什么 IIC 模式下无法通信?

IIC 模式下,设备的 SDA 和 SCL 引脚推荐使用开漏模式输出,此时总线上需要有上拉电阻。 通信时需要按照标准的 IIC 通信时序来编写起始、终止、读、写、应答等函数,与 TOF 模块通 信时,参考用户手册的 NLink_TOFSense_IIC_Frame0 协议来对寄存器进行读取和写入。特别要 注意 7 位从机地址的移位与增加读写位发送。

Q13. 打开软件报错“由于找不到 MSVC***.dll 文件……”,可能是电脑缺少微软相应运行时组件,选择系统对应位数下载安装通常即可解决?

Visual C++ Redistributable for Visual Studio 2017,若上述安装失败或者 显示成功但打开TOFAssistant程序仍提示缺少dll文件,则尝试安装 KB2999226 补丁程序,注意,请选择电脑系统对应版本补丁程序,详细请参考博客关于 api-ms-win-crt-runtimel1-1-0.dll 缺失的解决方案

Q14. 打开软件报错“由于找不到Qt***.dll……”?

请检查安装文件是否被360等安全软件无声拦截,请退出安全软件后,重新安装。另外以管理员权限运行

Q15. 物体表面反射率会影响传感器吗?

在实际使用中,传感器的量程和精度可能会受到被测物体的反射率影响。相同环境下,对于不同反射率的被测物体,测量结果可能会有差异。因此,在使用传感器时,建议用户在实际场景中进行充分的测试,若需获取更准确的测量结果则针对具体场景进行校准。建议对比纸板与实际被测物体两种测试数据,根据信号强度进行分析并补偿和优化。

售后