久久久国产精品视频袁燕,99re久久精品国产,亚洲欧美日韩国产综合v,天天躁夜夜躁狠狠久久,激情五月婷婷激情五月婷婷

  • 回復(fù)
  • 收藏
  • 點贊
  • 分享
  • 發(fā)新帖

【風(fēng)采匯】+滾球控制系統(tǒng)

摘要:本文設(shè)計并實現(xiàn)了板球控制系統(tǒng),通過OV7725攝像頭模塊作為圖像識別傳感器對圖像進行處理,獲取小球的位置坐標(biāo)。采用STM32F103ZET6 單片機作為主控制器,根據(jù)圖像信息通過PID 控制算法控制數(shù)字舵機,舵機帶動曲柄搖桿機構(gòu)驅(qū)動平板運動,以此調(diào)整小球在平板上的位置,實現(xiàn)小球在板上任意點的穩(wěn)定,以及任意區(qū)域之間的轉(zhuǎn)移。測試表明,本系統(tǒng)能完成紅外控制小球運動,畫線,控制小球走正方形,控制小球畫圓。

關(guān)鍵詞:滾球控制系統(tǒng);OV2275攝像頭;圖像處理;PID算法

一、系統(tǒng)方案的論證

本系統(tǒng)主要由采集模塊、處理模塊、執(zhí)行模塊、電源模塊組成,下面分別論證這幾個模塊的選擇。

1、機械結(jié)構(gòu)的論證與選擇

方案一:四邊懸吊結(jié)構(gòu)。采用四邊懸吊結(jié)構(gòu),結(jié)構(gòu)簡單,但是不穩(wěn)定,重心不固定,而重心的變化會影響平板的調(diào)整,從而影響數(shù)據(jù)處理周期,造成延時。。

方案二:正交搖臂支撐結(jié)構(gòu)。中間采用萬向節(jié)固定支桿,另外兩邊使用舵機固定,平板與舵機支桿之間通過萬向節(jié)連接,三角形結(jié)構(gòu)穩(wěn)定,固定支桿使平板重心不偏移,控制更為簡單。

綜合以上二種方案,選擇方案二。

2、控制系統(tǒng)的論證與選擇

方案一:STC89C51。采用STC89C51單片機做控制芯片,該系列單片機價格低廉,入門簡單,實用范圍廣,資料豐富。但是是傳統(tǒng)的8位單片機,處理速度不行。

方案二:MSP430。采用TI的MSP430系列單片機做主控制器,該系列單片機資源較豐富,易控制且低功耗。但是由于單片機自身主頻較低,因而處理速度一般。

方案三:STM32F103。采用STM32F103系列單片機做主控芯片,該單片機控制較為復(fù)雜,且內(nèi)部定時器,IIC,SPI等資源豐富,運算處理速度快,適合控制系統(tǒng)的實時控制。

綜合以上三種方案,選擇方案三。

3、電機的論證與選擇

方案一:直流電機。直流電機力量大,調(diào)速范圍廣,動態(tài)特性好,傳遞函數(shù) 較為簡單,速度快。但只能對轉(zhuǎn)速進行控制,可控性差,較難控制電機停止位置。

方案二:步進電機。步進電機可以實現(xiàn)開環(huán)控制,無需反饋信號,適合高精度的控制,使用短距離頻繁動作較佳,但控制復(fù)雜,延遲值高,轉(zhuǎn)速慢,扭矩小,且動態(tài)特性差,難以處理,不適合實時控制。

方案三:舵機。舵機具有較高的穩(wěn)定性,控制簡單,扭力大,成本低,且加速和減速時也更加迅速,柔和,可以提供更好的精度和更好的固定力量,且防抖動性能優(yōu)越,響應(yīng)速度快。但對相應(yīng)的周期有要求,滿足周期條件后,適合實時控制。

綜合以上三種方案,選擇方案三。

 

二、系統(tǒng)理論分析與計算1、小球檢測方法分析

小球的檢測是通過OV7725攝像頭模塊完成的,本系統(tǒng)設(shè)計采用顏色識別來檢測小球,平板為黑色,使用白色小球提高對比度。STM32將攝像頭采集回來的彩色圖像做二值化處理,得到一個數(shù)組,然后通過搜索整個數(shù)組里面所有白色像素點的最大X、Y坐標(biāo)與最小X、Y坐標(biāo),分別對應(yīng)小球在圖像中上下左右四個頂點,通過四個頂點取中值進行確定質(zhì)心位置。也就是小球的位置坐標(biāo)。

2、控制方法的分析

  1

