STM32智能小车------TCRT5000循迹

文章目录

  • 一、原理讲解
    • 1.实物图
    • 2.工作原理:
    • 3.接线:
  • 二、软件驱动代码
    • 1.接口定义
    • 2.驱动函数
  • 总结
    • 最终效果


  • ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的普通大学生。
  • ⏩进入正题,最近在做小车,目前已经加入红外避障、超声波测距、红外遥控、红外循迹四个传感器,分别实现遥控切换模式、超声波控制距离、避障、循迹功能。
  • ⏩本次文章说说 循迹功能 的实现。
  • ⏩ 非常感谢大家的阅读,如果有不对的地方欢迎指正

一、原理讲解

1.实物图

STM32智能小车------TCRT5000循迹_第1张图片
这种是单路循迹模块,有四个接口,VCC、GND就不用说了,DO就是它的输出信号,然后AO口(模拟信号输出)。
STM32智能小车------TCRT5000循迹_第2张图片
我们可以看到上面有两个LED,一个是接上VCC、GND通电之后就亮了,另外一个没有遇到黑线就亮,DO口输出一个低电平,遇到黑线就熄灭,同时DO口输出一个高电平。
上面还有一个可以调节的东西,它可以调节红外检测距离。
STM32智能小车------TCRT5000循迹_第3张图片
当然还有一种就是五路循迹模块,这个可以少接几个VCC、GND,然后有五个输出口,也就相当于单个的DO口,然后他没有可调节的东西。我用的是三个单路循迹,别问为什么,问就是五路循迹被我烧了。。。

2.工作原理:

工作电压 3.3V-5V
检测范围:1mm-25mm
输出形式 :数字开关量输出(0 和 1)

TCRT5000 传感器的红外发射二极管不断发射红外线,当发射出的红外
线没有被反射回来或被反射回来但强度不够大时,红外接收管一直处于
关断状态,此时模块的输出端为高电平,指示二极管一直处于熄灭状态;
被检测物体出现在检测范围内时,红外线被反射回来且强度足够大,红
外接收管饱和,此时模块的输出端为低电平,指示二极管被点亮。

3.接线:

1、VCC:接电源正极(3-5V)
2、GND:接电源负极
3、DO:TTL 开关信号输出 (GPIO口)
4、AO:模拟信号输出

二、软件驱动代码

1.接口定义

我选的是PA5,PA4,PA3分别作为左边、中间、右边黑线的检测

#define TRACK_PORT 					GPIOA//选择A端口
#define TRACK_PORT_CLK			    RCC_APB2Periph_GPIOA//端口A时钟

#define TRACK_INFRARED_L2_PIN		GPIO_Pin_5//左传感器对应的引脚
#define TRACK_INFRARED_M_PIN		GPIO_Pin_4//中间传感器对应的引脚
#define TRACK_INFRARED_R2_PIN		GPIO_Pin_3//右传感器对应的引脚

#define TRACK_L PAin(5)
#define TRACK_M PAin(4)
#define TRACK_R PAin(3)

2.驱动函数

GPIO初始化:

void Track_Init(void)//循迹端口初始化
{
	GPIO_InitTypeDef GPIO_InitStructure;//GPIO结构体定义

	RCC_APB2PeriphClockCmd(TRACK_PORT_CLK ,ENABLE);//打开端口时钟
	
	GPIO_InitStructure.GPIO_Pin = TRACK_INFRARED_M_PIN  | TRACK_INFRARED_L2_PIN 
	                              | TRACK_INFRARED_R2_PIN;//配置传感器读取引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//配置为输入上拉模式
	GPIO_Init(TRACK_PORT,&GPIO_InitStructure);//初始化端口
	
}

注意:GPIO模式是上拉输入。
循迹代码编写,这就是根据传感器的不同情况去驱动电机,就可以完成循迹了,是不是很简单()

/********
功  能:小车进入循迹模式,遥控CH键退出循迹模式
形  参:循迹速度
返回值:无
说  明:传感器检测到白线输出0,黑线输出1。。
******/
void Track_Adjust(u16 speed)
{
	const u16 Tsp = 1000;
	u8 key = 0;
	Set_Pwm(0,0);
	while(key!=98)
	{
		//中间有黑线/没有黑线
		if((TRACK_L == 0&& TRACK_M == 1&& TRACK_R == 0)||(TRACK_L == 0&& TRACK_M == 0&& TRACK_R == 0))
		{
			Set_Pwm(speed,speed);
		}
		//右边有黑线
		else if((TRACK_L == 0&& TRACK_M == 0&& TRACK_R == 1)||(TRACK_L == 0&& TRACK_M == 1 && TRACK_R == 1))
		{
			Set_Pwm(speed+Tsp,speed-Tsp);
		}
		//左边有黑线
		else if((TRACK_L == 1&& TRACK_M == 0&& TRACK_R == 0)||(TRACK_L ==1&& TRACK_M == 1 && TRACK_R == 0))
		{
			Set_Pwm(speed-Tsp,speed+Tsp);
		}
		//不可能出现的情况
		else if((TRACK_L == 1&& TRACK_M == 0&& TRACK_R == 1)||(TRACK_L == 1&& TRACK_M == 1&& TRACK_R == 1))
		{
			
		}
		key=Remote_Scan();
	}
}

我的循迹速度是2000,然后这个重点就是转弯的速度调整,这个可以根据实际的情况设置调整,然后最后完成循迹。
然后其中有红外遥控的代码,之后会补充这篇专门讲解红外遥控的博文。(今天就肝)

总结

最终效果

稍后奉上视频(狗头保命)

你见过会说话的小车吗

本文仅仅简单介绍了红外循迹模块的原理和驱动代码的编写,这样就完成了智能小车的循迹功能,后面还会有手势识别传感器、红外遥控等等,去实现更多的功能,感谢阅读,如果觉得我的文章对你有帮助的话,就点个赞吧!爱了爱了()

你可能感兴趣的:(智能小车,stm32,单片机,arm,嵌入式硬件)