当前位置:   article > 正文

2021年电赛F题智能小车_21电赛寻迹小车

21电赛寻迹小车

概要

基于STM32F4的智能巡线识别小车,巡线采用openmv,识别采用k210

整体架构流程

1.电机选用的是13线的编码电机

2.巡线采用openmv

3.识别采用k210

4.主控为STM32F407ZGT6

技术细节

(1)巡线移动。采用openmv循迹和步进电机的巡线移动方案。
(2)识别病房号数字。可采用k210视觉单片机识别。由于追求识别准确率,所以单个数字的数据集有300张。

(3)k210的训练可以在MainHub这个网站上进行yolo2的训练,亲测不错。将训练模型和main.py放进SD卡中就可以运行了.网站链接:Maixhub 模型训练 - Sipeed Wiki

(4)运行openmv的循迹时一定要插一张SD卡,不知道为啥有时代码会跑没!!!

代码部分

main.c

  1. int main(void)
  2. {
  3. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  4. delay_init(168);
  5. uart2_init(115200); //K210初始化
  6. uart6_init(115200); //OPemMV初始化
  7. uart_init(115200); //初始化串口UART1
  8. // uart3_init(115200); //蓝牙初始化
  9. LED_Init(); //LED初始化
  10. // infra_init(); //5路灰度初始化
  11. Motor_Init(); //电机初始化
  12. Encoder_TIM_Init(); //编码器初始化
  13. PWM_Init_TIM(83,999); //电机PWM初始化 //84M/84/1000=1000+
  14. Speed_Pid_init();
  15. Pid_Lin_Patrol();
  16. OLED_Init(); //OLED初始化
  17. OLED_Clear();
  18. while(1)
  19. {
  20. //病房1
  21. if((xinhao==0)&&(number=='1'))
  22. {
  23. Speed_pid_Init(20.f,20.f);
  24. while(1)
  25. {
  26. find1();
  27. }
  28. }
  29. //病房2
  30. else if((xinhao==0)&&(number=='2'))
  31. {
  32. Speed_pid_Init(20.f,20.f);
  33. while(1)
  34. {
  35. find2();
  36. }
  37. }
  38. else{
  39. Flag_start=1;
  40. }
  41. //数字3
  42. if((xinhao==0)&&(number=='8'|number=='3'|number=='4'|number=='5'|number=='6'|number=='7'))
  43. {
  44. Speed_pid_Init(20.f,20.f);
  45. if(crossroad == 0 && (L1 + L2 + M + R1 + R2) >=3) //第一个十字路口
  46. {
  47. slow();
  48. crossroad++;
  49. Flag_Direction='1';
  50. }
  51. if(crossroad == 1 && (L1 + L2 + M + R1 + R2) >=3)//经过第二个十字路口判断
  52. {
  53. if(Flag_Direction=='0') //3号病房
  54. {
  55. while(1)
  56. {
  57. find3();
  58. }
  59. }
  60. else if(Flag_Direction=='2') //4号病房
  61. {
  62. while(1)
  63. {
  64. find4();
  65. }
  66. }
  67. else
  68. {
  69. crossroad++;
  70. // Flag_Direction=1;
  71. }
  72. }
  73. if(crossroad == 2 && (L1 + L2 + M + R1 + R2) >=3)//经过第三个十字路口判断
  74. {
  75. if(Flag_Direction=='0') //5 8号病房
  76. {
  77. delay_ms(210);
  78. turn_90_left_3();
  79. crossroad++;
  80. }
  81. }
  82. if(((L1 + L2 + M + R1 + R2) >=3)&& crossroad == 3 )//达到丁字路口
  83. {
  84. if(Flag_Direction=='0')
  85. {
  86. while(1)
  87. {
  88. find5();
  89. }
  90. }
  91. else if(Flag_Direction=='2')
  92. {
  93. while(1)
  94. {
  95. find8();
  96. }
  97. }
  98. }
  99. if(crossroad == 2 && (L1 + L2 + M + R1 + R2) >=3) //6 7号病房
  100. {
  101. if(Flag_Direction=='2')
  102. {
  103. delay_ms(220);
  104. turn_90_right_2();
  105. crossroad++;
  106. }
  107. }
  108. if( (L1 + L2 + M + R1 + R2) >=3 && crossroad == 3 )//达到丁字路口
  109. {
  110. if(Flag_Direction=='0')
  111. {
  112. while(1)
  113. {
  114. find7();
  115. }
  116. }
  117. else if(Flag_Direction=='2')
  118. {
  119. while(1)
  120. {
  121. find6();
  122. }
  123. }
  124. }
  125. }

 k210.c

  1. #include "k210.h"
  2. #include "usart.h"
  3. #include "Motor_Drive.h"
  4. char k210_data;
  5. char number;
  6. extern char Flag_Direction;
  7. int flag=0;
  8. void uart2_init(u32 bound){
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. USART_InitTypeDef USART_InitStructure;
  11. NVIC_InitTypeDef NVIC_InitStructure;
  12. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
  13. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  14. GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2);
  15. GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2);
  16. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
  17. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  18. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  20. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  21. GPIO_Init(GPIOA,&GPIO_InitStructure);
  22. USART_InitStructure.USART_BaudRate = bound;
  23. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  24. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  25. USART_InitStructure.USART_Parity = USART_Parity_No;
  26. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  27. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  28. USART_Init(USART2, &USART_InitStructure);
  29. USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  30. // USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
  31. USART_ClearFlag(USART2,USART_FLAG_TC);
  32. USART_Cmd(USART2, ENABLE);
  33. NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  34. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;
  35. NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;
  36. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  37. NVIC_Init(&NVIC_InitStructure);
  38. }
  39. void USART2_IRQHandler(void)
  40. {
  41. if (USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  42. {
  43. char b;
  44. USART_ClearFlag(USART2, USART_FLAG_RXNE);
  45. b = USART2->DR;
  46. if(flag==0)
  47. {
  48. number=b;
  49. flag++;
  50. }
  51. Flag_Direction=b;
  52. USART_SendData(USART2,b);
  53. }
  54. }

openmv.c

 

  1. #include "openmv.h"
  2. #include "sys.h"
  3. //#include "bluetooth.h"
  4. #include "control.h"
  5. //#include "xinhao.h"
  6. #include "delay.h"
  7. //#include "motor.h"
  8. #include "usart.h"
  9. //
  10. //如果使用ucos,则包括下面的头文件即可.
  11. #if SYSTEM_SUPPORT_OS
  12. #include "includes.h" //ucos 使用
  13. #endif
  14. int L1,L2,M,R1,R2;
  15. void uart6_init(u32 bound){
  16. GPIO_InitTypeDef GPIO_InitStructure;
  17. USART_InitTypeDef USART_InitStructure;
  18. NVIC_InitTypeDef NVIC_InitStructure;
  19. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);
  20. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6,ENABLE);
  21. GPIO_PinAFConfig(GPIOG,GPIO_PinSource9,GPIO_AF_USART6);
  22. GPIO_PinAFConfig(GPIOG,GPIO_PinSource14,GPIO_AF_USART6);
  23. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_14;
  24. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  25. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  26. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  27. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  28. GPIO_Init(GPIOG,&GPIO_InitStructure);
  29. USART_InitStructure.USART_BaudRate = bound;
  30. USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  31. USART_InitStructure.USART_StopBits = USART_StopBits_1;
  32. USART_InitStructure.USART_Parity = USART_Parity_No;
  33. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  34. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  35. USART_Init(USART6, &USART_InitStructure);
  36. USART_Cmd(USART6, ENABLE);
  37. //USART_ClearFlag(USART6, USART_FLAG_TC);
  38. USART_ITConfig(USART6, USART_IT_RXNE, ENABLE);
  39. NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn;
  40. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
  41. NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;
  42. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  43. NVIC_Init(&NVIC_InitStructure);
  44. }
  45. void USART6_IRQHandler(void)
  46. {
  47. if (USART_GetITStatus(USART6, USART_IT_RXNE) != RESET)
  48. {
  49. int a;
  50. USART_ClearFlag(USART6, USART_FLAG_RXNE);
  51. a = USART6->DR;
  52. R2 = ((u8)a & 0x10) >> 4;
  53. R1 = ((u8)a & 0x08) >> 3;
  54. M = ((u8)a & 0x04) >> 2;
  55. L1 = ((u8)a & 0x02) >> 1;
  56. L2 = (u8)a & 0x01;
  57. }
  58. }

小结

其实这里偷了一个懒,药品的检测用的是一个红外对管,有时间的话各位还是试一试压力传感器吧

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

闽ICP备14008679号