久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4552|回復(fù): 1
收起左側(cè)

基于機(jī)器視覺(jué)的網(wǎng)球識(shí)別與回收裝置—智能小車(chē)STM32代碼

[復(fù)制鏈接]
ID:393699 發(fā)表于 2019-6-5 21:38 | 顯示全部樓層 |閱讀模式
好久沒(méi)逛51hei電子論壇了,最近看到有人詢(xún)問(wèn)智能小車(chē)(其實(shí)很多人都喜歡做小車(chē)),又想起自己寫(xiě)過(guò)智能小車(chē),上傳了,讓大家參考下。
實(shí)物忘了放哪就不拍了,注意是拿來(lái)參考的,不是讓你直接燒錄的…………,直接燒錄也沒(méi)用是吧。當(dāng)時(shí)靠這個(gè)代碼拿了個(gè)電賽省二,新人們可以參考下,STM32的初學(xué)者也可以參照下思路,設(shè)計(jì)出一款自己的小車(chē)…………
好的,就這樣吧。
對(duì)了,第二個(gè)py文件是OPENMV的代碼,要用OPENMV攝像頭做顏色識(shí)別的同學(xué)也可參考下
0.png

單片機(jī)源程序如下:
  1. /**************************************************************************************

  2. *                              基于機(jī)器視覺(jué)的網(wǎng)球識(shí)別與回收裝置                                                                                                  *

  3.        摘要:本設(shè)計(jì)旨在制作出一個(gè)能夠在網(wǎng)球場(chǎng)上自動(dòng)搜尋網(wǎng)球并自動(dòng)回收網(wǎng)球的裝置。        
  4.                          本設(shè)計(jì)是以STM32單片機(jī)為核心設(shè)備,通過(guò)OPENMV攝像頭對(duì)網(wǎng)球進(jìn)行圖像識(shí)別并回傳,
  5.        回傳數(shù)據(jù)處理后STM32將驅(qū)動(dòng)回收裝置自動(dòng)行駛到目標(biāo)位置,實(shí)現(xiàn)將球自動(dòng)拾取并存
  6.                          放的功能。本設(shè)計(jì)基本模塊包括MCU、驅(qū)動(dòng)板、攝像頭、撿球裝置、收集裝置和電源。
  7.                          其中MCU為STM32F103核心板,驅(qū)動(dòng)板為L(zhǎng)293D電機(jī)驅(qū)動(dòng)板,攝像頭為OPENMV,撿球裝
  8.                          置及收集裝置為定制結(jié)構(gòu)。

  9.         適用單片機(jī):STM32F103ZET6     適用開(kāi)發(fā)板:野火科技 F103霸道開(kāi)發(fā)板   
  10.                                 默認(rèn)時(shí)鐘頻率:72MHZ                                                                                                         
  11. ***************************************************************************************/

  12. //連接方式 :請(qǐng)參考interface.h文件
  13. #include "stm32f10x.h"
  14. #include "interface.h"      //STM32各種接口
  15. #include "LCD1602.h"        //1602液晶屏(提供坐標(biāo)可視化)
  16. #include "IRCtrol.h"        //定時(shí)及中斷相關(guān)
  17. #include "motor.h"          //電機(jī)及舵機(jī)驅(qū)動(dòng)
  18. #include "uart.h"           //串口相關(guān)
  19. #include "redvoid.h"        //紅外避障相關(guān)
  20. #include "UltrasonicCtrol.h"//超聲波模塊相關(guān)(已棄用)

  21. /******注意:各個(gè)子文件并未清晰注釋?zhuān)?qǐng)讀者自行研究****/
  22. /**************************************************************************************/
  23. //全局變量定義
  24. unsigned int speed_count=0;//占空比計(jì)數(shù)器 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計(jì)數(shù)器,作為主函數(shù)的基本周期
  30. unsigned int tick_1ms = 0;//1ms計(jì)數(shù)器,作為電機(jī)的基本計(jì)數(shù)器
  31. unsigned int tick_200ms = 0;//刷新顯示
  32. unsigned int tick_10ms = 0;
  33. unsigned int tick_500ms = 0;
  34. unsigned int zhuanjiao;  //舵機(jī)角度參考值
  35. unsigned int ServoFlag;  //舵機(jī)標(biāo)志位
  36. unsigned int DetectFlag; //紅外避障標(biāo)志位
  37. unsigned int DataBuf_x[3];   // 攝像頭傳回的x坐標(biāo)數(shù)據(jù)
  38. unsigned int DataBuf_y[3];   // 攝像頭傳回的y坐標(biāo)數(shù)據(jù)
  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;//藍(lán)牙控制標(biāo)志位
  50. unsigned char redray_flag=0;//紅外循跡標(biāo)志位
  51. unsigned char duoji_count=0;
  52. unsigned char RecFlag;
  53. /*****************************************************************************************/


  54. //定時(shí)器周期是0.1ms
  55. //舵機(jī)PWM周期是20ms,0 - 180°分別對(duì)應(yīng) 0.5 - 2.5ms 的脈寬
  56. //變量zhuanjiao可調(diào)范圍為 5 - 25 對(duì)應(yīng) 0 - 180°,當(dāng)zhuanjiao = 15 時(shí)對(duì)應(yīng)90°
  57. //為了讓舵機(jī)運(yùn)行更精確,建議向右或向左轉(zhuǎn)是不要使用0°或180°,建議向中間靠近一點(diǎn)
  58. //右轉(zhuǎn)時(shí)選用zhuanjiao=7 左轉(zhuǎn)時(shí)用zhuanjiao=23

  59. /*******************************************************************************
  60. * 函 數(shù) 名 :DuojiMid
  61. * 函數(shù)功能 :舵機(jī)下壓
  62. * 輸    入 :無(wú)
  63. * 輸    出 :無(wú)
  64. *******************************************************************************/
  65. void DuojiMid()
  66. {
  67.         zhuanjiao++;
  68.   Delayms(20);
  69. }
  70.                                                         
  71. /*******************************************************************************
  72. * 函 數(shù) 名 :DuojiRight
  73. * 函數(shù)功能 :舵機(jī)上升
  74. * 輸    入 :無(wú)
  75. * 輸    出 :無(wú)
  76. *******************************************************************************/
  77. void DuojiRight()
  78. {
  79.         zhuanjiao--;
  80.         Delayms(20);
  81. }

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

  87. /*******************************************************************************
  88. * 函 數(shù) 名 :DuojiRight
  89. * 函數(shù)功能 :舵機(jī)相關(guān)動(dòng)作
  90. * 輸    入 :無(wú)
  91. * 輸    出 :無(wú)
  92. *******************************************************************************/
  93. void Duoji()  //舵機(jī)動(dòng)作函數(shù)
  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. * 函 數(shù) 名 :search
  109. * 函數(shù)功能 :小車(chē)處理攝像頭發(fā)送的坐標(biāo),根據(jù)不同情況執(zhí)行不同功能
  110. * 輸    入 :無(wú)
  111. * 輸    出 :無(wú)
  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();                                        //修正轉(zhuǎn)右
  128.                                 }  
  129.                                 
  130.                                 else if(x_pos<120)
  131.                                 {
  132.                                         CarLeft();          //修正轉(zhuǎn)左
  133.                                 }  
  134.                                 
  135.                                 else if(120<x_pos  &&  x_pos<200)  //x坐標(biāo)在區(qū)間內(nèi)
  136.                                 {
  137.                                  
  138.                                         if(y_pos<150)   //y坐標(biāo)bu在區(qū)間內(nèi)
  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軸與前一次值避免兩球同時(shí)判斷混亂
  163.                         
  164.                                 x_pos_last=x_pos;
  165.                                 y_pos_last=y_pos; //記錄上一次的坐標(biāo)
  166.                                        
  167. }

  168. /*******************************************************************************
  169. * 函 數(shù) 名 :TurnBack
  170. * 函數(shù)功能 :小車(chē)強(qiáng)制右轉(zhuǎn)(適用于紅外避障)
  171. * 輸    入 :無(wú)
  172. * 輸    出 :無(wú)
  173. *******************************************************************************/
  174. void TurnBack()
  175. {
  176.         
  177.         CarRight();
  178.         Delayms(1000);

  179. }

  180. /*******************************************************************************
  181. * 函 數(shù) 名 :main
  182. * 函數(shù)功能 :主函數(shù)
  183. * 輸    入 :無(wú)
  184. * 輸    出 :無(wú)
  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 無(wú)接收指令就停車(chē)
  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)                                //檢測(cè)前方是不是墻,是的話(huà)就掉頭                                                                                    
  245. ……………………

  246. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
小車(chē)V6.1.7z (618.95 KB, 下載次數(shù): 54)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:615455 發(fā)表于 2020-6-18 11:26 | 顯示全部樓層
謝謝 分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩a| 91精品久久久久久综合五月天 | 国产片一区二区三区 | 国产精品久久久久一区二区三区 | 伊人精品一区二区三区 | 久久综合久色欧美综合狠狠 | 国产伦精品一区二区三区精品视频 | 国产日韩91 | 亚洲精品高清视频 | 免费国产一区 | 黄色91在线| 日日爱av| 日日爽 | 黄色网址在线免费播放 | 欧美日韩精品中文字幕 | 欧美日韩国产欧美 | 91视频久久久久 | 美美女高清毛片视频免费观看 | 完全免费在线视频 | 欧美高清性xxxxhd | 亚洲精品成人网 | 99久久精品免费看国产四区 | 一级黄色录像毛片 | 欧美乱码精品一区二区三区 | 日韩免费激情视频 | 久久一二三区 | 日韩有码一区 | 久久99一区二区 | 黄色国产在线播放 | 亚洲精品久久久久中文字幕欢迎你 | 成人免费在线观看 | 欧美精品区| 亚洲视频在线一区 | 精品免费国产视频 | 亚洲永久入口 | 久久久久久久久久影视 | 91在线精品播放 | 久久午夜精品福利一区二区 | 免费在线成人 | 精品在线观看入口 | 亚洲视频在线播放 |