Benewake(北醒) TF-LC02 (TTL) 雷达不使用TTL转USB转接板在Arduino Uno上的运用

news2024/12/29 10:37:15

目录

  • 前言
  • Benewake(北醒) TF-LC02产品简要说明
  • Arduino开发板介绍
  • Benewake(北醒) TF-LC02 接口及通讯协议说明
    • 接口定义
    • 串口协议说明
    • 通讯协议说明
    • 功能码说明
  • 接线示意图
  • 例程说明
    • 配置软硬串口
    • 定义获取TOF数据的结构
    • 获取雷达距离数据的协议解析
    • 通过主循环发送获取距离指令,并打印结果(可根据需求打印结果)
    • 打印通用Ascii 码结果
  • 完整例程分析

前言

本例程仅用作参考

Benewake(北醒) TF-LC02产品简要说明

性能参数
在这里插入图片描述产品图片及尺寸
在这里插入图片描述

Arduino开发板介绍

参考链接:常用Arduino板介绍

Benewake(北醒) TF-LC02 接口及通讯协议说明

接口定义

在这里插入图片描述

串口协议说明

在这里插入图片描述在这里插入图片描述

通讯协议说明

在这里插入图片描述

功能码说明

在这里插入图片描述在这里插入图片描述

接线示意图

在这里插入图片描述
:线路颜色仅供参考,具体参照实际线路颜色定义

例程说明

配置软硬串口

  • 引入软串口连接雷达,用硬串口来打印雷达收到并处理后的数据
#include <SoftwareSerial.h>        //软串口头文件
SoftwareSerial Port_Debug(2, 3);   //定义软件口名称和PIN2为RX PIN3为TX
void setup() {
/********************************
-  TOF串口协议:TTL
-  波特率:115200
-  数据位:8
-  停止位:1
-  奇偶校验:无
-  流控:无
**************************************/
 Serial.begin(115200);       //通过硬件串口来获取实时性要求比较高的雷达数据,软串口容易出现掉帧的情况   
 Port_Debug.begin(115200);
}

定义获取TOF数据的结构

  • 设置获取距离的指令
u8 cmd[5] = {0x55, 0xAA, 0x81, 0x00, 0xFA};  //获取距离指令
typedef struct {
 int distance;
 u8 ErrorCode; //TOF错误码请参考使用说明书
 boolean receiveComplete;
} TF;
TF Lidar = {0,0,false};

获取雷达距离数据的协议解析

/***************************************
 -  通讯协议:
 -  2 byte : 帧头 0x55 0xAA
 -  1 byte : 功能码 (详细参考使用说明) 例:0x81 获取距离值 单位:mm
 -  1 byte : 后面参数的长度
 -  N byte : 设定参数
 -  1 byte : 帧尾 0xFA
 -  ***************************************
 -  例:获取距离值
 -  Arduino 发送:55 AA 81 00 FA
 -  TOF模组回复 : 55 AA 81 03 01 55 00 FA
 **************************************/
void getLidarData(TF* lidar) {
  static char i = 0;
  static int rx[8];
  while (Port_Debug.available())
  {
    rx[i] = Port_Debug.read();
    if (rx[0] != 0x55)
    {
      i = 0;
    } else if (i == 1 && rx[1] != 0xAA)
    {
      i = 0;
    } else if (i == 7)
    {
      i = 0;
      if (rx[7] == 0xFA)
      {
        lidar->distance = rx[5] + rx[4] * 256;
        lidar->ErrorCode  = rx[6];
        lidar->receiveComplete = true;
      }
    } else
    {
      i++;
    }
  }
}

通过主循环发送获取距离指令,并打印结果(可根据需求打印结果)

