资讯详情

红外循迹传感器PID循迹算法

红外传感器PID循迹算法

前段时间参加了一场小车跟踪赛,取得了不错的成绩,所以想把核心部分放在这里PID与大家分享寻线算法。

关于物理视频我上传到B站,你可以点击查看:汽车双向PID循迹视频 两轮差速PID红外跟踪视频 红外循环模块的视频演示:红外循环模块使用演示视频

如果您想购买产品,可以点击我的淘宝链接:汽车驱动板链接

红外循环模块链接:三路PID实物链接红外循环模块

百度云数据链接红外循环模块:三路PID红外循环模块数据链 提取码:bh0w

跟踪小车程序下载链接:开源程序下载链接

复制此内容后,打开百度网盘手机App,操作更方便 (该程序在汽车前后安装了两个具有双向跟踪功能的红外跟踪模块,将根据到达终点的距离调整汽车速度,并可进行三级调速。该程序赢得了软银杯机器人赛车组的冠军,这也是一个小游戏。作者的水平有限,只是想与您分享经验,如果需要,可以下载)

?

三路pid视频讲解红外循迹模块原理:三路pid红外循迹模块原理视频讲解

三路pid红外循环模块参数配置视频解释:三路pid红外循迹模块参数配置视频解释

如图1所示,红外传感器1所示:

图1 红外传感器原理

图1 红外传感器原理

?红外二极管发射红外光,接收反射红外光信号。不同的颜色有不同的反射效果。如果红外光照射在黑色物体上,由于黑色物体对光的吸收能力强,反射的光很少。但在白色物体上,由于白色物体对光的吸收能力较弱,反射光较多。因此,当红外二极管发出的光照射在不同颜色的物体上时,接收管接收到的红外光强度也不同,从而判断前面物体的颜色。

图2 赛道

?红外跟踪是基于这一原则,红外模块安装在汽车上,然后在轨道上粘贴黑色胶带,当检测到黑色时,汽车在黑线上,检测到白色是汽车偏离黑线,需要靠近黑线,轨道如图2所示。市场上大多数红外循环传感器采用数字,即通过电压比较将红外接收管接收到的模拟信号转换为0和1的数值信号。如果采用这种方法找到线路,至少需要两个红外传感器固定在黑线两侧。当左红外传感器检测到偏离黑线时,向右偏移,当右红外传感器检测到偏离黑线时,向左偏移。确实可以找线,但是找线效果相当差,所以找线有以下缺点: ①寻线精度差 ②容易偏离轨迹 ③寻线速度慢 ?但也有优点,优点是程序简单。市场上也有五路和七路,但效果会好一点。事实上,这种将模拟量转化为数字量的方法本身将高精度传感器转化为低精度。因为红外接收管信号的采集是通过AD采集,如果是10位AD精度位1024,采用STM32F103C8T6的话有12位AD,4096采集精度。但是这种采集精度高的处理方法比较好,但是处理过程比较麻烦。一般思路是单片机通过内部AD收集循迹传感器的模拟量,然后通过PID舵机角度的参数控制。 ?下面我想介绍的红外循环模块是直接通过单片机内部的AD根据数据收集红外循迹传感器数据PID动态调整舵机角度的方法。红外循环模块如图3所示,电路原理图如图4所示。

图3 三路红外循迹传感器实物图

图4 跟踪模块电路原理图

?其中三个红外管的功能不同,左右两个红外管的作用是判断传感器离黑线边界的距离,获取的AD值越大,离黑线越远,舵机需要旋转的角度越大。中间红外管的功能是判断传感器是否在黑线中。我将用曲线图向您表示原理,以便您理解。图5位循环模块安装图。

图5 跟踪传感器安装图

?将跟踪传感器固定在汽车上,传感器离轨的高度为3cm假设左两个红外传感器之间的距离与轨道黑线的宽度相同cm,从左到右移动传感器获得的图像如图6所示:

图6 左右传感器向左移动图像

?如图7所示,右传感器值减去左传感器值。

图7 左右传感器相减数据集成图

