简介
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和树莓派库,可以非常方便的集成到系统中,使用起来更加便捷。
⚠注意事项:
- 本产品只能由合格的专业人员维修,且只能使用原厂备件,以保证产品的性能和安全性。
- 产品本身无极性保护和过电压保护,请使用说明书内容正确接线和供电。
- 产品工作温度为-20℃~60℃,请勿在此温度范围外使用,以免产生风险。
- 产品存储温度为-40℃~85℃,请勿在此温度范围外存储,以免产生风险。
- 请勿打开外壳进行本使用以外的装配或保养,以免影响产品防护性能,造成产品失效。
- 当产品发射与接收透镜被污物覆盖时,会有失效的风险,请保持透镜干净。
- 当产品整体浸入水中时,会有失效的风险,请勿在水下使用产品。
- 当产品在探测高反射率物体,如镜面、光滑地砖时,会有失效的风险。
技术规格
产品性能
- SEN0328测量范围(100m):0.1m-100m@90%反射率,0.1m-40m@10%反射率,0.1m-80m@90%反射率&100Klux,0.1m-30m@10%反射率&100Klux
- SEN0329测量范围(180m):0.1m-180m@90%反射率,0.1m-70m@10%反射率,0.1m-130m@90% 反射率&100Klux,0.1m-50m@10%反射率&100Klux
- 准确度:±10cm(10cm内),1%(10m以外)
- 距离分辨率:1cm
- 帧率:1Hz-1000Hz可调(默认100Hz)
- 抗环境光能力:100Klux
- 重复精度:1σ:<3cm
- 工作温度:-25℃~60℃
- 防护等级:IP67
光学参数
- 光源:LD
- 中心波长:905nm
- 视场角:0.5°
- 人眼安全:CLASS1(EN60825)
电学参数
- 供电电压:5V~24V
- 平均电流:≤150mA@5V,≤80mA@12V,≤50mA@24V
- 功耗:≤0.9W
- 峰值电流:≤180mA
- 通信电平:LVTTL(3.3V)
- 通信接口:UART/CAN/IO
其他
- 尺寸:44mm*43mm*32mm(长*宽*高)
- 壳体材质:铝合金
- 存储温度:-40℃~85℃
- 重量:89g±3g
- 尾线线长:70cm
引脚说明
颜色 | 名称 | 功能描述 |
---|---|---|
红线 | VCC | 供电 |
白线 | CAN_L | CAN总线 |
绿线 | CAN_H | CAN总线 |
空 | / | / |
蓝线 | UART_RXD | 串口接收 |
棕线 | UART_TXD | 串口发送 |
黑线 | GND | 地线 |
⚠注意:
- 本产品接口端子型号为MH1.25-7P,不方便在arduino uno上直接使用,我们匹配了方便在arduino uno上使用的线,传感器自带线和引出线的颜色对应分别为黑-黑、红-红、蓝-蓝、棕-绿。
- 该款传感器支持 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。
- 高低电平可以调节,默认为近距离高电平,远距离低电平;
- 缓冲区间可调(用于防止数据抖动引起的来回跳变);
- 增加高低电平的延时可调功能;
- 触发前的延时可调,假设阈值设定为 10m,且设置距离低于 10m,输出高电平;当距离低于 10m 时,增加一个可调延时(默认为 0ms),经过该延时后距离仍低于 10m,则输出高电平。
- 触发后的延时可调,假设阈值设定为 10m,且设置距离低于 10m,输出高电平;当距离输出高于 10m 后,增加一个可调延时(默认 0ms),经过该延时后距离仍高于 10m,则输出低电平。
举例:
- 将 TF03 改为 IO 高低电平出,指令为:
---5a 05 05 05 69 - 设置距离低于阈值为高电平,距离高于阈值为低电平模式,指令为:
- 5A 05 61 01 C1
- 设置距离从小于阈值变化为大于阈值和距离从大于阈值变化为小于阈值的电平切换的延迟均为 100ms,指令为:
- 5A 08 62 64 00 64 00 8C
- 设置距离阈值 500cm,缓冲区间 5cm,指令为:
- 5A 08 63 F4 01 05 00 BF
- 保存配置,指令为:
- 5A 04 11 6F
- 恢复出厂设置(如有需要),指令为:
- 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、2、…9、
10、20、…90、
100、200…900、
1000、2000…9000、10000; - 使用触发模式时,需要先禁用输出使能,再使用触发指令;
- PIX 格式为“x.yz\r\n”,单位 m。例如测距为 123cm 时输出 1.23,后接“回车+换行”;
- CAN 波特率支持 1M、500K、250K 和 125K 共 4 档。
- “配置 offset”指令,可用于客户二次校准雷达距离,自固件版本 v1.11.3 起支持。
- 请配置合法 CAN ID,对于非法 ID 可能会出现不可预料的结果。
- 要使用 IO 触发功能,需要先设置输出格式配置为 IO 输出,然后通过指令配置 IO 触发电平、输出延时、距离阈值及缓冲距离。
使用教程
此处共列出两种方式,旨在让大家对单点激光测距仪有一个直观的认识。
- Arduino使用方法
- PC上位机调试
- 黑白线检测(巡线检测)
准备
- 硬件
- 1 x DFRduino UNO R3
- 1 x IO 传感器扩展板 V7.1
- 1 x Gravity: I2C LCD1602彩色背光液晶屏(部分项目使用)
- 1 x 7.4V 2500MA 锂电池(带充放电保护板)
- 1 x USB to Serial 转串口
- 若干 杜邦线
- 软件
- Arduino IDE 点击下载Arduino IDE
- DFRobot TF Mini库 点击下载TF Mini库
- DFRobot LCD库文件 点击下载DFRobot_RGBLCD(Github)
Arduino调试方法(PC串口)
鉴于TF mini为串口设备,而普通Arduino只有一个硬件串口,所以推荐使用软串口来配合传感器使用,用户也可以使用多串口设备,诸如Arduino Leonardo,Arduino Mega2560等设备,此处使用最常见的Arduino UNO作为控制器,定义D12和D13为软串口。
Arduino连线图
- 使用PC端的串口软件来显示检测的距离以及对整个系统供电
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](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连接图
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);
}
}
- LCD显示屏上显示下列数据格式
Dis: 05.000 m
Str: 00600
PC上位机显示
除了通过单片机来读取数据外,调试阶段,我们还可以使用PC上位机来读取距离输出。点击此处下载
连接图
将TF Mini通过一个USB转TTL模块连接到电脑上,通过上位机读取数据
上位机数据显示
黑白线检测
TF Mini激光测距雷达是一种光学传感器,但凡光学传感器,对于光的敏感度会比较高。我们可以利用这一特性实现近距离黑白线检测。(注:黑色的反射率低;白色的反射率高;)
我们利用信号强度“Strength”来分辨两种颜色。
接线图
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](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平台使用
准备工作
- 树莓派4B
- 树莓派 IO扩展板
- TF03 (ToF) 激光测距(100m)/TF03 (ToF) 激光测距(180m)
- 连接线一根
Raspberry Pi连接图
示例代码
# -*- 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()
常见问题
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。