(SKU:SEN0328)/(SKU:SEN0329)TF03 (ToF) 激光测距(100m)/TF03 (ToF) 激光测距(180m)

来自DFRobot Product Wiki
跳转至: 导航搜索
TF Mini LiDAR (ToF) 激光测距 (12m)
TFmini Plus激光测距

目录

简介

TF03是我们TF系列第三代产品,作为一款工业级高速测量的激光雷达,我们有量程高达100m和180m的两款供你选择,在继承前两代高性价比与高集成度特点的同时,升级十余项关键指标,开放多项扩展功能,以满足不同应用领域的差异需求。产品尺寸仅为44*42.9*31.8mm,我们一只手就能完全握住它,体积不大但本事不小,可作为测距工具来检测前方障碍物的距离;也可在我们创客爱好者手中成为机器人的眼睛,为机器人的安全避障和路线选择提供距离信息;还可用于无人机定高、汽车防撞、智能交通、物联网安防和工业安全预警等领域。
TF03采用脉冲式的飞行时间法,采用独特的光学系统和信号处理电路设计,使得测距性能提升的同时保持小巧的体积。在量程达到百米以上的同时,盲区控制在0.1m,误差也低至±10cm,探测频率却高达10KHz,还具有100Klux的抗强光参数,雷达本身还内置了雨雪雾环境的补偿算法,使其在全量程内也有优秀表现。
雷达外壳采用铝合金加红外高透玻璃来提高机身整体强度,防护等级可达IP67,能有效抗振动、防冲击、防尘防水,以满足在恶劣环境下的使用。还支持多种接口,包括UART、CAN、IO,以满足不同应用下的需求。同时TF03的输出帧率、波特率、触发模式、超量程阈值等参数可供客户自定义配置,还内置BootLoader功能,方便用户本地升级产品固件。采用标准5V供电,平均功耗仅0.55W,兼容各种Arduino和树莓派控制器,配合DFRobot开发的Arduino和树莓派库,可以非常方便的集成到系统中,使用起来更加便捷。

Warning yellow.png

注意事项:

  • 本产品只能由合格的专业人员维修,且只能使用原厂备件,以保证产品的性能和安全性。
  • 产品本身无极性保护和过电压保护,请使用说明书内容正确接线和供电。
  • 产品工作温度为-20℃~60℃,请勿在此温度范围外使用,以免产生风险。
  • 产品存储温度为-40℃~85℃,请勿在此温度范围外存储,以免产生风险。
  • 请勿打开外壳进行本使用以外的装配或保养,以免影响产品防护性能,造成产品失效。
  • 当产品发射与接收透镜被污物覆盖时,会有失效的风险,请保持透镜干净。
  • 当产品整体浸入水中时,会有失效的风险,请勿在水下使用产品。
  • 当产品在探测高反射率物体,如镜面、光滑地砖时,会有失效的风险。

技术规格

产品性能

  • SEN0328测量范围(180m):0.1m-180m@90%反射率,0.1m-70m@10%反射率,0.1m-130m@90% 反射率&100Klux,0.1m-50m@10%反射率&100Klux
  • SEN0329测量范围(100m):0.1m-100m@90%反射率,0.1m-40m@10%反射率,0.1m-80m@90%反射率&100Klux,0.1m-30m@10%反射率&100Klux
  • 准确度:±10cm(10cm内),1%(10m以外)
  • 距离分辨率:1cm
  • 帧率:1Hz-1000Hz可调(默认100Hz)
  • 抗环境光能力:100Klux
  • 重复精度:1σ:<3cm
  • 工作温度:-25℃~60℃
  • 防护等级:IP67

光学参数

  • 光源:LD
  • 中心波长:905nm
  • 视场角:0.5°
  • 人眼安全:CLASS1(EN60825)

电学参数

  • 供电电压: 5V±0.5V
  • 平均电流:≤180mA
  • 功耗:≤0.9W
  • 峰值电流:≤180mA
  • 通信电平:LVTTL(3.3V)
  • 通信接口:UART/CAN/IO

其他

  • 尺寸:44mm*43mm*32mm(长*宽*高)
  • 壳体材质:铝合金
  • 存储温度:-40℃~85℃
  • 重量:77g±3g
  • 尾线线长:70cm

引脚说明

TFmini Plus
标号 名称 功能描述
红线 VCC 供电
白线 CAN_L CAN总线
绿线 CAN_H CAN总线
蓝线 GPIO IO输出
棕线 TTL_RXD 串口接收
黄线 TTL_TXD 串口发送
黑线 GND 地线
Warning yellow.png