本系統(tǒng)通過控制舵機帶動曲柄搖桿機構(gòu)從而控制小球在平板上的運動,采用PID位置環(huán)控制舵機輸出量使小球到達指定位置。采用PID速度環(huán)控制舵機輸出量使小球速度為0。

位置環(huán)PID計算公式:

Error_Postion=X1-X0;

Error_Postion_last=Error_Postion;

PID_Postion=KP*Error_Postion+KD*(Error_Postion-Error_Postion_last);

速度環(huán)PID計算公式:

Error_V=(X1-X0)/T-0;

Error_V_last=Error_V;

PID_V=KP*Error_V+KD*(Error_V-Error_V_last);

舵機輸出PWM計算公式:

PID_PWM=PID_Postion+PID_V;

    Y軸的PID與舵機的輸出計算與X軸類似。

 

三、電路與程序設(shè)計1、電路的設(shè)計(1)系統(tǒng)總體框圖

本系統(tǒng)電路共分為四個部分:采集模塊,主控制器模塊,執(zhí)行模塊和電源模塊,系統(tǒng)總體框圖如圖3.3.1所示。攝像頭負責(zé)采集小球在平板上的位置,并將信息送回到STM32F103控制器;STM32F103經(jīng)過PID運算輸出PWM波控制舵機轉(zhuǎn)角,以此控制小球在平板上的運動,從而形成一個閉合反饋回路,達到系統(tǒng)功能要求;電源模塊為以上模塊提供所需電源。

2 

圖3.1.1

(2)降壓系統(tǒng)電路

3 

                                             圖3.1.2

2、程序的設(shè)計(1)程序功能描述與設(shè)計思路

1、程序功能描述

根據(jù)題目要求軟件部分主要實現(xiàn)攝像頭模塊的采集處理,紅外設(shè)置和顯示功能。

1)攝像頭圖像的采集:使用OV7725攝像頭處理圖像信息,提取小球的坐標(biāo)與運動信息。

2)紅外控制的設(shè)置:使用紅外控制模塊,通過按鍵控制模式選擇,基本實現(xiàn)要求。

3)顯示部分:采用LCD實時顯示小球的運動坐標(biāo)與運動信息,方便觀察與調(diào)試。

2、程序設(shè)計思路

(2)程序流程圖

1、主程序流程圖

如圖3.2.1所示為主程序流程圖,當(dāng)按下按鍵時,檢測按鍵狀態(tài),實現(xiàn)對應(yīng)功能要求,過程如下:攝像頭檢測小球運動的軌跡,處理后,輸出PWM波,控制舵機轉(zhuǎn)動角度,同時攝像頭檢測小球運動狀態(tài),判斷是否達到指定區(qū)域。若沒有,繼續(xù)調(diào)整舵機,直至到達指定區(qū)域為止。

4 

圖3.2

2、小球運動檢測程序流程圖

小球檢測的前提是獲取平板的坐標(biāo)系,每次系統(tǒng)上電時完成坐標(biāo)系的標(biāo)定,攝像頭進行圖像的獲取,小球位置實時檢測流程圖如圖3.2.2.2所示。

5 

圖3.2.2小球位置檢測流程圖

3、執(zhí)行機構(gòu)控制算法流程圖

小球的目標(biāo)位置與實際測得的位置有偏差,運用PID控制器計算舵機輸出量,通過MG996R舵機和曲柄連桿結(jié)構(gòu)帶動平板,實現(xiàn)系統(tǒng)功能,控制算法如圖3.2.2.3所示。

                                           6

圖3.2.3 PID位置控制算法

 

四、測試方案與測試結(jié)果1、測試方案

測量前,首先檢測直流穩(wěn)壓電源和舵機是否工作正常,測量時,使用秒表測量小球運動時間和停留時間,觀察實驗結(jié)果。

2、測試條件與儀器

測試條件:檢查多次,仿真電路和硬件電路必須與系統(tǒng)原理圖完全相同,并且檢查無誤,硬件電路保證無虛焊。

測試儀器:秒表,小球(直徑小于2cm)。

3、測試結(jié)果及分析(1)測試結(jié)果(數(shù)據(jù))

1)基本要求

① 小球在區(qū)域2內(nèi)停留不少于5s。

測試方法:將球丟到平板上,記錄小球在區(qū)域2停留的時間。

測試結(jié)果:小球可以實現(xiàn)在區(qū)域2穩(wěn)定5s以上。

② 控制小球在15s內(nèi)從區(qū)域1運動到區(qū)域5,且在區(qū)域5停留2s以上。