void loop() {
  getLidarData(&Lidar);
  if (!Lidar.receiveComplete)
  {
    Port_Debug.write(cmd, 5);
  } else
  {
    Port_Print_Ascii(&Lidar);          // Ascii 打印输出结果
    //Port_Print_Benewake_9Byte(&Lidar);   // 北醒通用9Byte打印
    Lidar.receiveComplete = false;
    delay(33);                       //延时33ms,雷达探测速率最快33ms
  }
}

打印通用Ascii 码结果

void Port_Print_Ascii(TF* lidar)
{
  Serial.print("Dist = ");
  Serial.println(lidar->distance);
  if(lidar->ErrorCode)
  {
    Serial.print("ErrorCode = ");
    Serial.println(lidar->ErrorCode,HEX);
  }
}

串口助手显示

在这里插入图片描述

完整例程分析

#include <SoftwareSerial.h>        //软串口头文件

SoftwareSerial Port_Debug(2, 3);   //定义软件口名称和PIN2为RX PIN3为TX

u8 cmd[5] = {0x55, 0xAA, 0x81, 0x00, 0xFA};  //获取距离指令

typedef struct {
  int distance;
  u8 ErrorCode; //TOF错误码请参考使用说明书
  boolean receiveComplete;
} TF;
TF Lidar = {0,0,false};

void getLidarData(TF* lidar) {
  static char i = 0;
  static int rx[8];
  while (Port_Debug.available())
  {
    rx[i] = Port_Debug.read();
    if (rx[0] != 0x55)
    {
      i = 0;
    } else if (i == 1 && rx[1] != 0xAA)
    {
      i = 0;
    } else if (i == 7)
    {
      i = 0;
      if (rx[7] == 0xFA)
      {
        lidar->distance = rx[5] + rx[4] * 256;
        lidar->ErrorCode  = rx[6];
        lidar->receiveComplete = true;
      }
    } else
    {
      i++;
    }
  }
}

void setup() {
  Serial.begin(115200);       //通过硬件串口来获取实时性要求比较高的雷达数据,软串口容易出现掉帧的情况   
  Port_Debug.begin(115200);
}

void loop() {
  getLidarData(&Lidar);
  if (!Lidar.receiveComplete)
  {
    Port_Debug.write(cmd, 5);
  } else
  {
    Port_Print_Ascii(&Lidar);          // Ascii 打印输出结果
    //Port_Print_Benewake_9Byte(&Lidar);   // 北醒通用9Byte打印
    Lidar.receiveComplete = false;
    delay(33);                       //延时33ms,雷达探测速率最快33ms
  }
}
void Port_Print_Ascii(TF* lidar)
{
  Serial.print("Dist = ");
  Serial.println(lidar->distance);
  if(lidar->ErrorCode)
  {
    Serial.print("ErrorCode = ");
    Serial.println(lidar->ErrorCode,HEX);
  }
}

void Port_Print_Benewake_9Byte(TF* lidar)
{
  u8 i = 0;
  u8 CheckSum = 0;
  u8 B_9Byte[9];
  B_9Byte[0] = 0x59;
  B_9Byte[1] = 0x59;
  B_9Byte[2] = lidar->distance & 0xFF;
  B_9Byte[3] = lidar->distance >> 8;
  B_9Byte[4] = 0x00;
  B_9Byte[5] = 0x00;
  B_9Byte[6] = 0x00;
  B_9Byte[7] = 0x00;
  for(i=0;i<7;i++){
    CheckSum += B_9Byte[i];
  }
  B_9Byte[8] = CheckSum & 0xFF;
  Port_Debug.write(B_9Byte,9);
}

//void serialEvent() {
 // getLidarData(&Lidar);
//}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/661905.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信号AWGN噪声添加及SNR计算(matlab完整代码)

SNR&#xff08;Signal-to-Noise Ratio&#xff0c;信噪比&#xff09;是与信号质量相关的重要指标。它衡量了信号与噪声之间的相对强度&#xff0c;在计算 SNR之前&#xff0c;通常需要进行校准和对齐&#xff0c;以确保接收到的信号与理想信号具有相同的参考点和相位&#xf…