注意:

  • 上述端口介绍为传感器自身端口介绍
  • 本产品接口端子型号为MH1.25-7P,不方便开发者直接使用,我们配备了方便开发者使用的接口为2.54-1P的杜邦线和PH-4P的胶壳,引出线的颜色对应分别为黑-黑、红-红、棕-蓝、黄-绿。
  • 该款传感器支持 TTL 串口和 CAN 两种通信方式,默认为 TTL 串口通信,如有需要,可使用指令修改为 CAN 通信方式,两种通信方式二选一,不能同时输出。


模块通讯协议与数据格式

TF03 标准版本支持 TTL 串口和 CAN 两种通信方式,默认为 TTL 串口通信,如有需要,可使用指令修改为 CAN 通信方式,两种通信方式二选一,不能同时输出。

串口版本

TF03 串口版本采用 UART-LVTTL 接口,输出电平为 LVTTL 电平(0-3.3V),具体通信协议见下表。

TF03串口通信协议
项目 内容
通讯协议 UART
波特率 115200
数据位 8
停止位 1
检验位

串口标准数据格式(UART)

TF03 输出的数据如下表所示,数据均为 16 进制数,每帧数据共计 9 字节,数据包含实测距离信息,即 DIST;其他位为保留位;帧尾为数据校验位

串口数据格式
数据位 定义 说明
Byte0 帧头 0x59
Byte1 帧头 0x59
Byte2 DIST_L DIST低八位
Byte3 DIST_H DIST高八位
Byte4 保留 /
Byte5 保留 /
Byte5 保留 /
Byte6 保留 /
Byte7 保留 /
Byte8 校验 Checksum 的低八位,Checksum = Byte0 + Byte1 + ...+ Byte7

串口 Pixhawk 数据格式

Pixhawk 数据格式即以字符串形式输出,单位为 m,例如测距为 1.21m,则输出字符串 1.21,每个距离值后以换行符结束。串口版本的产品支持通过指令修改为 Pixhawk 模式输出。

高低电平输出

设定某一阈值(该阈值可调),当测量距离低于该阈值时输出高电平/低电平,当测量距离高于该阈值输出低电平/高电平。设置指令详见 4.3.2。
a) 高低电平可以调节,默认为近距离高电平,远距离低电平;
b) 缓冲区间可调(用于防止数据抖动引起的来回跳变);
c) 增加高低电平的延时可调功能;
---触发前的延时可调,假设阈值设定为 10m,且设置距离低于 10m,输出高电平;当距离低于 10m 时,增加一个可调延时(默认为 0ms),经过该延时后距离仍低于 10m,则输出高电平。
---触发后的延时可调,假设阈值设定为 10m,且设置距离低于 10m,输出高电平;当距离输出高于 10m 后,增加一个可调延时(默认 0ms),经过该延时后距离仍高于 10m,则输出低电平。
举例:
a) 将 TF03 改为 IO 高低电平出,指令为:
---5a 05 05 05 69
b) 设置距离低于阈值为高电平,距离高于阈值为低电平模式,指令为:
---5A 05 61 01 C1
c) 设置距离从小于阈值变化为大于阈值和距离从大于阈值变化为小于阈值的电平切换的延迟均为 100ms,指令为:
---5A 08 62 64 00 64 00 8C
d) 设置距离阈值 500cm,缓冲区间 5cm,指令为:
---5A 08 63 F4 01 05 00 BF
e) 保存配置,指令为:
---5A 04 11 6F
f) 恢复出厂设置(如有需要),指令为:
---5A 04 10 6E

CAN总线版本

TF03 的 CAN 通信协议可根据需求进行定制,CAN 波特率可修改,ID 可修改,帧格式可修改。协议内容如下表所示。

TF03的CAN通信协议
项目 内容
通讯协议 CAN
波特率 1M
接收ID 0x3003
发送ID 0x3
检验位 发送帧默认为标准帧,接收帧支持标准帧和扩展帧

CAN 版本的 TF03 数据格式如下表所示,数据均为 16 进制数,每帧数据共计 8 字节,数据包含实测距离信息,即 DIST;其他位为保留位。

CAN 版本数据帧格式
数据位 定义 说明
Byte0 DIST_L DIST 低八位
Byte1 DIST_H DIST 高八位
Byte2 保留 /
Byte3 保留 /
Byte4 保留 /
Byte5 保留 /

自定义参数配置

指令通用格式说明