測試方法:手動將小球放置在區(qū)域1內(nèi),啟動1-5模式,并開始計時,記

錄小球從區(qū)域1到區(qū)域5所用時間以及在區(qū)域5停留的時間。

測試結(jié)果:小球可以完成從區(qū)域1到區(qū)域5,并且在區(qū)域5停留時間在2s以上,未進入其他區(qū)域。

③ 控制小球在20s內(nèi)完成從區(qū)域1到區(qū)域4,在區(qū)域4停留2s以上,之后

進入?yún)^(qū)域5,在區(qū)域5停留2s以上。

測試方法:手動將小球放置在區(qū)域1內(nèi),啟動1-4-5模式,并開始計時,記錄小球完成兩個動作的總時間以及在區(qū)域4和區(qū)域5停留的時間。

測試結(jié)果:小球可以完成從區(qū)域1到區(qū)域4再到區(qū)域5,并且在區(qū)域4,區(qū)域5停留時間均達到2s以上。

④控制小球在30s內(nèi)從區(qū)域1運動到區(qū)域9,且在區(qū)域9停留2s以上。

測試方法:手動將小球放置在區(qū)域1內(nèi),啟動1-9模式,并開始計時,記錄小球完成運動的總時時間以及在區(qū)域9停留的時間。

測試結(jié)果:小球通過設(shè)置的中轉(zhuǎn)點(在區(qū)域1到區(qū)域9路徑上設(shè)置),可以完成題目要求,且在區(qū)域9停留時間2s以上。

2) 發(fā)揮部分

   ① 控制小球在40s內(nèi),從區(qū)域1先后經(jīng)過區(qū)域2和區(qū)域6停在區(qū)域9,在區(qū)域9停留2s以上。

測試方法:手動將小球放置在區(qū)域1,啟動1-2-6-9模式,并開始計時,記錄小球運動的總時間以及在區(qū)域9停留的時間。

測試結(jié)果:小球可以完成題目要求,且在區(qū)域9停留時間2s以上。

③ 通過控制使得小球從區(qū)域4出發(fā),繞區(qū)域5(不進入)做不少于3周運動后在區(qū)域9停留2s以上。

測試方法:手動將小球放置在區(qū)域4,啟動繞區(qū)域5做環(huán)繞運動的模式,

觀察小球的運動軌跡,記錄小球在區(qū)域9停留時間。

測試結(jié)果:小球在區(qū)域4出發(fā),圍繞區(qū)域5做正方形路徑,完成題目要求,且最后在區(qū)域9停留時間達2s以上。

(2)測試分析與結(jié)論

根據(jù)上述測試數(shù)據(jù),本系統(tǒng)能充分完成指標(biāo)要求,響應(yīng)速度快,可以實現(xiàn)小球在指定位置的穩(wěn)定,能夠按照指定的要求在平板上完成指定動作,測試中發(fā)現(xiàn)系統(tǒng)在平衡位置附近出現(xiàn)小幅度的抖動,分析原因是由于小球位置識別的微小偏差,解決方案是采用更精準(zhǔn)的圖像識別算法從而達到減小抖動的目的。還有機械結(jié)構(gòu)搭建得不是特別好,導(dǎo)致平板在水平方向有稍微的偏移。

綜上所述,本設(shè)計達到設(shè)計要求。

五、結(jié)論與心得

經(jīng)過這次制作,我們在設(shè)計硬件和搭建機械結(jié)構(gòu)有了更大的全局觀,提升了小組三人的合作能力,我們在面對系統(tǒng)共地問題,電路故障分析的運用也能通過設(shè)計電路來檢測。同時我們更加了解了基本圖像處理方法,對PID算法運用更熟練,為我們之后的制作過程做了很好的鋪墊。

 

六:部分程序

int main(void)

 { 

u8 msgbuf[15];//消息緩存區(qū)

u8 tm=0;

delay_init();     //延時函數(shù)初始化  

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設(shè)置中斷優(yōu)先級分組

uart_init(115200); //串口初始化為115200

uart3_init(9600);     //藍牙模塊波特率初始化-9600

 usmart_dev.init(72);//初始化USMART

 LED_Init();  //初始化與LED連接的硬件接口

KEY_Init();//初始化按鍵

LCD_Init();   //初始化LCD  

TPAD_Init(6);//觸摸按鍵初始化

 POINT_COLOR=RED;//設(shè)置字體為紅色

TIM2_Init();    //定時器2進行5ms中斷

PWM_1_Init();       //舵機pwm輸出TIM3

Remote_Init();//紅外模塊初始化--需要添加開啟

//OV7725初始化

if(OV7725_Init()==0)

{

OV7725_Window_Set(240,240,0);//設(shè)置寬度與高度,QVGA模式輸出

  OV7725_CS=0;        //關(guān)閉位選

}

EXTI8_Init();//使能外部中斷8,捕獲幀中斷

LCD_ShowString(135,282,297,12,12,"KD_X:");

 

T_X=0;

T_Y=0;                    

 while(1)

{

   OV7725_camera_refresh();//更新顯示,進行尋點尋點操作

remote_key();          //紅外鍵值獲取,模式切換

      LCD_Show();            //lcd顯示函數(shù)

}  

}

 

 

