当前位置:   article > 正文

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

避障小车代码

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

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

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

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

 

 

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

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

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

红外探头板
信号处理板

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

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

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

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

  1. /***LED_1,LED_2,LED_3分别对应左中右三个红外探头***/
  2. if(LED_1==1&&LED_3==0) //左方黑线亮,左转直到正向
  3. {
  4. while(1)
  5. {
  6. CarLeft();
  7. if(LED_1==0&&LED_3==0&&LED_2==1)
  8. break;
  9. }
  10. }
  11. else if(LED_1==0&&LED_3==1) 右方黑线亮,右转直到正向
  12. {
  13. while(1)
  14. {
  15. CarRight();
  16. if(LED_1==0&&LED_3==0&&LED_2==1)
  17. break;
  18. }
  19. }
  20. else CarGo();

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

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

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

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

  1. float Hcsr04GetLength(void )
  2. {
  3. u32 t = 0;
  4. int i = 0;
  5. float lengthTemp = 0;
  6. float sum = 0;
  7. while(i!=5)
  8. {
  9. //TRIG_Send = 1; //发送口高电平输出
  10. GPIO_SetBits(GPIOA, GPIO_Pin_5); // Alias
  11. Delay_Us(15);
  12. //TRIG_Send = 0;
  13. GPIO_ResetBits(GPIOA, GPIO_Pin_5); // Alias
  14. //while(ECHO_Reci == 0); //等待接收口高电平输出
  15. while(0 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))
  16. OpenTimerForHc(); //打开定时器
  17. i = i + 1;
  18. //while(ECHO_Reci == 1);
  19. while(1 == GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))
  20. Delay_Us(10); //延时,去除小数值
  21. CloseTimerForHc(); //关闭定时器
  22. t = GetEchoTimer(); //获取时间,分辨率为1US
  23. lengthTemp = ((float)t/58.0);//cm
  24. sum = lengthTemp + sum ;
  25. }
  26. lengthTemp = sum/5.0;
  27. return lengthTemp;
  28. }

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

  1. if(LED_1==0&&LED_3==0&&LED_2==0)
  2. {
  3. length = Hcsr04GetLength();
  4. if(length<=20.00)
  5. {
  6. while(1)
  7. {
  8. for(cnt1=0;cnt1 <= 60;cnt1++)
  9. for(cnt=0;cnt <= 8000;cnt++)
  10. CarBack();
  11. for(cnt1=0;cnt1 <= 60;cnt1++)
  12. for(cnt=0;cnt <= 8000;cnt++)
  13. CarRight();
  14. length = Hcsr04GetLength();
  15. if(length>=40.00)
  16. break;
  17. }
  18. }
  19. else CarGo();
  20. }
  21. else
  22. {
  23. length = Hcsr04GetLength();
  24. if(length<=20.00)
  25. CarStop();
  26. else
  27. {
  28. /***********路径判断***********/
  29. if(LED_1==1&&LED_3==0) //左方黑线亮,左转直到正向
  30. {
  31. while(1)
  32. {
  33. length = Hcsr04GetLength();//这个判断很重要,否则转弯过程中
  34. if(length<=20.00) //会被判断为线外,会后退右转
  35. CarStop();
  36. else CarLeft();
  37. if(LED_1==0&&LED_3==0&&LED_2==1)
  38. break;
  39. }
  40. }
  41. else if(LED_1==0&&LED_3==1) 右方黑线亮,右转直到正向
  42. {
  43. while(1)
  44. {
  45. length = Hcsr04GetLength();
  46. if(length<=20.00)
  47. CarStop();
  48. else CarRight();
  49. if(LED_1==0&&LED_3==0&&LED_2==1)
  50. break;
  51. }
  52. }
  53. else CarGo(); //其实这里并不严谨,笔者后期有改动。
  54. }
  55. }
  56. }

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

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

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

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

有问题欢迎留言~

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

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号