为了 TF03 可以更灵活的解决您的问题,通过串口进行用户自定义配置产品参数的功能。用户可通过发送相关指令来修改产品的原有参数,如输出数据格式、输出帧率等。参数配置成功后,输入写入配置指令,配置参数会保存在 Flash 中,断电重启无须重新配置。
请根据需求修改产品配置,切勿频繁尝试不相关指令,以免指令发送错误造成不必要的损失;请务必按照本说明书所列指令进行产品配置,切勿发送未声明的指令。
指令格式如下:

字节 byte0 byte1 byte2 byte3~ byteN-2 byteN-1
描述 Head Len ID Payload Check sum

Head:固定为 0x5A
Len:整个指令帧的长度(单位 Byte)
ID:标识每个指令的功能
Payload:参数,在不同指令中有不同的含义和长度
Check sum:前 Len – 1 字节数据和的低 8bit

具体指令

功能 下行 上行 说明 出厂设置
获取固件版本号 5A 04 01 5F 5A 07 01 V1 V2 V3 SU 版本号 V3.V2.V1;SU 为 check sum,下同 /
系统复位 5A 04 02 60 成功:5A 05 02 00 61;失败:超时 1s 无反应 / /
设置输出帧率 5A 06 03 LL HH SU 成功:与下行一样;失败:超时 1s 无反应 / 100fps
输出使能 使能:5A 05 07 01 67;禁用:5A 05 07 00 66 成功:与下行一样;失败:超时 1s 无反应 / 使能
单次触发 5A 04 04 62 数据帧 / /
设置输出格式 5A 05 05 LL SU 成功:与下行一样;失败:超时 1s 无反应 LL:输出格式,如下:00:ASCII 码输出(保留);01:二进制输出;02:PIX 输出;05:I/O 输出 二进制
设置串口波特率 5A 08 06 H1 H2 H3 H4 SU 成功:与下行一样;失败:超时 1s 无反应 波特率 = (H4 << 24)+(H3 << 16)+(H2 << 8)+H1 115200
校验和使能 使能:5A 05 08 01 68;禁用:5A 05 08 00 67 成功:与下行一样;失败:超时 1s 无反应 / 使能
恢复出厂设置 5A 04 10 6E 成功:5A 05 10 00 6F;失败:5A 05 10 ER SU ER 不为 0 的时候为失败 /
保存配置 5A 04 11 6F 成功:5A 05 11 00 70;失败:5A 05 11 ER SU 同上 /
配置超量程值 5A 06 4F LL HH SU 成功:5A 05 4F 00 AE;失败:超时 1s 无反应 超量程值=(HH << 8) + LL,单位 cm 18000
配置 CAN 发送ID 5A 08 50 H1 H2 H3 H4 SU 成功:5A 05 50 00 AF;失败:超时 1s 无反应 ID=(H4 << 24)+(H3 << 16)+(H2 << 8)+H1 0x3
配置 CAN 接收ID 5A 08 51 H1 H2 H3 H4 SU 成功:5A 05 51 00 B0;失败:超时 1s 无反应 ID=(H4 << 24)+(H3 << 16)+(H2 << 8)+H1 0x3003
配置 CAN 波特率 5A 08 52 H1 H2 H3 H4 SU 成功:5A 05 52 00 B1;失败:超时 1s 无反应 Baudrate=(H4 << 24)+(H3 << 16)+(H2 << 8)+H1 1000000
配置 CAN 发送帧类型 标准帧:5A 05 5D 00 BC;扩展帧:5A 05 5D 01 BD 成功:5A 05 5D 00 BC;失败:超时 1s 无反应 / 标准帧
配置传输方式 串口:5A 05 45 01 A5;CAN:5A 05 45 02 A6 成功:5A 05 45 00 A4;失败:超时 1s 无反应 / 串口
使能雨雾算法 使用:5A 05 64 00 C3;禁用:5A 05 64 01 C4 成功:5A 05 64 00 C3;失败:超时 1s 无反应 / 使能
配置 offset 5A 06 69 LL HH SU 成功:5A 05 69 00 C8;失败:超时 1s 无反应 Offset = (HH << 8) + LL,单位 cm 0
设置近距离触发电平 5A 05 61 LV SU 成功:5A 05 61 00 C0;失败:超时 1s 无反应 LV = 0 表示低电平触发;LV = 1 表示高电平触发 低电平
设置 IO 输出延时 5A 08 62 L1 H1 L2 H2 SU 成功:5A 05 62 00 C1;失败:超时 1s 无反应 Delay1 = (H1 << 8) + L1,Delay2 = (H2 << 8) + L2,单位 ms,分别表示近、远距离时,IO 电平变化延时。取值范围 0~65000。 0,0
设置 IO 变化的距离阈值及缓冲距离 5A 08 63 L1 H1 L2 H2 SU 成功:5A 05 63 00 C2;失败:超时 1s 无反应 Dist= (H1 << 8) + L1,Buff=(H2 << 8) + L2,单位 cm,分别表示 IO 变化的距离阈值及缓冲距离。取值范围0~18000。 18000,0

