简介

这是一款是基于 TOF (飞行时间)技术的单点激光测距传感器,专为在户外使用量身订做的一款测距模块,有100K LUX抗环境强光的能力,在阳光明媚的晴天使用也不会有任何问题。
测距范围 5cm-15m,距离分辨率 1mm;数据更新频率为 50Hz;FOV 视场角 1-2°;支持 UART、IIC 与 I/O多种通信模式;UART 模式下支持主动与查询输出数据。
模块体积小巧,侧面和底面均预留了标准螺丝孔,方便安装在各种地方,可广泛应用于无人机定高、路线规划,智能小车比赛和交通、工业自动化、高速测量和安全监测等领域。
注:超过15米量程时,在15到约20米范围时误差较大,超过20米最大量程后,距离输出固定值0米。

技术规格

  • 测量范围:5cm~15m
  • 测量分辨率:1mm
  • 测距精度:[0. 05m, 2m]土2cm,std<0. 5cm;(2m, 15m]士2%,std<8cm
  • 视场角(FOV):1~2°
  • 输出方式:UART;I2C;I/O(UART模式下支持主动与查询输出)
  • 刷新频率:50Hz
  • I2C默认从机地址:0x08
  • 波长:750~830nm
  • 抗环境光:100K Lux
  • 供电电压:3.7~5.2V,防反接保护
  • 功耗:610mW
  • 工作温度:-10~60℃
  • 尺寸:22.7x28x13.6mm
  • 重量:7.7g

引脚说明

如果使用UART串口

标号 名称 功能描述
1 VCC 模块主供电电源
2 GND 模块主供电地
3 RX UART 接收数据线
4 TX UART 发送数据线

如果使用I2C

标号 名称 功能描述
1 VCC 模块主供电电源
2 GND 模块主供电地
3 IIC_SDA I2C 通讯数据线
4 IIC_SCL I2C 通讯时钟线

如果使用I/O接口

标号 名称 功能描述
1 VCC 模块主供电电源
2 GND 模块主供电地
3 I/O_H 输出高电平
4 I/O_L 输出低电平

模块描述

使用原理

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

功能总述

模块可以满足多种场景需求,可输出距离测量值 dis、距离状态 dis_status、信号强度 signal_strength、测距精度 range_precision 等信息;
输出方式:在 UART 模式下支持主动输出、查询输出,在 IIC 模式下由主机发送读参数帧来读取从机数据。主动输出即模块自主连续发送测量数据帧,发送频率为 50Hz;查询输出即模块每收到一帧查询帧,将会输出一帧测量数据帧。
连接方式:支持 UART、IIC 和 I/O 输出方式,三种输出方式共用一套物理接口。其中,UART 输出支持单个模块的主动输出、查询输出;IIC 模式支持单个模块的读取和写入参数,I/O 输出模式下,不能输出测距值,可以输出互补电平。

接口与波特率

该模块支持配置为 UART、IIC、I/O 通信方式,出厂默认为 UART 通信,如需使用 其它通信模式,通过模块上位机配置即可。
上位机下载:
64位nassistant_windows_64bit.zip
32位nassistant_windows_32bit.zip
串口驱动 CP210x_Windows_Drivers_v6.7.6.zip

UART通信(串口)模式下

串口通信下,波特率设置范围如下表。

UART_Baudrate Note
115200,230400,460800,921600,1000000,1200000, 1500000,2000000,3000000 默认波特率为 921600

IIC|集成电路总线模式下

IIC 输出模式下,波特率设置范围如下表所示

IIC_Baudrate Note
最高 400K 最高波特率为 400Kbps,由主机决定。

当前模块的 IIC 从机地址。设置范围如下表

IIC_Address Note
0x08~0x77 默认地址为 0x08(7 位地址),从机地址为 0x08+模块 ID,更改模块的 ID 参数即可更改从机地址。ID 设置范围为 0~111,通信时要注意移位和增加读写位,即地址为 0x08 时发送带读写位的字节为 0x10(写)、0x11(读)

Distance Status|距离状态显示

模块可以输出当前距离状态,用户可结合距离状态进行数据处理,具体含义如下表所示。

Value Note
0 测量距离无效
1 测量距离有效

Signal Strength|信号强度

指示当前返回信号的强度,该值越大表明返回信号越强。

Range Precision|测距精度

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

FOV|视场角

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

Mode Switch|模式切换

如果模块处于 UART 模式,可以连接 NAssistant 软件来切换到 IIC 或 I/O 模式。如果模块处于 IIC 模式,需要通过 IIC 通信向模块发送指令来切换回 UART 模式。此外,在没有 IIC 测试环境或者切换到 I/O 模式后可以通过以下方式来切换回 UART 模式:
需要准备一个支持 921600波特率的 USB 转 TTL 模块(推荐 CP2102)并且安装对应的驱动程序,将 USB 转 TTL 模块的TX、RX、GND 三根线连接到 TOF 模块的对应引脚,VCC 引脚暂时先不连接,然后把 USB 转TTL 模块插入电脑,打开我们的 上位机软件,点击图标进入串口调试助手,把波特率改为 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 ff ff ff ff ff 7b,在右下角的定时发送栏将发送间隔改为 20ms,然后勾选定时发送,此时将 USB 转 TTL 模块的 5V 接到 TOF 模块的 VCC 引脚,模块会切换到UART 模式并开始输出数据,此时拔掉 USB 转 TTL 模块重新给模块上电后点击主页面的识别按钮即可识别模块。如果切换失败或者输出的数据异常,可以再重复一下整个步骤。

模块协议解析

示例

此示例均以单模块连续测距为应用场景

UART主动输出模式

