_SKU_SEN0337_TOF_Sense激光测距_5m_ - jimaobian/DFRobotWikiCn GitHub Wiki

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

简介

TOF Sense是一款基于TOF(飞行时间)技术的激光测距传感器,测距范围是1cm-5m,距离分辨率1mm,误差仅为±1.5cm,数据更新频率10Hz;支持15°~27°可调视场角,想看的范围由自己决定;还支持UART和CAN通信,可通过设置选择适合自己的通信方式;支持主动与查询输出数据,让数据获取更加自由。产品尺寸仅为35.58*12*8.05mm,小巧的体积但却蕴含着大大的能量,可作为测距工具进行距离检测;也可作为机器人避障,选择合适的路线行进;还可用于无人机定高、路线规划等领域。 与其它测距传感器不同的一点是,该传感器预留了两个相同的通信接口,可为每个传感器设置ID,将多个传感器串联起来通过一个通信接口即可读取所有传感器的测距信息。

warning_yellow.png
注意事项:

UART接口最多支持级联8 个,CAN接口最多支持级联7个;级联测距下,适合 UART 查询、CAN 查询、CAN 主动输出三种方式。 |

技术规格

  • 工作电压:5V
  • 工作电流:0.06A
  • 通信接口:UART和CAN
    • UART(2 个接口可同时作为 UART 接口,TTL 信号线电平 3.3V。波特率默认为 921600)
    • CAN(2 个接口可同时作为 CAN 接口;波特率默认为 1Mbps)
  • 级联数量:UART接口最多支持级联8 个,CAN接口最多支持级联7个
  • 盲区距离:1cm
  • 典型测距范围:
    • 短距:0.012m~2.16m
    • 中矩:0.012m~3.60m
    • 长距:0.01m~5.00m
  • 典型测距精度:
    • 短距:精度±1.0cm,标准差<0.3cm
    • 中距:精度±1.0cm,标准差<1.5cm
    • 长距:精度±1.5cm,标准差<0.5cm@[0.01,3]m 范围,标准差<8cm@[3,5]m 范围
  • 波长:940nm(符合Class1 标准)
  • 视场角(FOV):15°~27°(多档位可调)
  • 供电电压:3.7V~5.2V(所有通信接口电源都是具备电气连接的,供电接口可以为任意一个接口)
  • 功耗:290mW(UART 主动输出,长距离测距模式下,供电电压 5.0V,电流 58mA)
  • 产品重量:2.7g
  • 尺寸:35.58mm*12mm*8.05mm

引脚说明

| | | | -------------------------------------------- | | | TFmini Plus | |

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

模块描述

使用原理

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

功能总述

TOFSense 支持短、中、长三种距离测量模式,各个测量模式下均可输出距离测量值 dis、距离状态 dis status、信号强度 signal strength 等信息; 输出方式:TOFSense 支持主动输出、查询输出。主动输出即模块自主连续发送测量数据帧,发送频率 10Hz;查询输出即模块收到查询帧后,再输出测量数据帧。 连接方式:TOFSense,支持 UART 与 CAN 输出方式,两种输出方式共用一套物理接口。其中,UART 输出支持单个模块的主动输出、查询输出以及多个级联连接下的查询输出;CAN 输出支持单个模块的主动输出、查询输出以及多个模块级联连接下的主动输出、查询输出。

接口与波特率

TOF Sense标准版本支持 UART 和 CAN 两种通信方式,两种通信方式共用一个接口,出厂默认为 UART 通信,如需使用 CAN 通信模式,通过模块上位机配置即可。

UART通信(串口)模式下

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

UART_Baudrate Note
115200,230400,460800,921600,1000000,1382400,1843200,2000000,2764800,3000000 默认波特率为 921600

CAN通信(控制器局域网络)模式下

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

CAN_Baudrate Note
100K、250K、500K、1M、2M、3M 默认波特率为 1M

Distance Status|距离状态显示

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

Value Note
0 测量距离有效
1 标准差大于15mm
2 信号强度低于1Mcps
4 相位超出界限
5 HW 或 VCSEL 出现故障
7 相位不匹配
8 内部算法下溢
14 测量距离无效

Signal Strength|信号强度

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

FOV|视场角

视场角的大小决定了 TOFSense 的视野范围,模块可以更改 X 方向视场角 fov.x、Y 方向视场角 fov.y、X 方向偏移 fov.x_offset、Y 方向偏移 fov.y_offset。X、Y 方向视场角设置范围 15°~27°,X、Y 方向视场角偏移设置范围-6°~ 6°。

Indicator Light|指示灯

指示灯共两种闪烁状态,快速闪烁 50ms 闪烁一次,慢速闪烁 100ms 闪烁一次。LED 状态与含义如下表所示。

Status Note
快速闪烁(间隔0.1s) 模块启动阶段/模块固件更新
慢速闪烁(间隔1s) 模块正常工作

指令通用格式说明

为了 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 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()

常见问题

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

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

更多

⚠️ **GitHub.com Fallback** ⚠️