傻瓜教程:激光雷达TFmini在单片机上的使用[新星计划]

Posted kasami_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了傻瓜教程:激光雷达TFmini在单片机上的使用[新星计划]相关的知识,希望对你有一定的参考价值。

很多人在买回来激光雷达TFmini模块后却束手无策,有的人不知道怎么接线,有的人不知道怎么获取数据,有的人照着官方文档也得不出结果。本文就官方文档以及个人使用经验总结出TFmini如何在STM32上获取距离等测量数值。

本文要求基础:基本阅读能力,键盘敲打能力,单片机基础知识,C语言基础知识

软件配备:KEIL5,CUBEMX

硬件配备:激光雷达TFmini,任一STM32单片机,杜邦线(最少三根)

TFmini是一款小型激光雷达模块。主要实现实时、无接触式的距离测量功能,具有测量准确、稳定、高速的特点。

1. 测距原理

TFmini基于TOF(Time of Flight)即飞行时间原理。具体为产品周期性地向外发出近红外光调制波,调制波遇事物后反射。产品通过测量调制波往返相位差,得到飞行时间,再计算出产品与被测目标之间的相对距离。

在这里插入图片描述

2. 线序连接

在这里插入图片描述将各引脚对应STM32各引脚连接好即可。可自行延长连接线,为保证数据的有效传输,建议自行焊接的连接线长度不大于1米。

3. 数据输出格式

每个数据包为9Byte。包含距离信息(Dist)、信号强度信息(Strength)、测距档位(Mode)、数据校验字节(CheckSum)等。数据格式为16进制(HEX)。
在这里插入图片描述

4. TFmini在STM32上的使用

  1. STM32初始化配置
    在本例子中我们需要初始化USART1和USART2。
  2. 将激光雷达输出数据信息转化为距离
    因为我们使用的是USART2串口接收数据,所以我们先使能串口2的接收中断。
HAL_UART_Receive_IT(&huart2,uart,1);

然后设置一些需要用到的量值。

int dist=99;
int check;
int count=10000;
int strength;
uint8_t uart[9];
const int HEADER=0X59;

在回调函数中,我们首先判断第一个数据包帧头,再判断第二个数据包帧头。如果都是0x59,则继续接收剩下数据填满数组,并按照协议对收到的数据进行校验,然后就可以计算对应的参数了。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if((int)uart[0]==HEADER)
	{
		HAL_UART_Receive(&huart2,uart+1,1,0xffff);
		if((int)uart[1]==HEADER)
		{
			HAL_UART_Receive(&huart2,uart+2,7,0xffff);
			check=(int)uart[0]+(int)uart[1]+(int)uart[2]+(int)uart[3]+(int)uart[4]+(int)uart[5]+(int)uart[6]+(int)uart[7];
				if((int)uart[8]==(check&0xff))
				{
					dist=(int)uart[2]+(int)uart[3]*256;
					strength=(int)uart[4]+uart[5]*256;
					printf("%d\\r\\n",dist);	
				}
			}				
	}
		else
			uart[0]=0;
		HAL_UART_Receive_IT(&huart2,uart,1);
}

在上面的代码中,我们可以看到我在每一个数组前都加了int类型强制转换。这是由于我们从串口接收的数据都是uint8_t类型,无法直接用来与int判断计算。如果不进行转换,连第一步判断数据包帧头都无法通过。
又由于HAL_UART_Transmit()只能传送uint8_t类型,所以我们想通过上位机来获取距离数据需要重定义printf为串口1输出。

#include "stdio.h"

#ifdef __GNUC__           
    #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
    #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */


PUTCHAR_PROTOTYPE
{
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
}

源码链接:https://github.com/Liangyz2019/TFmini-STM32
源码实现任务:距离小于20cm时,点亮红灯,否则不亮。红灯维持亮的时间超过10秒,点亮绿灯,否则不亮

“本站所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/kasami_/article/details/117266903。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。”

以上是关于傻瓜教程:激光雷达TFmini在单片机上的使用[新星计划]的主要内容,如果未能解决你的问题,请参考以下文章

扫地机器人会否抛弃激光雷达这位原配?

16线激光雷达配置教程

3d激光雷达开发(pcl安装和使用)

华商激光观察|视觉神经网络算法突破之前,激光雷达是高级自动驾驶唯一解决方案

3d激光雷达开发(项目练习)

使用velodyne16线激光雷达跑loam-velodyne