找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3688|回复: 1
收起左侧

基于机器视觉的网球识别与回收装置—智能小车STM32代码

[复制链接]
ID:393699 发表于 2019-6-5 21:38 | 显示全部楼层 |阅读模式
好久没逛51hei电子论坛了,最近看到有人询问智能小车(其实很多人都喜欢做小车),又想起自己写过智能小车,上传了,让大家参考下。
实物忘了放哪就不拍了,注意是拿来参考的,不是让你直接烧录的…………,直接烧录也没用是吧。当时靠这个代码拿了个电赛省二,新人们可以参考下,STM32的初学者也可以参照下思路,设计出一款自己的小车…………
好的,就这样吧。
对了,第二个py文件是OPENMV的代码,要用OPENMV摄像头做颜色识别的同学也可参考下
0.png

单片机源程序如下:
  1. /**************************************************************************************

  2. *                              基于机器视觉的网球识别与回收装置                                                                                                  *

  3.        摘要:本设计旨在制作出一个能够在网球场上自动搜寻网球并自动回收网球的装置。        
  4.                          本设计是以STM32单片机为核心设备,通过OPENMV摄像头对网球进行图像识别并回传,
  5.        回传数据处理后STM32将驱动回收装置自动行驶到目标位置,实现将球自动拾取并存
  6.                          放的功能。本设计基本模块包括MCU、驱动板、摄像头、捡球装置、收集装置和电源。
  7.                          其中MCU为STM32F103核心板,驱动板为L293D电机驱动板,摄像头为OPENMV,捡球装
  8.                          置及收集装置为定制结构。

  9.         适用单片机:STM32F103ZET6     适用开发板:野火科技 F103霸道开发板   
  10.                                 默认时钟频率:72MHZ                                                                                                         
  11. ***************************************************************************************/

  12. //连接方式 :请参考interface.h文件
  13. #include "stm32f10x.h"
  14. #include "interface.h"      //STM32各种接口
  15. #include "LCD1602.h"        //1602液晶屏(提供坐标可视化)
  16. #include "IRCtrol.h"        //定时及中断相关
  17. #include "motor.h"          //电机及舵机驱动
  18. #include "uart.h"           //串口相关
  19. #include "redvoid.h"        //红外避障相关
  20. #include "UltrasonicCtrol.h"//超声波模块相关(已弃用)

  21. /******注意:各个子文件并未清晰注释,请读者自行研究****/
  22. /**************************************************************************************/
  23. //全局变量定义
  24. unsigned int speed_count=0;//占空比计数器 50次一周期
  25. char front_left_speed_duty=SPEED_DUTY;
  26. char front_right_speed_duty=SPEED_DUTY;
  27. char behind_left_speed_duty=SPEED_DUTY;
  28. char behind_right_speed_duty=SPEED_DUTY;


  29. unsigned int tick_5ms = 0;//5ms计数器,作为主函数的基本周期
  30. unsigned int tick_1ms = 0;//1ms计数器,作为电机的基本计数器
  31. unsigned int tick_200ms = 0;//刷新显示
  32. unsigned int tick_10ms = 0;
  33. unsigned int tick_500ms = 0;
  34. unsigned int zhuanjiao;  //舵机角度参考值
  35. unsigned int ServoFlag;  //舵机标志位
  36. unsigned int DetectFlag; //红外避障标志位
  37. unsigned int DataBuf_x[3];   // 摄像头传回的x坐标数据
  38. unsigned int DataBuf_y[3];   // 摄像头传回的y坐标数据
  39. unsigned int buf_i;

  40. int x_pos;
  41. int y_pos;
  42. int x_pos_last;
  43. int y_pos_last;
  44. int Cam_key=0;
  45. int Turn_Flag=0;


  46. char ctrl_comm = COMM_STOP;//控制指令
  47. char ctrl_comm_last = COMM_STOP;//上一次的指令


  48. unsigned char continue_time=0;
  49. unsigned char bt_rec_flag=0;//蓝牙控制标志位
  50. unsigned char redray_flag=0;//红外循迹标志位
  51. unsigned char duoji_count=0;
  52. unsigned char RecFlag;
  53. /*****************************************************************************************/


  54. //定时器周期是0.1ms
  55. //舵机PWM周期是20ms,0 - 180°分别对应 0.5 - 2.5ms 的脉宽
  56. //变量zhuanjiao可调范围为 5 - 25 对应 0 - 180°,当zhuanjiao = 15 时对应90°
  57. //为了让舵机运行更精确,建议向右或向左转是不要使用0°或180°,建议向中间靠近一点
  58. //右转时选用zhuanjiao=7 左转时用zhuanjiao=23

  59. /*******************************************************************************
  60. * 函 数 名 :DuojiMid
  61. * 函数功能 :舵机下压
  62. * 输    入 :无
  63. * 输    出 :无
  64. *******************************************************************************/
  65. void DuojiMid()
  66. {
  67.         zhuanjiao++;
  68.   Delayms(20);
  69. }
  70.                                                         
  71. /*******************************************************************************
  72. * 函 数 名 :DuojiRight
  73. * 函数功能 :舵机上升
  74. * 输    入 :无
  75. * 输    出 :无
  76. *******************************************************************************/
  77. void DuojiRight()
  78. {
  79.         zhuanjiao--;
  80.         Delayms(20);
  81. }

  82. //void DuojiLeft()
  83. //{
  84. //        zhuanjiao = 230;
  85. //        Delayms(300);
  86. //}

  87. /*******************************************************************************
  88. * 函 数 名 :DuojiRight
  89. * 函数功能 :舵机相关动作
  90. * 输    入 :无
  91. * 输    出 :无
  92. *******************************************************************************/
  93. void Duoji()  //舵机动作函数
  94. {
  95.         int i;
  96.         zhuanjiao=100;
  97.         CarStop();
  98.         for(i=0;i<110;i++)
  99.         {
  100.                 DuojiMid();          //zhuanjiao ++ 向下压
  101.         }

  102.                 for(i=0;i<110;i++)
  103.         {
  104.                 DuojiRight();          //zhuanjiao -- 向上抬起
  105.         }

  106. }

  107. /*******************************************************************************
  108. * 函 数 名 :search
  109. * 函数功能 :小车处理摄像头发送的坐标,根据不同情况执行不同功能
  110. * 输    入 :无
  111. * 输    出 :无
  112. *******************************************************************************/
  113. void search()
  114. {
  115.                                 if(Turn_Flag==1)
  116.                         {
  117.                                 if(x_pos_last == x_pos)
  118.                                 {
  119.                                    CarRight();
  120.                                 }
  121.                                        
  122.                         }        

  123.           else{
  124.                         
  125.                                 if(x_pos>200)
  126.                                 {
  127.                                         CarRight();                                        //修正转右
  128.                                 }  
  129.                                 
  130.                                 else if(x_pos<120)
  131.                                 {
  132.                                         CarLeft();          //修正转左
  133.                                 }  
  134.                                 
  135.                                 else if(120<x_pos  &&  x_pos<200)  //x坐标在区间内
  136.                                 {
  137.                                  
  138.                                         if(y_pos<150)   //y坐标bu在区间内
  139.                                          {                        
  140.                                           CarBack();               //go straight,wrong name
  141.                                          }
  142.                                        
  143.                                          if(y_pos>180)
  144.                                   {                                         
  145.                                                  CarGo();                //go backwards,wrong name                                          
  146.                                          }
  147.                                        
  148.                                  else if(150<y_pos  &&  y_pos<180 )
  149.                                         {
  150.                                                  if(VOID_R_IO==BARRIER_Y||VOID_M_IO==BARRIER_Y||VOID_L_IO==BARRIER_Y)
  151.                                                  Delayms(10);
  152.                                                  if(VOID_R_IO==BARRIER_Y||VOID_M_IO==BARRIER_Y||VOID_L_IO==BARRIER_Y)                                                
  153.                                                  Duoji();   
  154.                                          }
  155.                                   }                                                                                                        
  156.                            }
  157.                                 
  158.                                 
  159.                         if( (x_pos_last - x_pos) > 50 || (x_pos_last - x_pos)  < -50   )
  160.                            {
  161.                                 CarRight();
  162.                            }                     //比较x轴与前一次值避免两球同时判断混乱
  163.                         
  164.                                 x_pos_last=x_pos;
  165.                                 y_pos_last=y_pos; //记录上一次的坐标
  166.                                        
  167. }

  168. /*******************************************************************************
  169. * 函 数 名 :TurnBack
  170. * 函数功能 :小车强制右转(适用于红外避障)
  171. * 输    入 :无
  172. * 输    出 :无
  173. *******************************************************************************/
  174. void TurnBack()
  175. {
  176.         
  177.         CarRight();
  178.         Delayms(1000);

  179. }

  180. /*******************************************************************************
  181. * 函 数 名 :main
  182. * 函数功能 :主函数
  183. * 输    入 :无
  184. * 输    出 :无
  185. *******************************************************************************/
  186. int main(void)
  187. {
  188.         unsigned int i;
  189.         delay_init();
  190.         GPIOCLKInit();
  191.         UserLEDInit();
  192.         LCD1602Init();
  193.         IRCtrolInit();
  194.         TIM2_Init();
  195.         TIM5_Init();
  196.         MotorInit();
  197.         //UltraSoundInit();
  198.         RedRayInit();
  199.         ServoInit();
  200.         USART1Conf(9600);
  201.         USART3Conf(9600);
  202.         Delayms(500);
  203.         
  204.         for(i=0;i<3;i++)
  205.           {
  206.                         DataBuf_x[i]=0x30;
  207.                         DataBuf_y[i]=0x30;
  208.                
  209.                 }
  210.                         
  211. /******************************************************************************************/
  212. while(1)
  213. {         
  214.                          if(tick_5ms >= 5)
  215.                 {
  216.                         tick_5ms = 0;

  217.                         tick_200ms++;
  218.                         if(tick_200ms >= 40)
  219.                         {
  220.                                 tick_200ms = 0;
  221.                                 LEDToggle(LED_PIN);
  222.                         }
  223.                         continue_time--;//200ms 无接收指令就停车
  224.                         
  225.                         if(continue_time == 0)
  226.                         {
  227.                                 continue_time = 1;
  228.                                 CarStop();
  229.                         }
  230.                                 
  231.         LCD1602WriteCamData();        
  232.                                                 
  233.                                 x_pos=(DataBuf_x[0]-0x30)*100+(DataBuf_x[1]-0x30)*10+(DataBuf_x[2]-0x30);
  234.                                 y_pos=(DataBuf_y[0]-0x30)*100+(DataBuf_y[1]-0x30)*10+(DataBuf_y[2]-0x30);
  235.                         
  236.               if(Cam_key==1)
  237.                           {        
  238.                search();                                       
  239.                           }
  240.                                                                                                                                        
  241.                                 if(VOID_R_IO==BARRIER_Y||VOID_M_IO==BARRIER_Y||VOID_L_IO==BARRIER_Y)
  242.                                 {   
  243.            Delayms(10);
  244.            if        (VOID_R_IO==BARRIER_Y && VOID_M_IO==BARRIER_Y  &&  VOID_L_IO==BARRIER_Y)                                //检测前方是不是墙,是的话就掉头                                                                                    
  245. ……………………

  246. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
小车V6.1.7z (618.95 KB, 下载次数: 54)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:615455 发表于 2020-6-18 11:26 | 显示全部楼层
谢谢 分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表