当前位置:   article > 正文

基于stm32f4的五路循迹小车(四、五路循迹模块)_5路红外循迹模块程序设计

5路红外循迹模块程序设计

#这一部分现在回想起来也是很怀念,当时马上就要进行智能车比赛了,然后为了赶时间,专门挑了一个“水课”,坐在思政课最后面拿个电脑在那里想该怎么构建代码。

最开始我想的是模拟信号01来判断灰度,也参考了好多资料。

STM32F1编写简单的五路黑白循迹_五路循迹小车代码-CSDN博客

最开始参考了类似这些的循迹模块的代码,我在这里将他们复制上来,便于我说明

  1. 这个是我最开始参考别人的代码
  2. /********
  3. 功 能:读取5个传感器输出的状态
  4. 形 参:无
  5. 返回值:state 传感器状态
  6. 说 明:传感器检测到白线输出1,黑线输出0。。
  7. 因为使用的时GPIOA端口的59引脚,这里直接读出GPIOA所有引脚的状态,
  8. 然后将得到的数据向右移动5位,去掉04引脚的数据,
  9. 再与上0x001f,得到59引脚的状态,
  10. ******/
  11. u8 Get_Infrared_State(void)
  12. {
  13. u8 state = 0;
  14. state = (u8)(GPIO_ReadInputData(TRACK_PORT) >> 5) & 0x001f;
  15. return state;
  16. }
  17. /********
  18. 功 能:循迹调整函数
  19. 形 参:无
  20. 返回值: 无
  21. 说 明:根据获取到的传感器输出状态,进行左右电机的速度调整
  22. ******/
  23. void Track_Adjust(void)
  24. {
  25. u8 flag = 1;//是否复位标志
  26. u8 state = 0;//状态获取变量定义
  27. while(flag)
  28. {
  29. state = Get_Infrared_State();//获取传感器状态
  30. switch(state)
  31. {
  32. case 0b00000:
  33. case 0b10001:
  34. case 0b00001:
  35. case 0b10000: Motor_Speed_Adjust(0,0); break;//停止
  36. case 0b10011: Motor_Speed_Adjust(STARTER_SPEED-100,STARTER_SPEED+100); break;//右偏1
  37. case 0b10111: Motor_Speed_Adjust(STARTER_SPEED-250,STARTER_SPEED+250); break;//右偏2
  38. case 0b00111: Motor_Speed_Adjust(STARTER_SPEED-400,STARTER_SPEED+400); break;//右偏3
  39. case 0b01111: Motor_Opposite(L); break;//右偏4级,
  40. case 0b11001: Motor_Speed_Adjust(STARTER_SPEED+100,STARTER_SPEED-100); break;//左偏1
  41. case 0b11101: Motor_Speed_Adjust(STARTER_SPEED+250,STARTER_SPEED-250); break;//左偏2
  42. case 0b11100: Motor_Speed_Adjust(STARTER_SPEED+400,STARTER_SPEED-400); break;//左偏3
  43. case 0b11110: Motor_Opposite(R); break;//左偏4
  44. case 0b11011: Motor_Speed_Adjust(STARTER_SPEED,STARTER_SPEED);flag = 0; break;//正常
  45. case 0b11111: Motor_Speed_Adjust(0,0); break;
  46. default: Motor_Speed_Adjust(0,0); break;
  47. }
  48. }
  49. }

(主要是从别人的代码中得到一些思路来指导自己的整体过程)

 当时差不多也是这个思路,01110,之类的进行判断,检测到黑线就是1,检测不到黑线就是0,01110就是指我们车的方向是正确的,接下来进行直走就行了。

同理11100则说明小车已经开始发生了偏移,要进行左拐操作,同时这个偏移的幅度也不是很大,所以进行较小的左拐操作。

类似的11000或者10000,就说明小车已经偏移的很严重了,要进行大幅度的左拐操作。

如何实现小小的左拐和大大的左拐操作呢,我们只需要控制我们电机的转速,让他们的差值越来越大,那么我们就能实现较大的左转弯。

当时就这样按照这个思路来一步一步进行,最后代码也写完了,运行也没问题,拷录芯片进去,发现小车跟一个帕金森老头一样,一卡一卡的,根本走不了。

帕金森小车

帕金森小车-CSDN直播

(我把视频放在这里,感兴趣的可以欣赏一下“帕金森小车”)

后来呀,也是咨询了好多好多人,问了好多学长,最后都是说我写的代码也没有问题,但是就是说不出来问题,我也是想的好久,然后过了几天之后,我突然意识到,我的判断条件11000,00111之类的条件其实是每个摄像头反映出来的数字,如果连接起来其实是整型,并不是字符串。

意识到这一点之后,我便调整了算法,一整个代码完全用if else来执行。

最后写出来了下面的代码,这个代码运行起来没有一点问题,最终映射在小车上也是十分成功的,就是在一个弯道的判断条件会出现一些问题,可以看下面这个视频。

调试小车

调试小车-CSDN直播