第三方库介绍——zlib库

文章目录 zlib1. zlib库介绍2. zlib库的应用3. 下载地址4. 函数使用教程4.1 compress 与 uncompress4.3 使用过程解析4.2 infate、deflate、z_stream 5. 交叉编译zlib库 zlib 1. zlib库介绍 zlib是一套通用的解压缩开源库&#xff0c;提供了内存&#xff08;in-memory&#x…

SpringBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表

SpringBoot对接kafka,批量、并发、异步获取消息,并动态、批量插入库表 更多优秀文章&#xff0c;请扫码关注个人微信公众号或搜索“程序猿小杨”添加。 一、背景 因业务发展需要&#xff0c;需要对接kafka&#xff0c;快速批量接收消息日志&#xff0c;避免消息日志累积过多&a…

客服岗位必备的在线工具:内部知识库

随着互联网的快速发展&#xff0c;越来越多的企业开始将客户服务转移到在线平台上&#xff0c;以便更好地满足客户需求。在线客服是这一趋势中的重要组成部分&#xff0c;它不仅能够提高客户满意度&#xff0c;还能够提高客户忠诚度和品牌形象。但是在进行在线客服工作时&#…

Vault从入门到精通系列之一:深入了解安全工具Vault、Vault根令牌和解封密钥,详细整理部署Vault的详细步骤

Vault从入门到精通系列之一&#xff1a;深入了解安全工具Vault、Vault根令牌和解封密钥&#xff0c;详细整理部署Vault的详细步骤 一、深入了解安全工具Vault二、Vault根令牌和解封密钥的含义和作用三、centos7上部署和启动Vault的流程四、vault下载地址五、安装vault六、启动V…

爬虫程序采集网络数据

目录 一、Xampp搭建本地网站 二、认识Html标签 三、爬虫程序范例 &#xff08;一&#xff09;调用模块 &#xff08;二&#xff09;加载需要爬虫的网址 &#xff08;三&#xff09;爬取内容选取 &#xff08;四&#xff09;爬取内容保存 &#xff08;五&#xff09; 完整爬…

【MySQL】不就是多表查询

前言 嗨&#xff01;小伙伴们大家好呀&#xff0c;忙碌的一周就要开始&#xff01;在此之前我们学习的MySQL数据库的各种操作都是在一张表之中&#xff0c;今天我们学习要对多张表进行相关操作&#xff0c;相比较于单一的表来说&#xff0c;多张表操作相对复杂一些&#xff0c;…

GaussDB云数据库SQL应用系列—分区表管理

目录 前言 一、分区表基本原理 二、分区表主要优势 三、分区表常见场景 四、GaussDB分区表管理&#xff08;示例&#xff09; 示例一&#xff1a;创建范围分区表(RANGE) 示例二&#xff1a;创建哈希分区表&#xff08;HASH&#xff09; 示例三&#xff1a;创建列表分区…

Python基础(8)——转换数据类型

Python基础&#xff08;8&#xff09;——转换数据类型 文章目录 Python基础&#xff08;8&#xff09;——转换数据类型目标一. 转换数据类型的作用二. 转换数据类型的函数三. 快速体验四. 实验总结 目标 数据类型转换的必要性数据类型转换常用方法 一. 转换数据类型的作用 …

【数据库原理与实践】DS系的期末考题(2023)

前排感谢 感谢在数据库期末考试中进行截图保存题目的大数据同学,给隔壁计算机同学一些小安慰呜呜 选择题 由于顺序其实无关紧要,这里遂不再按题号进行整理 答案仅是本人初步作答,可能存在错误,欢迎指出 8:B 数据的定义:数据库中存储的基本对象 9:ABC 数据库系统DBS组…

神经网络中的损失函数

