引 言 1、 系統方案設計、比較與論證 1.1、尋跡線探測模塊 1.2、電動機及其驅動模塊的選擇 1.3、信息顯示模塊 1.4、電源選擇 2、系統總體設計方案 3、系統硬件電路設計 3.1、單片機最小系統 3.2、尋跡線探測電路設計 3.3、聲控檢測電路設計 3.4、光電檢測乒乓球位置電路設計 3.5、 電動機驅動電路設計 4、系統軟件設計 4.1、系統流程圖 5 系統測試 5.1測試條件 5.2測試參數 參考文獻
簡易射門機器人
摘要:本設計采用了STC89C52單片機作為電動車的檢測和控制核心,通過光電探頭檢測路面黑色尋跡線,使小車按預定軌道行駛,由光電傳感器檢測乒乓球位置,并進行射門。通過鍵盤控制和LCD12864液晶顯示電路對小車的運動軌跡進行記錄和顯示切換,最后通過軟件設計,實現了小車按軌道行駛、射門等功能。
引 言為使機器人能在設定的場地范圍內行動,能在指定區域內尋找到乒乓球,并進行射門動作,按題目要求準確運行,故采用了單片機STC89C52最小系統作為電動車的檢測和控制系統。通過光電探頭檢測路面黑色尋跡線,使小車按預定軌道行駛。 1、 系統方案設計、比較與論證根據題目要求分以下部分進行方案設計與論證
1.1、尋跡線探測模塊 探測路面黑色尋跡線的原理:光線照射到路面并反射,由于黑線和白紙的反射系數不同,可根據接受到反射光強弱由傳感器產生高低電平并最終通過單片機判斷是否到達黑線偏離跑道。 方案一:由可見光發光二極管與光敏二極管組成的發射-接收電路。該方案成本較低,易于制作,但其缺點在于周圍環境光源會對光敏二極管的工作產生很大干擾,一旦外界光亮條件改變,很可能造成誤判和漏判;如果采用超高亮發光管和高靈敏度光敏管可以降低一定的干擾。 圖1 光電檢測電路 方案二:自制紅外探頭電路。此種方法簡單,價格便宜,靈敏度可調,但易受到周圍環境影響,特別是較強光照對檢測信號的影響,會造成系統不穩定。再加上時間有限,制作分立電路較繁瑣。 基于上述考慮,為了提高系統信號采集檢測的精度,我們采用方案一。 1.2、電動機及其驅動模塊的選擇根據題目中小車行駛全程的時間要求,可知小車的行駛速度很慢,普通的電機很難滿足此速度要求,而伺服電機可以滿足此要求,伺采用脈沖控制比較容易實現起跑停,并且其具有很大的轉動力矩,不會在傾斜面出現堵轉情況。故我們采用伺服電機。 在選用驅動模塊方面由以下兩種方案:采用專用驅動芯片。該芯片集成度高,占用空間小,主要應用于電機調速場合。采用分立三極管驅動電路。經分析此機器人小車所要求的功能比較簡單,不需復雜的調速,采用脈沖控制。故我們最后決定用后方案。 1.3、信息顯示模塊 采用LED,缺點是占用單片機接口太多,顯示信息量少,需要循環顯示,占用太多程序資源。采用LCD12864,占用11個單片機接口,同時顯示信息量大,靈活多變顯示多種信息。因此,我們擬采用后者。 1.4、電源選擇方案一:所有器件采用單一電源(6節五號電池)。這樣供電比較簡單,但是由于電動機啟動瞬間電流很大,會造成電壓不穩、有毛刺等干擾,嚴重時可能會造成單片機系統掉電,使之不能完成預定行程。 方案二:單電源兩路供電。電動機驅動電源采用6節五號電池無穩壓供電,單片機及其外圍電路電源采用5V穩壓電源供電,這樣兩路互不影響。 根據以上綜合考慮,故擬采用方案二。 經過一番仔細的論證比較,我們最終確定的系統詳細方框圖如下: 圖2 系統方案設計圖 2、系統總體設計方案根據題目的基本要求,設計任務主要完成機器人在規定時間內按規定路徑穩定行駛,并能進行射門,同時對行程中的有關數據進行處理顯示。整個系統的模塊框圖如圖1所示。 圖3 系統總體設計框圖 該系統主要由電動機驅動模塊、尋跡線探測模塊、紅外避障礙、信息顯示模塊幾個部分組成。由89C52單片機為系統控制的CPU對小車尋跡、乒乓球檢測和LED顯示進行控制,使小車在規定的時間內完成規定的路線,并檢測乒乓球送入球門,完成題目的要求。 3、系統硬件電路設計
3.1、單片機最小系統 圖4 單片機最小系統
該最小系統主要采用STC89C52用為電路的控制芯片。 3.2、尋跡線探測電路設計采用光電探測器,該探頭輸出端只有三根線(電源線、地線、信號線),只要將信號線接在單片機的I/O口,然后不停地對該I/O口進行掃描檢測,當其為低電平時則檢測到白紙,否則為高電平時則檢測到黑線區域。小車前進(倒退)時,始終保持黑線在車頭二個傳感器之間,當小車偏離黑線時,探測器一旦探測到有黑線,單片機就會按照預先編定的程序發送指令給小車的控制系統,控制系統再對小車路徑予以糾正。當小車回到了軌道上時,車頭兩個探測器都只檢測到白紙,則小車繼續直線行走,否則小車會持續進行方向調整操作,直到小車恢復正常。 3.3、聲控檢測電路設計電路采用LM358作為比較器。當有響聲時,話筒將聲音信號轉換為電信號,經三極管放大,運放比較輸出。因為輸出信號有抖動,對單片機的接收有所干擾。考慮到I/O口接收的問題,電路多加了延時電路,能更好的防止抖動。 圖5 聲控檢測電路 3.4、光電檢測乒乓球位置電路設計
圖6 光電乒乓球檢測電路 乒乓球檢測電路與尋跡電路相原相同,只是乒乓球檢測電路光電傳感器靈敏度不要尋跡那么靈敏。 3.5、 電動機驅動電路設計該電路電機采用脈沖擊驅動,根據脈PWM不同進而控制電機的前進和后退以及左右轉向。 4、系統軟件設計
4.1、系統流程圖 圖7 系統流程圖
當開機時,系統上電復位,各項初始化,系統等待1秒鐘,檢測聲控,然后進入自動運行狀態。 為機器人小車運行及方向調整程序,使小車按預定路線運行,并且在小車偏離軌道后自動調整走向使小車自動返回預定路線,當檢測到兵時,停兩秒并聲音提示,然后進行射門,并且控制LCD實時顯示運行時間,軌跡,距離。 5 系統測試5.1測試條件在指定區域內測試,指定區域用白紙鋪設,黑線寬度為2cm,防守者為易拉罐,直徑為5.5cm,高度為13.2cm,防守者為黑色。 乒乓球為白色,內填充物重量為45克。 5.2測試參數5.2.1電機轉速測試 5.2.2小車行駛過程測試 5.2.3系統誤差測試
參考文獻【1】 吳少軍、劉光斌 編著《單片機實用低功耗設計》 人民郵電出版社 【2】周航慈 編著 《單片機應用程序設計》 北京航空航天大學出版社 【3】譚浩強. C語言程序設計(第二版). 北京:清華大學出版社,2000
附錄:
單片機源程序如下:
- #include<reg51.h> //庫函數
- #include<delay_12t.h>//調用延時函數
- #include<Interrupt.h>//中斷函數
- #include"12864.h" //顯示程序
-
- unsigned char code pic2[]; //定義地圖表格
-
- uchar tr_num[]={243,245,240,249,252,241,239,247};
-
- /********特殊功能位定義********/
- sbit SE_right=P3^6; //右電機
- sbit SE_left=P3^7; //左電機
-
- sbit Road_IR_right=P1^2; //右光電接收
- sbit Road_IR_center=P1^1; //中光電接收
- sbit Road_IR_left=P1^0; //左光電接收
-
- sbit key1 =P3^4; //按鍵1
- sbit key2 =P3^5; //按鍵2
-
- sbit Voice_IR=P1^7; //聲控接收
- sbit Speaker=P2^4; //聲光報警控制
-
- sbit Ball_IR1=P1^3; //球檢測到位2
- sbit Ball_IR2=P1^4; //球檢測到位1
- /************end******************/
-
- /***********位定義***************************/
- bit Cross_flag=0; //十字交點檢測標志位
- bit Ball_OK=0; //球找到
- bit Ball_turn=0; //帶球
- bit Start_flag=0; //啟動標志位
- bit End_flag =0; //結束標志位
- bit Ball_detection=0; //啟動檢測球 標志位
- bit Sub_flag=0; //減速標志位
- bit key_flag=0; //
- bit key_start=0;
- /*************end***************************/
-
- /******全局變量聲明************/
- uchar motor_num=0; //小車速度控制
- uchar road_miao=0; //小車行走的時間 秒
- uchar road_fen=0; //小車行走的時間 分
- uchar Cross_num=0; //十字交點計數
- uint Ex_num=0; //進入中斷次數
- uint Travel_num=0; //路程計算
- uchar End_num=0; //忙區距離檢測距離數
-
- /************end*******************/
-
- /************函數聲明******************/
- void forward(void); //小車向前行走
- void backward(void); //向后走
- void left_turn(uchar z); //左轉
- void right_turn(uchar z); //右轉
- void Tracing_forward(void); // 尋跡檢測向前
- void Turn_control(void); //轉彎控制
- void Find_ball(void); //尋找球
- void Start_tract(); //出發函數
- void display_init(void); //顯示初始化
- void display_end(void) ; //最后數據綜合顯示
- void cease(); //小車停止
- void display_end_dispose(void); //最后顯示處理優化
- void keyboard();//按鍵掃描
-
- /*************end*********************/
-
- //******定時器0中斷入口*****
- void to() interrupt 1
- {
- static unsigned char T0_num1,T0_num2,T0_num3;
- TH0=(65536-10000)/256;
- TL0=(65536-10000)%256;
-
- /*********行走時間計算 *****************/
- if(End_flag==0)
- {
- T0_num1++;
- if(T0_num1==100) //行走時間計算
- {
- T0_num1=0;
- road_miao++;
- if(road_miao==60)
- {
- road_miao=0;
- road_fen++;
- }
- }
- }
- /*********十字路口計數***********/
- if(Cross_flag==1) //十字路口計數
- {
- T0_num2++;
- if(T0_num2==25)
- {
- Cross_num++; //十字路口計數加1
- picture(Cross_num);
- Turn_control();
- Cross_flag=0;
- T0_num2=0;
- }
- }
- /***************檢測到球停止兩秒************************/
- if(Ball_OK==1&&Ball_turn==0)
- {
- T0_num3++;
- if(T0_num3==200)
- {
- T0_num3=0;
- Ball_turn=1; //準備運球
- Speaker=1;
- }
- }
- }
-
- /**********************************
- 函數名稱:EX1() interrupt
- 功能 :外部中斷1入口 ,用來測行
- 參數 :無
- 返回值 :無
- ***** ******************************/
- void ex2() interrupt 2 using 2
- {
- // Travel_num+=11;
- Ex_num++;
- if(Ex_num==8)
- {
- Ex_num=0;
- }
- }
-
- /****************************************/
- /* 主函數 */
- /****************************************/
- void main()
- {
- display_init(); //顯示初始化,啟動默認模式初始化
- EX_init(); //外部 中斷初始化
- _delay_ms(1000);
- while(!Voice_IR);
- Start_tract();
- Timer_init(); //定時器初始化
- while(1)
- {
- if(End_flag==0)
- {
- Find_ball(); //避開障礙,找到球射門
- }
- else
- if(End_flag==1&&key_start==0)
- {
- display_end_dispose();//最后顯示處理優化
- _delay_ms(10);
- key_start=1;
- }
- if(key_start)
- {
- keyboard();
- }
- }
- }
-
- /**********************************
- 函數名稱:Forward(void)
- 功能 :小車向前行走
- 參數 :無
- 返回值 :無
- ***********************************/
- void forward(void)
- {
- SE_left=1;
- _delay_us(1700);
- SE_left=0;
- SE_right=1;
- _delay_us(1300);
- SE_right=0;
- _delay_ms(20);
- }
-
- /**********************************
- 函數名稱:Forward(void)
- 功能 :小車向前行走減速
- 參數 :無
- 返回值 :無
- ***********************************/
- void forward_s(void)
- {
- SE_left=1;
- _delay_us(1680);
- SE_left=0;
- SE_right=1;
- _delay_us(1320);
- SE_right=0;
- _delay_ms(20);
- }
-
- /**********************************
- 函數名稱:backward(void)
- 功能 :小車向后行走
- 參數 :無
- 返回值 :無
- ***********************************/
- void backward(void)
- {
- SE_right=1;
- _delay_us(1700);
- SE_right=0;
- SE_left=1;
- _delay_us(1300);
- SE_left=0;
- _delay_ms(20);
- }
-
- /**********************************
- 函數名稱:Left_turn
- 功能 :小車左轉
- 參數 :z:設定旋轉量
- 返回值 :無
- ***********************************/
- void left_turn(uchar z)
- {
- uchar i;
- for(i=z;i>0;i--)
- {
- SE_left=1;
- _delay_us(1300);
- SE_left=0;
- SE_right=1;
- _delay_us(1300);
- SE_right=0;
- _delay_ms(20);
- }
- }
-
- /**********************************
- 函數名稱:cease()
- 功能 :小車停止
- 參數 :無
- 返回值 :無
- ***********************************/
- void cease()
- {
- SE_left=1;
- _delay_us(1500);
- SE_left=0;
- SE_right=1;
- _delay_us(1500);
- SE_right=0;
- _delay_ms(20);
- }
-
- /**********************************
- 函數名稱:Right_turn
- 功能 :小車右轉
- 參數 :z:設定旋轉量
- 返回值 :無
- ***********************************/
- void right_turn(uchar z)
- {
- uchar i;
- for(i=z;i>0;i--)
- {
- SE_left=1;
- _delay_us(1700);
- SE_left=0;
- SE_right=1;
- _delay_us(1700);
- SE_right=0;
- _delay_ms(20);
- }
- }
-
-
- /**********************************
- 函數名稱: Tracing_forward
- 功能 :走黑線
- 參數 :無
- 返回值 :無
- ***********************************/
- void Tracing_forward(void)
- {
- if(Road_IR_right==0&&Road_IR_center==1&&Road_IR_left==0)
- {
- if(Sub_flag)
- {
- forward_s();//減速
- }
- else
- forward();
- }
- else
- if(Road_IR_right==1&&Road_IR_center==1&&Road_IR_left==1)
- {
- forward();
- Cross_flag=1;
- }
- else
- if(Road_IR_right==1&&Road_IR_center==1&Road_IR_left==0)
- {
- forward();
- }
- else
- if(Road_IR_right==0&&Road_IR_center==1&&Road_IR_left==1)
- {
- forward();
- }
- else
- if(Road_IR_right==1&&Road_IR_center==0&&Road_IR_left==0)
- {
- right_turn(2);
- }
- else
- if(Road_IR_right==0&&Road_IR_center==0&&Road_IR_left==1)
- {
- left_turn(2);
- }
- }
-
- /**********************************
- 函數名稱:Start_tract
- 功能 :出發
- 參數 :z:設定旋轉量
- 返回值 :無
- ***********************************/
- void Start_tract()
- {
- uchar i;
- while(Start_flag==0)
- {
- if(Road_IR_right==0&&Road_IR_center==0&&Road_IR_left==0)
- {
- forward();
- }
- else
- if(Road_IR_right==1&&Road_IR_center==1&&Road_IR_left==1)
- {
- for(i=0;i<12;i++)
- {
- forward();
- }
- Start_flag=1;
- }
- }
- left_turn(25);
- motor_num=100;
- }
-
- /**********************************
- 函數名稱:Turn_control
- 功能 :轉彎控制
- 參數 :無
- 返回值 :無
- ***********************************/
- void Turn_control(void)
- {
- if(Cross_num==4)
- {
- right_turn(22);
- }
- else
- if(Cross_num==6)
- {
- left_turn(22);
- Ball_detection=1;
- Sub_flag=1; //減速標志位
- }
- }
-
- /**********************************
- 函數名稱:Find_ball
- 功能 :尋找球
- 參數 :無
- 返回值 :無
- ***********************************/
- void Find_ball(void)
- {
- uchar i=0;
- if(Ball_OK==0)
- {
- Tracing_forward();
- if(Ball_detection==1)
- {
- if(Ball_IR1==0||Ball_IR2==0) //檢測到球
- {
- Sub_flag=0;
- Cross_num++;
- picture(Cross_num);
- Speaker=0;
- Ball_OK=1;
- cease(); //停止兩秒
- }
- }
- }
- if(Ball_turn==1&&End_flag==0)
- {
- for(i=0;i<30;i++) //后退
- {
- backward();
- }
- _delay_ms(1000); //后退延時,準備射門
- for(i=0;i<180;i++)
- {
- Tracing_forward(); //再次檢測黑線,對正
- }
- for(i=0;i<125;i++)
- {
- forward(); //向前
- }
- cease(); //射完門,車停
- Cross_num++;
- picture(Cross_num); //顯示坐標
- End_flag=1;
- for(i=0;i<6;i++)
- {
- display_twinkle();//球進,球門閃爍15次
- Speaker=~Speaker;
- }
- Speaker=1;
-
- display_basiccls(); //顯示初始化
- display_expandcls();
- init_12864_1();
- }
- }
-
-
- /**************************************
- 函數名:display_init()
- 功能 :初始化顯示,顯示默認模式,地圖+坐標
- ***********************************/
- void display_init(void)
- {
- Speaker=0;
- _delay_ms(500);
- Speaker=1;
- LCD_BK=0; //開背光
- init_12864_1(); //lcd初始化
- display_basiccls(); //清屏
- init_12864_2(); // 畫圖初始化
- display_picture(pic4); //初始顯示
- _delay_ms(4000);
- init_12864_1(); //lcd初始化
- display_basiccls(); //清屏
- init_12864_2(); // 畫圖初始化
- display_picture(pic2); //顯示地圖 (默認顯示)
- }
-
- /*********************************************
- 函數名:display_end
- 功能 :顯示最后數據
- **********************************************/
- void display_end(void)
- {
- display_char(0X80,"行駛路程:");
- display_char(0X90,"行駛時間:");
- display_char(0X88,"行駛速度:");
- display_baishige(0x80+5,(tr_num[Ex_num])); //路程顯示
- display_shige(0x90+5,road_fen); //分顯示
- display_char(0X90+6," :");
- display_shige(0x90+7,road_miao); //秒顯示
- display_qianbaishige(0x98+2,(tr_num[Ex_num]*10)/road_miao);
-
- }
-
- /**************************************
- 函數名:display_end_dispose()
- 功能 :結束顯示優化處理
- ***********************************/
- void display_end_dispose(void)
- {
- display_end();
- }
-
- void keyboard()
- {
- uchar i;
- if(key1==0)
- {
- _delay_ms(5);
- if(key1==0)
- {
- while(!key1);
- key_flag=~key_flag;
- }
- if(key_flag==1)
- {
- init_12864_1(); //lcd初始化
- display_basiccls(); //清屏
- init_12864_2(); // 畫圖初始化
- display_picture(pic2);
- for(i=0;i<9;i++)
- {
- picture(i);
- }
- }
- else
- if(key_flag==0)
- {
- display_basiccls(); //清屏
- init_12864_1(); //lcd初始化
- display_end();
- }
- }
- }
-
- /*********行走地圖****************/
- unsigned char code pic2[]=
- {
- 0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFF,
- 0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
- 0x98,0x61,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
- 0x90,0x41,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
- 0x9F,0xF1,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
簡易射門機器人論文.doc
(1.05 MB, 下載次數: 15)
2018-8-18 15:54 上傳
點擊文件名下載附件
|