协议由 Frame Header(帧头)、Function Mark(功能字)、Data(数据)、Sum Check(校验和)组成。其中 Frame Header、Function Mark 为固定不变的数值;Data 为传输的数据内容,Sum Check 为 Frame Header、Function Mark、Data 相加求和(即前面所有字节相加)后的最低字节。
协议组成:Frame Header + Function Mark + Data + Sum Check

原始数据:57 00 ff 00 9e 8f 00 00 ad 08 00 00 03 00 ff 3a
指令格式如下:

Data Type Length(Bytes) Hex Results
Frame Header uint8 1 57 0x57
Function Mark uint8 1 00 0x00
reserved uint8 1 ... *
id uint8 1 00 0
System_time uint32 4 9c 8f 00 00 36766ms
dis*1000 uint24 3 ad 08 00 2.221m
dis_status uint8 1 00 0
signal_strength uint16 2 03 00 3
range_precision uint8 1 06 6cm
Sum Check uint8 1 41 0x41

特别的,对于 int24 类型,我们需要先转换成 int32 类型,为了保持符号不变,采用左移后
除以 256 的方式。例如对于位置数据,我们采用 int24 表示,乘率为 1000

uint8_t byte[] = {0xe6,0x0e,0x00};//代表十进制数值:3.814
//uint8_t byte[] = {0xec,0xfb,0xff};//代表十进制数值:-1.044
int32_t temp = (int32_t)(byte[0] << 8 | byte[1] << 16 | byte[2] << 24) / 256;
float result = temp/1000.0f;
UART查询输出模式

原始数据:57 10 FF FF 00 FF FF 63
指令格式如下:

Data Type Length(Bytes) Hex Results
Frame Header uint8 1 57 0x57
Function Mark uint8 1 10 0x10
reserved uint16 2 ... *
id uint8 1 00 0
reserved uint16 2 ... *
Sum Check uint8 1 63 0x63
IIC通信模式

从机地址:模块在 IIC 总线中作为从机,默认地址为 0x08(7 位地址),从机地址为 0x08+模块 ID,更改模块的 ID 参数即可更改从机地址。通信时要注意地址移位和增加读写位,即地址为 0x08 时发送带读写位的字节为 0x10(写)、0x11(读)。
寄存器地址:若寄存器中无对应参数则默认输出 0xff。


IIC 通信流程:



使用教程

准备

Arduino调试方法(PC串口)

鉴于该模块为串口设备,而普通Arduino只有一个硬件串口,所以推荐使用多串口设备,诸如Arduino Leonardo,Arduino Mega2560等设备,此处使用Arduino Mega2560作为控制器,使用Serial1进行串口通信。如使用Arduino uno,不建议使用软串口,使用硬串口,下载程序是需先断开设备,程序下载完成后正确接入设备即可在串口监视器查看数据。

Arduino连线图

Arduino调试代码

  • 下载完成后打开串口监视器即可查看相关信息和距离

#define TOF_FRAME_HEADER 0x57                 //Define the frame header for the TOFSense series and TOFSense-F series
#define TOF_FUNCTION_MARK 0x00                //Define the function codes for the TOFSense series and TOFSense-F series

typedef struct {
  unsigned char id;                           //TOF id
  unsigned long system_time;                  //msPower-on time, unit: ms
  float dis;                                  //Output distance, unit: meters
  unsigned char dis_status;                   //Distance status indication of the output
  unsigned int signal_strength;               //Signal strength of the output
  unsigned char range_precision;              //cmReference value for the repeating ranging accuracy of the output, unit: cm
} tof_parameter;

unsigned int count_i,count_j=0;
tof_parameter tof0;
unsigned char check_sum=0;
unsigned char rx_buf[32];

void setup() {
  // put your setup code here, to run once:

  Serial.begin(115200);
  Serial1.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  if(Serial1.available()>0)                   
  {
    if(Serial1.peek() == TOF_FRAME_HEADER)  
    {
      count_i=0;  
      rx_buf[count_i]=Serial1.read(); 
    }
    else
    {
      rx_buf[count_i]=Serial1.read(); 
    }
        
    count_i++;  
    
    if(count_i>15)  
    {
      count_i=0;

      for(count_j=0;count_j<15;count_j++)
      {
        check_sum+=rx_buf[count_j]; 
      }

      if((rx_buf[0] == TOF_FRAME_HEADER)&&(rx_buf[1] == TOF_FUNCTION_MARK)&&(check_sum == rx_buf[15]))  
      {
        tof0.id=rx_buf[3];  
        tof0.system_time=(unsigned long)(((unsigned long)rx_buf[7])<<24|((unsigned long)rx_buf[6])<<16|((unsigned long)rx_buf[5])<<8|(unsigned long)rx_buf[4]);      
        tof0.dis=((float)(((long)(((unsigned long)rx_buf[10]<<24)|((unsigned long)rx_buf[9]<<16)|((unsigned long)rx_buf[8]<<8)))/256))/1000.0;
        tof0.dis_status=rx_buf[11];
        tof0.signal_strength=(unsigned int)(((unsigned int)rx_buf[13]<<8)|(unsigned int)rx_buf[12]);
        tof0.range_precision=rx_buf[14];

      
        Serial.print("id:");
        Serial.println(tof0.id);
        Serial.print("system_time:");
        Serial.println(tof0.system_time);
        Serial.print("dis:");
        Serial.println(tof0.dis);
        Serial.print("dis_status:");
        Serial.println(tof0.dis_status);
        Serial.print("signal_strength:");
        Serial.println(tof0.signal_strength);
        Serial.print("range_precision:");
        Serial.println(tof0.range_precision);
        Serial.println("");
      }
      
    }
    check_sum=0;
  }  
  
}

TOF Sense显示结果

常见问题

(此处添加TOF Sense常见问题解答)