STM32循迹避障小车制作代码详解(简单实现版)

16 篇文章 9 订阅
15 篇文章 6 订阅

感谢几年来大家的支持,看到大家对工程的呼声很高,所以来把工程上传了,大家自行下载即可哈,谢谢大家支持

这个代码是进阶版的,就是可以跑的很快的,和上面博客的主要区别就是这个代码的避障机制并不是做在主main函数里的,是通过外部流程来传参给CPU的,节省了CPU的占用率,因此可以跑很快的。如果有问题代码细节可以私信讨论喔,如果我看到有时间的话也会和大家积极交流的。

如果你是XD的,哈哈哈哈哈,代码直接可用,把线连接好就行啦!~~~~如果没啥变化的话!!!~~~四轮和自由轮很像,稍加修改就可以完成,相信大家可以的

代码链接:   循迹避障小车进阶版代码           ||             https://download.csdn.net/download/VCA821/13203358

 

 

写在最前:最近由于需要制作了一个循迹避障小车,制作比较简单但是还是出现了很多bug,因此在博客中记录一下,希望对后期需要制作的能有所帮助,小车由PWM信号+L293D驱动。(二轮驱动,第三轮为自由轮)

要求:小车要求循迹避障,有两种避障策略,在循迹黑线上遇到障碍物停车,循迹黑线外遇到障碍物要避障(左转,右转,后退均可),循迹过程中要求不能出黑线之外。

循迹原理:(红外探头+信号处理板)

红外探头板
信号处理板

       我们在车头前加有3个红外探头板,分别在左中右三个位置,循迹原理很简单代码也十分容易理解好写,红外探头在光滑地板上会收到发射出去后反射的红外信号,如果探头在黑线上,则无法收到(黑线吸收红外光),当探头收到时,对应的信号调整板对应位置的led会亮,同时TTL输出端会给一个低电平,相反当某个探头在黑线上,对应位置led会灭,TTL输出端会给一个高电平,因此通过这种方式我们就知道任意一个探头是否在线上。

       因此我们举个例子,两边灯亮,中间灯灭,说明小车前端中间探头在线上,这时候是正向,因此我们在代码中要求小车直行,若左灯灭,中间灯和右灯都亮,说明左探头在线上,小车现在是斜向右方,因此我们需要小车左转来实现方向回正,下面配个图来说明例子(途中只有左右两个探头,但不影响理解)

  若仅仅实现循迹,代码要求就十分简单了(这里我们不再说小车前进等代码,只说明策略)

 当左灯灭,TTL给1,车身右斜,循环左转至中间灯灭两边灯亮(即正向)后直行,否则就一直摆正,右向同样如此。

/***LED_1,LED_2,LED_3分别对应左中右三个红外探头***/

 
if(LED_1==1&&LED_3==0)   //左方黑线亮,左转直到正向 
{
   while(1)
   {				
     CarLeft();
     if(LED_1==0&&LED_3==0&&LED_2==1)
     break;
   }
}


else if(LED_1==0&&LED_3==1)   右方黑线亮,右转直到正向
{
   while(1)
   {
     CarRight();
     if(LED_1==0&&LED_3==0&&LED_2==1)
     break;
   }
}

else	CarGo();	

避障原理:(超声波探头)

驱动代码是我直接从网上复制,借鉴的代码,在此附上链接,讲解非常详细,感谢作者。

探头驱动:基于stm32和HC-SR04超声波测距驱动

但是笔者在使用驱动中也遇到了只收到一个非常小的数,即使已经按照上面链接中的要求更正,但还是收到一个非常小的数字,对此笔者对其测距代码进行了小小改动,对定时器测距进行小延时,去除小值数据,请对比上述链接中代码~在中间加了一个Delay_Us(10);问题解决。其实笔者试过,Delay_Us(1);同样可以解决问题。

float Hcsr04GetLength(void )

{

		u32 t = 0;

		int i = 0;

		float lengthTemp = 0;

		float sum = 0;

		while(i!=5)

	{

		//TRIG_Send = 1;      //发送口高电平输出
		GPIO_SetBits(GPIOA, GPIO_Pin_5);	// Alias

		Delay_Us(15);

		//TRIG_Send = 0;
		GPIO_ResetBits(GPIOA, GPIO_Pin_5);	// Alias

		//while(ECHO_Reci == 0);      //等待接收口高电平输出
		while(0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))
			OpenTimerForHc();        //打开定时器

			i = i + 1;

			//while(ECHO_Reci == 1);
			while(1 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))
			


                        Delay_Us(10);    //延时,去除小数值
		
			


                        CloseTimerForHc();        //关闭定时器

			t = GetEchoTimer();        //获取时间,分辨率为1US

			lengthTemp = ((float)t/58.0);//cm

			sum = lengthTemp + sum ;

		

	}

         	lengthTemp = sum/5.0;

		return lengthTemp;

}