Pid算法程序:

 

V_X = (X_white-Error_X_Last)/T;

V_Y = (Y_white-Error_Y_Last/T;

Set_point();  //紅外控制函數(shù)

//===計算坐標(biāo)偏差值===////===計算速度偏差值===//

 Error_X=X_white-T_X;Error_V_X=V_X;

    Error_Y=Y_white-T_Y;Error_V_Y=V_Y;

 //=位置計算微分偏差值=////=速度計算微分偏差值=//

    Bais_X=Error_X-Error_X_Last; Bais_V_X=Error_V_X-Error_V_X_Last;

Bais_Y=Error_Y-Error_Y_Last; Bais_V_Y=Error_V_Y-Error_V_Y_Last;

//======計算相對偏離位置用于計算速度======//

if(Bais_X!=0||Bais_Y!=0)

{

D_Bais_X=Bais_X;

D_Bais_Y=Bais_Y;

}

//============PID計算位置環(huán)PWM============//

//計算位置環(huán)PWM

PWM_X_P=(KP_X*Error_X + KD_X*D_Bais_X);

PWM_Y_P=(KP_Y*Error_Y + KD_Y*D_Bais_Y);

//============PID計算速度環(huán)PWM============//

PWM_V_X_P=(KP_V_X*Error_V_X + KD_V_X*Bais_V_X); PWM_V_Y_P=(KP_V_Y*Error_V_Y + KD_V_Y*Bais_V_Y);

//=============計算總輸出PWM==============//

PWM_X=PWM_X_P+zhongzhi_X+PWM_V_X_P;

PWM_Y=PWM_Y_P+zhongzhi_Y+PWM_V_Y_P;

   //================PWM限幅=================//

if(PWM_X>1850) PWM_X=1850;

if(PWM_X<1200) PWM_X=1200;//X軸限幅1157+-200

if(PWM_Y>1550) PWM_Y=1500;

if(PWM_Y<850) PWM_Y=850;//Y軸限幅1405+-200

    //=========保存(坐標(biāo),速度)偏差=========//

Error_X_Last=Error_X;                      

Error_Y_Last=Error_Y;

 

 

圖像處理函數(shù):

for(i=0;i

 {

//    length_white=0;//換行清零 方案B啟用

for(j=0;j

{

   OV7725_RCK_L;

color=GPIOC->IDR&0XFF;//讀數(shù)據(jù)

OV7725_RCK_H;

color<<=8;  

OV7725_RCK_L;

color|=GPIOC->IDR&0XFF;//讀數(shù)據(jù)

OV7725_RCK_H;

LCD->LCD_RAM= color;//顯示rgb像素點

      //獲取RGB圖像并對其計算

gm_red = color>>11;

         gm_green = (color&0x07E0)>>5;

gm_blue = color&0x001F;

gray=(gm_red*19595 + gm_green*38469 +gm_blue *7472) >> 16;

if(gray>42) //白色處理

{

//LCD->LCD_RAM= WHITE;

if(((i>15&&i<220)&&(j>15&&j<220)))  //過濾掉周圍環(huán)境的噪點,

{

total_white++;

x_total_white +=i;

y_total_white +=j;

}

}

m=(x_total_white)/(total_white);

   n=(y_total_white)/(total_white);//計算坐標(biāo)  

   if(m>0&&n>0)//濾除0.0這個點

  {

 X_white=m;

 Y_white=n;

 if(total_white>20)//只標(biāo)記最大的白色球體

{

devieat = (u8)(sqrt(total_white/3.14));//根據(jù)面積求出白球半徑

}

LCD_Draw_Circle(Y_white,X_white,devieat);//在lcd上畫圓標(biāo)記

LCD_Draw_Circle(Y_white,X_white,devieat+1);//在lcd上畫圓標(biāo)記

 

全部回復(fù)(1)
正序查看
倒序查看
2019-10-31 09:47

更新更新啊~

0
回復(fù)
發(fā)