说明:
1) 支持的输出帧率如下:
1、2、…9、
10、20、…90、
100、200…900、
1000、2000…9000、10000;
2) 使用触发模式时,需要先禁用输出使能,再使用触发指令;
3) PIX 格式为“x.yz\r\n”,单位 m。例如测距为 123cm 时输出 1.23,后接“回车+换行”;
4) CAN 波特率支持 1M、500K、250K 和 125K 共 4 档。
5) “配置 offset”指令,可用于客户二次校准雷达距离,自固件版本 v1.11.3 起支持。
6) 请配置合法 CAN ID,对于非法 ID 可能会出现不可预料的结果。
7) 要使用 IO 触发功能,需要先设置输出格式配置为 IO 输出,然后通过指令配置 IO 触发电平、输出延时、距离阈值及缓冲距离。

使用教程

此处共列出两种方式,旨在让大家对单点激光测距仪有一个直观的认识。

  1. Arduino使用方法
  2. PC上位机调试
  3. 黑白线检测(巡线检测)


准备


Arduino调试方法(PC串口)

鉴于TF mini为串口设备,而普通Arduino只有一个硬件串口,所以推荐使用软串口来配合传感器使用,用户也可以使用多串口设备,诸如Arduino Leonardo,Arduino Mega2560等设备,此处使用最常见的Arduino UNO作为控制器,定义D12和D13为软串口。

Arduino连线图

  • 使用PC端的串口软件来显示检测的距离以及对整个系统供电
TF03串口显示接法

Arduino调试代码

  • 需要使用PC串口工具,读到的数据会显示在串口工具界面
/*
  * @File  : DFRobot_TFmini_test.ino
  * @Brief : This example use TFmini to measure distance
  *         With initialization completed, we can get distance value and signal strength
  * @Copyright   [DFRobot](http://www.dfrobot.com), 2016
  *             GNU Lesser General Public License
  *
  * @version  V1.0
  * @date  2018-1-10
*/
  
#include <DFRobot_TFmini.h>

SoftwareSerial mySerial(12, 13); // RX, TX

DFRobot_TFmini  TFmini;
uint16_t distance,strength;

void setup(){
    Serial.begin(115200);
    TFmini.begin(mySerial);
}

void loop(){
    if(TFmini.measure()){                      //Measure Distance and get signal strength
        distance = TFmini.getDistance();       //Get distance data
        strength = TFmini.getStrength();       //Get signal strength data
        Serial.print("Distance = ");
        Serial.print(distance);
        Serial.println("cm");
        Serial.print("Strength = ");
        Serial.println(strength);
        delay(500);
    }
    delay(500);
}
  • 串口软件显示数据格式如下
 Distance = 1000 mm                
 Strength =  688


Arduino LCD距离数值显示

实际应用场景中,传感器一般会在脱机状态下工作,我们特别提供了一个使用案例,使用锂电池供电,用LCD来显示距离测量数据,非常适合室外使用。

Arduino连接图

TF03 LCD显示接法

Arduino测试代码


/*
  * @File  : DFRobot_TFmini_test.ino
  * @Brief : This example use TFmini to measure distance
  *         With initialization completed, we can get distance value and signal strength
  * @Copyright   [DFRobot](http://www.dfrobot.com), 2016
  *             GNU Lesser General Public License
  *
  * @version  V1.0
  * @date  2018-1-10
*/
#include <Wire.h>
#include <DFRobot_RGBLCD.h>         
#include <DFRobot_TFmini.h>            //TF Mini header file

SoftwareSerial mySerial(12, 13);      // RX, TX
DFRobot_TFmini  TFmini;
uint16_t distance,strength;