在测距驱动和循迹策略都有的情况下,笔者将代码合二为一,实现要求功能(以下为while函数中代码)

 if(LED_1==0&&LED_3==0&&LED_2==0)
	{
	length = Hcsr04GetLength();
		if(length<=20.00)
		{
			while(1)
			{
				
				for(cnt1=0;cnt1 <= 60;cnt1++)
				for(cnt=0;cnt <= 8000;cnt++)
				CarBack();
			
				for(cnt1=0;cnt1 <= 60;cnt1++)
				for(cnt=0;cnt <= 8000;cnt++)
		  	CarRight();
			
				length = Hcsr04GetLength();
				if(length>=40.00)
				break;
			}
		}
		else CarGo();
	}
	else
	{
		length = Hcsr04GetLength();
		if(length<=20.00)
			CarStop();
		else
		{                              
		
		/***********路径判断***********/

			 if(LED_1==1&&LED_3==0)   //左方黑线亮,左转直到正向
	   {
			 while(1)
			 {
				 length = Hcsr04GetLength();//这个判断很重要,否则转弯过程中
		                 if(length<=20.00)          //会被判断为线外,会后退右转
			         CarStop();
				 else CarLeft();
				 if(LED_1==0&&LED_3==0&&LED_2==1)
				break;
			 }
		 }
			else if(LED_1==0&&LED_3==1)   右方黑线亮,右转直到正向
			{
				while(1)
			 {
				 length = Hcsr04GetLength();
	    	                 if(length<=20.00)
		  	         CarStop();
				 else CarRight();
				 if(LED_1==0&&LED_3==0&&LED_2==1)
				break;
			 }
		 }
			else	CarGo();	//其实这里并不严谨,笔者后期有改动。
		
	 }
  }
}

以上代码和驱动没有问题,但是有个很严重的问题就是

车子不能走太快,若直行左右转过程中遇到障碍物,有可能会出现线外避障,后期作者代码有改动。

原因是该代码中测距是由定时器计数,在此cpu参与计数,单片机是单核运行,因此大概一半以上时间都带等数据返回,如果速度太快小车在循迹中灯闪时却在等待数据,则直接冲出线外,解决方案(定时器捕获测距),CPU不参与计数,大大提高了检测速率。

此代码为简单版,并不严谨,但完全可以完成任务,笔者后期已经更新一次代码(博客头上有链接),这次小车速度很快(我啪的就说,很快啊)而且代码比较严谨

有问题欢迎留言~

文章头已经添加工程源码,大家看到了可以自取,感谢大家一直的支持,后续会继续努力

  • 125
    点赞
  • 951
    收藏
    觉得还不错? 一键收藏
  • 115
    评论
### 回答1: STM32寻迹小车原理图是一个电路设计图,用于制作追踪线路和执行特定任务的机器人小车。这个原理图主要分为电源电路、STM32主控电路、驱动电路、寻迹传感器电路以及其他的插件电路。 电源电路主要用于保证小车有稳定的电源,整个小车的电源输入是12V的直流电源。这个电路负责将直流电源转换为适用于电路的直流电压,并控制电量的消耗。 主控电路是实现小车的核心,需要使用微控制器来控制车轮和转向的方向和速度。 STM32芯片常被作为主控单元,与PWM模块、定时器和其他的外设进行连接。同时,这个部分包括一些必要的逻辑门和触发器用于慢速脉冲,以便精确监控小车的方向和速度。 驱动电路主要用于驱动车轮电机的运转。以STM32的高电平/低电平输出为信号控制电机转速和方向。此外,考虑到电机容易受到反电势作用的影响,这个部分还加入了一个感性负载电路。 寻迹传感器电路由两个光电传感器与滤波器和比较器组成。传感器将车底特定颜色的线路反射光线捕捉并转换为电信号,传感器输出信号经过去噪和调整后被传送到比较器,比较器根据输出将逻辑数值发送到微控制器,此时微控制器就根据比较器输出的电平控制小车的行进方向。 通过这个原理图,可以了解和理解STM32寻迹小车的各个部件结构以及它们在整个系统中的设计和作用。人们可以根据原理图自己搭建模型或进行功能性测试,并想办法改进和优化这个小车的性能。 ### 回答2: STM32寻迹小车的原理图主要包括了STM32主控芯片、电机驱动模块、红外线传感器、电池和电源管理模块等主要组成部分。具体来说,STM32主控芯片作为整个系统的核心部件,可以通过控制电机驱动模块实现小车的前后左右运动。在此基础上,红外线传感器则能够感知车辆前方的黑线,将传感器检测到的信号反馈给主控芯片,从而实现自动追踪黑线的功能。 整个系统的电源管理模块则负责对电池进行充电和管理,保证了系统的长时间稳定运行。此外,还需要对各个部件之间的通信进行协调和控制,以及对待机状态的维护和触发等功能进行程序设计和实现。总之,STM32寻迹小车原理图体现了现代化技术在机械和电子系统结合中的应用,展现了方便、高效、智能的特点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 115
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值