在《神经网络中常见的激活函数》一文中对激活函数进行了回顾&#xff0c;下图是激活函数的一个子集—— 而在神经网络领域中的另一类重要的函数就是损失函数&#xff0c;那么&#xff0c;什么是损失函数呢&#xff1f; 损失函数是将随机事件或其有关随机变量的取值映射为非负实…

网络安全学术顶会——CCS '22 议题清单、摘要与总结(上)

注意&#xff1a;本文由GPT4与Claude联合生成。 按语&#xff1a;ChatGPT在计算机领域的翻译质量还是欠缺一些&#xff0c;翻译出来的中文有的不够自然&#xff0c;经常完全按照英文的表达方式来&#xff0c;导致中文特别长&#xff0c;很绕。GPT4的翻译效果相对ChatGPT效果要好…

第38步 深度学习图像识别:VGG19建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;预训练模型和迁移学习 预训练模型就像是一个精心制作的省力工具&#xff0c;它是在大量的数据上进行训练&#xff0c;然后将学习到的模型参数保存下来。然后&#xff0c;我们可以直接使用这些参数&#xff0…

gitlab_ci.yml展示单元测试报告 (FREE)

CI/CD 流水线通常包含验证您的代码的测试作业。 如果测试失败&#xff0c;流水线将失败并通知用户。处理合并请求的人必须检查作业日志并查看测试失败的地方&#xff0c;以便可以修复它们。 您可以将作业配置为使用单元测试报告&#xff0c;极狐GitLab 会显示有关合并请求的报…

一种实现Spring动态数据源切换的方法 | 京东云技术团队

1 目标 不在现有查询代码逻辑上做任何改动&#xff0c;实现dao维度的数据源切换&#xff08;即表维度&#xff09; 2 使用场景 节约bdp的集群资源。接入新的宽表时&#xff0c;通常uat验证后就会停止集群释放资源&#xff0c;在对应的查询服务器uat环境时需要查询的是生产库…

SegNeXt:重新思考语义分割中卷积注意力设计

论文链接&#xff1a;https://arxiv.org/abs/2209.08575 github&#xff1a; https://github.com/Visual-Attention-Network/SegNeXt 参考视频&#xff1a;【翻译成中文带你读】SegNext论文逐行精读&#xff0c;30分钟就能快速了解其奥秘&#xff01;-人工智能/深度学习/计算…

Triton教程---存储代理

Triton教程—存储代理 存储库代理使用在加载或卸载模型时运行的新功能扩展了 Triton。 您可以在加载模型时引入自己的代码来执行身份验证、解密、转换或类似操作。 测试版&#xff1a;存储库代理 API 是测试版质量&#xff0c;并且会针对一个或多个版本进行非向后兼容的更改。…

牛客网 2023 最新 “Java 面试八股文+各大厂的面试真题“出炉,面面俱到,太全了

一转眼 2023 年已经过了大半了&#xff0c;不知道你金三银四上岸了&#xff0c;还是等着秋招呢&#xff1f;大家从 Boss 直聘上或者其他招聘网站上都可以看到 Java 岗位众多&#xff0c;Java 岗位的招聘薪酬天差地别&#xff0c;人才要求也是五花八门。而很多 Java 工程师求职过…

css3 grid 布局

特别声明&#xff1a;这篇博客转载于阮一峰老师&#xff0c;转载是为了方便日后复习&#xff0c;实在写的太棒了。 目录 一、概述 二、基本概念 2.1 容器和项目 2.2 行和列 2.3 单元格 2.4 网格线 三、容器属性 3.1 display 属性 3.2grid-template-columns 属性&#x…

[Studio3T]无限试用

新建文本文件 echo off ECHO 重置Studio 3T的使用日期...... REG DELETE "HKEY_CURRENT_USER\Software\JavaSoft\Prefs\3t\mongochef\enterprise" /f RMDIR /s /q %USERPROFILE%\.3T\studio-3t\soduz3vqhnnja46uvu3szq-- RMDIR /s /q %USERPROFILE%\.3T\studio-3t\L…