TF03激光测距 (100m)TF03激光测距 (180m)

简介

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和树莓派库,可以非常方便的集成到系统中,使用起来更加便捷。

⚠注意事项:

技术规格

产品性能

光学参数

电学参数

其他

引脚说明

TFmini Plus

颜色 名称 功能描述
红线 VCC 供电
白线 CAN_L CAN总线
绿线 CAN_H CAN总线
/ /
蓝线 UART_RXD 串口接收
棕线 UART_TXD 串口发送
黑线 GND 地线

⚠注意:

模块通讯协议与数据格式

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。

  1. 高低电平可以调节,默认为近距离高电平,远距离低电平;
  2. 缓冲区间可调(用于防止数据抖动引起的来回跳变);
  3. 增加高低电平的延时可调功能;
    • 触发前的延时可调,假设阈值设定为 10m,且设置距离低于 10m,输出高电平;当距离低于 10m 时,增加一个可调延时(默认为 0ms),经过该延时后距离仍低于 10m,则输出高电平。
    • 触发后的延时可调,假设阈值设定为 10m,且设置距离低于 10m,输出高电平;当距离输出高于 10m 后,增加一个可调延时(默认 0ms),经过该延时后距离仍高于 10m,则输出低电平。

举例:

  1. 将 TF03 改为 IO 高低电平出,指令为: ---5a 05 05 05 69
  2. 设置距离低于阈值为高电平,距离高于阈值为低电平模式,指令为:
    • 5A 05 61 01 C1
  3. 设置距离从小于阈值变化为大于阈值和距离从大于阈值变化为小于阈值的电平切换的延迟均为 100ms,指令为:
    • 5A 08 62 64 00 64 00 8C
  4. 设置距离阈值 500cm,缓冲区间 5cm,指令为:
    • 5A 08 63 F4 01 05 00 BF
  5. 保存配置,指令为:
    • 5A 04 11 6F
  6. 恢复出厂设置(如有需要),指令为:
    • 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连线图

TF03串口显示接法

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](https://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](https://www.dfrobot.com), 2016
  *             GNU Lesser General Public License
  *
  * @version  V1.0
  * @date  2018-1-10
*/
#include <Wire.h>
#include <DFRobot_LCD.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_LCD 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);
    }
}

Dis: 05.000 m
Str: 00600

PC上位机显示

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

连接图

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

TF03上位机显示接法

上位机数据显示

TF Mini上位机数据显示

黑白线检测

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

接线图

TF03识别黑白色接法

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](https://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平台使用

准备工作

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](https://www.dfrobot.com), 2016
    # Copyright   GNU Lesser General Public License
    #
    # version  V1.0
    # date  2019-8-31
'''

import time

from DFRobot_TFmini import TFMINI

mini = TFMINI()


def main():
    while True:
        if mini.measure():
            distance = mini.getDistance()
            strength = mini.getStrength()
            print("Distance = %.d" % distance)
            print("Strength = %.d" % strength)
            time.sleep(0.5)
        time.sleep(0.5)


if __name__ == "__main__":
    main()

常见问题

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

更多