unsigned int lcd_r = 0, lcd_g = 0, lcd_b = 0;  
unsigned long delaytime = 0, lighttime = 0;
DFRobot_RGBLCD lcd(16, 2); 
void setup()
{lcd.init();  
  delay(5000);
  Serial.begin(115200);
  Serial.println("hello start");

  TFmini.begin(mySerial);
  lighttime = millis();  
  lcd.setCursor(0, 0);
  lcd.print("Dis:");
  lcd.setCursor(0, 1);
  lcd.print("Str:");
  lcd.setRGB(255, 255, 000);
}
void loop() {
  
/******************LCD*******************/
 lcd_r = random(256);  
  delayMicroseconds(10);  
  lcd_g = random(256);  
  delayMicroseconds(10); 
  lcd_b = random(256); 
  if (millis() - lighttime > 3000)  
  {
    lcd.setRGB(lcd_r, lcd_g, lcd_b);  
    lighttime = millis();   
  }
  //delay(100);
  /**************TF Mini***************/
 if(TFmini.measure()){                          //Measure Distance and get signal strength
        distance = TFmini.getDistance();       //Get distance data
        strength = TFmini.getStrength();       //Get signal strength data
 
    lcd.setCursor(5, 0);                       //LCD display
    lcd.print(  distance / 10000);            
    lcd.print(  distance/ 1000 % 10); 
    lcd.print('.');
    lcd.print(  distance / 100 % 10);
    lcd.print(  distance / 10 % 10);
    lcd.print(  distance  % 10);
    lcd.print(" m");
    lcd.setCursor(5, 1);
    lcd.print(strength / 10000); 
    lcd.print(strength / 1000 % 10);
    lcd.print(strength / 100 % 10);
    lcd.print(strength / 10 % 10);
    lcd.print(strength % 10);
    }
}                    
  • LCD显示屏上显示下列数据格式
Dis: 05.000 m
Str: 00600


PC上位机显示

除了通过单片机来读取数据外,调试阶段,我们还可以使用PC上位机来读取距离输出。点击此处下载

连接图

将TF Mini通过一个USB转TTL模块连接到电脑上,通过上位机读取数据

TF03上位机显示接法

上位机数据显示

TF Mini上位机数据显示


黑白线检测

TF Mini激光测距雷达是一种光学传感器,但凡光学传感器,对于光的敏感度会比较高。我们可以利用这一特性实现近距离黑白线检测。(注:黑色的反射率低;白色的反射率高;)
我们利用信号强度“Strength”来分辨两种颜色。

接线图

TF03识别黑白色接法

Arduino代码

  • 注意:代码需与TF Mini库配合使用

/*
  * @File  : DFRobot_TFmini_test.ino
  * @Brief : This example use TFmini to measure distance
  *         With initialization completed, we can get distance value and signal strength
  * @Copyright   [DFRobot](http://www.dfrobot.com), 2016
  *             GNU Lesser General Public License
  *
  * @version  V1.0
  * @date  2018-1-10
*/

#include <DFRobot_TFmini.h>

SoftwareSerial mySerial(12, 13); // RX, TX

DFRobot_TFmini  TFmini;
uint16_t distance,strength;

void setup(){
    Serial.begin(115200);
    TFmini.begin(mySerial);
}

void loop(){
    if(TFmini.measure()){                      //Measure Distance and get signal strength     
        strength = TFmini.getStrength();       //Get signal strength data
        Serial.print("Strength = ");
        Serial.println(strength);  
    }
}    

                              
  • 下载好程序后,在同一距离连续地反复测量黑色和白色纸张,通过串口绘图工具可见信号强度的变化情况
串口绘图


Raspberry Pi平台使用

准备工作

  • 树莓派4B
  • 树莓派 IO扩展板
  • TF03 (ToF) 激光测距(100m)/TF03 (ToF) 激光测距(180m)
  • 连接线一根

Raspberry Pi连接图

Raspberry Pi与TF03连接图

示例代码

下载超声波库文件

# -*- coding:utf-8 -*-

'''
  # DFRobot_TFmini.py
  #
  # Connect board with raspberryPi.
  # Run this demo.
  #
  # Connect TFmini to UART
  # get the distance value
  #
  # Copyright   [DFRobot](http://www.dfrobot.com), 2016
  # Copyright   GNU Lesser General Public License
  #
  # version  V1.0
  # date  2019-8-31
'''

import smbus
import time
import serial

ser = serial.Serial("/dev/ttyAMA0", 115200)
count = ser.inWaiting()

class TFMINI:
    def __init__(self):
        print serial
        if ser.isOpen():
            print("open success")
        else:
            print("open failed")
    
    def measure(self):
        TFbuff = []
        while ser.inWaiting() > 0:
            TFbuff.append(ser.read())
            if(TFbuff[0] == 'Y'):
                TFbuff.append(ser.read())
                if(TFbuff[1] == 'Y'):
                    for i in range(2, 8):
                        TFbuff.append(ord(ser.read()))
                    self.distance = TFbuff[2]+TFbuff[3]*256
                    self.strength = TFbuff[4]+TFbuff[5]*256
                    return True
                else:
                    return False
            else:
                return False
        return False
    
    def getDistance(self):
        return self.distance
    
    def getStrength(self):
        return self.strength

常见问题

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

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。


更多


个人工具
名字空间

变换
操作
导航
工具箱