?此时获得的数据的有效长度只有3cm在黑线轨道内,当数据为0时,表示车辆跟踪方向没有偏差,大于0表示车辆向左偏差,小于0表示车辆向右偏差,值越大,偏差越大。但由于数据的有效长度只有3个cm当汽车速度快时,很容易冲出有效跟踪黑线的范围。同时,我们也注意到有效长度的左右数据没有使用。我可以尝试将左两段无用数据纳入有效处理数据。

图8 根据中传感器获得左右阈值

?如上图8所示,我们可以通过中间红外传感器获得。当中间传感器小于阈值时,通过判断左右两个红外传感器的相减值来处理左右两侧的数据,数据翻转将斜率变为原来的两倍。最终效果图如下所示,最终宽度约为原来的3倍,9倍cm。即使传感器完全偏离黑线,最终也会回来,处理后的效果如图9所示。

图9 最终数据处理效果

?图10显示了模块从左到右移动后三个红外对管的数据和集成后的数据输出。由于手动移动,数据波动有点大。

图10 matlab绘制PID实际输出效果图

?综上所述,最终效果需要通过这些步骤来实现: (1)确定左右传感器的差值(D_AD_VALUE): 确定方法:将传感器放在白纸上,通过串口将左右传感器的数据发送到电脑上,获得左右传感器的差值,D_AD_VALUE=Left_AD-Right_AD。 (2)确定左传感器的峰值点(LEFT_MAX)右传感器峰值点(RIGHT_MAX): 确定方法:从左到右移动左红外传感器和右红外传感器,通过串口将数据发送到计算机,观察数据以获得最大值。一般来说,当传感器移动到黑线中间时,获得最大值。 (3)确定左阈值点(LEFT_THREASH)和右阈值点(RIGHT_THREASH): 确定方法:当左传感器达到峰值时,观察中间红外传感器值,中间红外传感器值为左阈值。当右传感器达到峰值时,观察中间红外传感器值,中间红外传感器值为右阈值。 (4)数据整合: ①获得中间传感器AD当数值在左阈值点和右阈值点之间时,将获得左传感 器数据(Left_AD)右传感器数据(Right_AD)相减加上左右传感器的差异 Data_Out=(Left_AD-Right_AD D_AD_VALUE)。 ②当①数据大于零(DATA_OUT>中间传感器获得的数据小于左阈 值时(Mid_AD<LEFT_THREASH), Data_Out=(2*LEFT_MAX-Left_AD)2 ③当①数据大于零(DATA_OUT>中间传感器数据获得的数据小于左阈 值时(Mid_AD<RIGHT_THREASH), Data_Out=(2RIGHT_MAX-RIGHT_AD)*2

综上所述换成用C语言形式写即为:

// //返回值:nt类型,范围循迹传感器数据,根据此值来调节小车舵机角度
int GetTraceDate()
{
	int Data_Out;//定义数据输出变量
	int Left_AD,Right_AD,Mid_AD;//定义左右中传感器AD值变量
	Left_AD=Get_Adc(2);
 	Mid_AD=Get_Adc(3);
	Right_AD=Get_Adc(4);
	Data_Out=(Left_AD-Right_AD+D_AD_VALUE);
	if((Data_Out>0)&&(Mid_AD<LEFT_THERSH))
	{	
		Data_Out=(2*LEFT_MAX-Left_AD)*2;
	} 
	else if((Data_Out<0)&&(Mid_AD<RIGHT_THERSH))
	{
		Data_Out=(Right_AD-2*RIGHT_MAX)*2;
	}
	return Data_Out;
}

注意:这是最理想情况下的调节步骤,在调试时需要根据自己的模块安装位置和黑线宽度调节一些参数,但大致调试步骤就是这样,关于详细的调节步骤和细节方面可以参考我发布到B站上的视频教程。

如果大家感觉配置麻烦的话我做了一款一键配置的循迹模块,配置简单,串口直接输出数据,使用于1-4cm线宽,如果大家感兴趣的话可以查看此篇博客有详细介绍:串口直输型循迹传感器。

标签: 轮速传感器传感头传感器固定阈值红外慢反射传感器红外线反射式传感器输出的量红外电红外传感器022红外传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台