代码部分我拷在下面

  1. 这个是五路循迹的track.h文件
  2. #ifndef __TRACK_H__
  3. #define __TRACK_H__
  4. #include "motor.h"
  5. void Track_Adjust(void);
  6. int Track_State(void);
  7. #endif
  1. 这个是循迹模块的track.c文件
  2. #include "gpio.h"
  3. #include "motor.h"
  4. #include "stdio.h"
  5. #include "main.h"
  6. /*int Track_State(void)
  7. {
  8. int LED_1, LED_2, LED_3, LED_4, LED_5,LED;
  9. LED_1 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2);
  10. LED_2 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3);
  11. LED_3 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4);
  12. LED_4 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5);
  13. LED_5 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6);
  14. LED = (LED_1 * 10000) + (LED_2 * 1000)+ (LED_3 * 100) + (LED_4 * 10) + LED_5;
  15. return (LED);
  16. }*/
  17. void Track_Adjust(void)
  18. {
  19. int LED_1, LED_2, LED_3, LED_4, LED_5,LED;
  20. LED_1 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_2);
  21. LED_2 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_3);
  22. LED_3 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4);
  23. LED_4 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5);
  24. LED_5 = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6);
  25. if(LED_1==0&&LED_2==0&&LED_3==0&&LED_4==0&&LED_5==0)
  26. runCarStop();
  27. else if(LED_1==1&&LED_2==1&&LED_3==1&&LED_4==1&&LED_5==1)
  28. runCarGo();
  29. else if(LED_1==1&&LED_2==0&&LED_3==0&&LED_4==1&&LED_5==1)
  30. runCarLittleRight();
  31. else if(LED_1==1&&LED_2==0&&LED_3==1&&LED_4==1&&LED_5==1)
  32. runCarLittleRight();
  33. else if(LED_1==0&&LED_2==0&&LED_3==0&&LED_4==1&&LED_5==1){
  34. //runCarStop();
  35. //HAL_Delay(20);
  36. runCarRight();
  37. }
  38. else if(LED_1==0&&LED_2==0&&LED_3==1&&LED_4==1&&LED_5==1){
  39. //runCarStop();
  40. //HAL_Delay(20);
  41. runCarRight();}
  42. else if(LED_1==0&&LED_2==1&&LED_3==1&&LED_4==1&&LED_5==1){
  43. runCarRight();}
  44. else if(LED_1==1&&LED_2==1&&LED_3==0&&LED_4==0&&LED_5==1)
  45. runCarLittleLeft();
  46. else if(LED_1==1&&LED_2==1&&LED_3==1&&LED_4==0&&LED_5==1)
  47. runCarLittleLeft();
  48. else if(LED_1==1&&LED_2==1&&LED_3==1&&LED_4==0&&LED_5==0)
  49. runCarLeft();
  50. else if(LED_1==1&&LED_2==1&&LED_3==1&&LED_4==1&&LED_5==0)
  51. runCarLeft();
  52. else if(LED_1==1&&LED_2==1&&LED_3==0&&LED_4==1&&LED_5==1)
  53. runCarGo();
  54. else
  55. runCarGo();
  56. /*switch (LED)
  57. {
  58. case 00000:runCarStop(); break;
  59. //case 10000:runCarRight();break;
  60. case 11111:runCarGo(); break;
  61. case 00110:
  62. case 10010:
  63. case 10110:
  64. case 00001:
  65. case 00101:
  66. case 00011:
  67. case 10011: runCarLittleLeft(); break;
  68. case 10111: runCarLittleLeft(); break;
  69. case 00111: runCarLeft(); break;
  70. case 01111: runCarLeft(); break;
  71. case 10100:
  72. case 11000:
  73. case 11001:runCarLittleRight(); break;
  74. case 11101:runCarLittleRight(); break;
  75. case 11100:runCarRight(); break;
  76. case 11110:runCarRight(); break;
  77. case 01110:
  78. case 10101:
  79. case 10001:
  80. case 11011: runCarGo(); break;
  81. default:runCarGo(); break;
  82. }
  83. */
  84. }
  85. 注释掉的内容就是之前我不断调试的过程,自己有点怀旧没有将他们删掉,嘿嘿

调试的过程真的很痛苦,就是那种下午到实验室不断修改电机转速,一遍一遍调试,看小车到底在哪个条件下运行的最好,完美的概率最高,这种小车跑图真的有运气的成分,小车有时候给你脸,会走的很完美,不给你脸,就真的走不了一点(哈哈哈哈哈)

最后也是成功完赛,取得了一定的名次。

成功的小车

成功的小车-CSDN直播

小车也是十分的帅气,我都想把他放家里每天烧香供上哈哈哈哈。

//到这里为止小车的主要学习部分基本上就要结束了,之后我会最后出一个这个系列的最后一篇总结文章,主要总结一下电机转速设置的问题,以及部分走线会出现或者遇到的问题。

跟着我的思路和文章走下去,一定能得到和我一样成功的结果的。相信自己,不要因为一时的挫折就放弃了智能车的学习,最后成功了真的会十分激动的!

ps:不会调节视频大小/(ㄒoㄒ)/~~,还得继续学习

谢谢大家的支持啦!!!!!!(希望大家来点小小的赞和关注,给我更多的创作动力,我臭不要脸/(ㄒoㄒ)/~~)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/500029
推荐阅读
相关标签
  

闽ICP备14008679号