打開小車開關和攝像頭開關,然后手機連接到wifi信號,通過將wifi接收器接收到的信號傳送給STC89C52,最后將信號傳送給小車和攝像頭進行小車的移動和攝像頭視頻的錄制。摘要隨著無線技術的發展及應用,手機藍牙及wifi技術逐漸被應用于人們生活中。針對現階段家電智能化的發展趨勢,為了實現家電的智能化控制,本文設計了以單片機為控制核心,基于手機平臺,利用WiFi技術,無線WiFi模塊,單片機模塊,將攝像頭、小車與手機APP連接在一起,手機APP的操作指令通過WiFi無線傳輸給攝像頭內部的芯片,進而根據指令做出相應改變。這種以無線連接為基礎的監視控制系統,不僅能夠實現小車的無線控制,而且體現了區域自由的優越性。
第一章 引言當今世界,傳感器技術和自動控制技術正在飛速發展,機械、電氣和電子信息已經不再明顯分家,自動控制在工業領域中的地位已經越來越重要,“智能”這個詞也已經成為了熱門詞匯,F在國外的自動控制和傳感器技術已經達到了很高的水平,特別是日本,比如日本本田制作的機器人,其仿人雙足行走已經做得十分逼真,而且具有一定的學習能力,還據說其智商已達到6歲兒童的水平。 而本次學校組織的智能循跡小車大賽也讓同學們能充分的參與到實際電子作品的設計,制作中,同時也讓同學們能在實際制作中理解傳感器系統,自動控制系統。無容置疑,人才的培養不論是在國外還是國內,都開始重視起來,主要表現在大學生的各種大型的創新比賽,比如:亞洲廣播電視聯盟亞太地區機器人大賽(ABU ROBCON)、全國大學生“飛思卡爾”杯智能汽車競賽等眾多重要競賽都能很好的培養大學生對于電子,電路,自動控制,傳感系統相關知識。學校此次的比賽對于我們來說就是很好的一個平臺,讓我們能更加的加強自己理論方面的知識,同時,增強理論與實踐相結合的發散性,創造性思維的能力。 第二章 系統方案2.1方案與選擇方案1:該智能車采用紅外傳感器對賽道進行道路檢測,單片機根據采集到的信號的不同狀態判斷小車當前狀態,通過電機驅動芯片L298N發出控制命令,控制電機的工作狀態以實現對小車姿態的控制。方案2:該智能車采用HT6221芯片控制小車的移動,單片機根據控制器發出的信號做出相應的移動,再加上小車上安裝了攝像頭對沿途的狀況記錄并傳送到手機上。綜合以上方案我們選擇方案2的設計。功能: 由遙控器控制小車進行移動,攝像機進行拍攝。
第三章 硬件3.1最小系統:小車采用atmel公司的AT89S52單片機作為控制芯片,圖1是其最小系統電路。主要包括:時鐘電路、電源電路、復位電路。其中各個部分的功能如下:1、時鐘電路:給單片機提供一個外接的16MHz的石英晶振。2、電源電路:給單片機提供5V電源。3、復位電路:在電壓達到正常值時給單片機一個復位信號。 圖2 單片機最小系統原理圖3.2遙控電路 HT6221/HT6222芯片是通用紅外遙控發射集成電路,采用CMOS工藝制造,最多可外接64個按鍵,并有三組雙重按鍵。封裝形式為SOP-24和SOP-20。 特點:1. 低壓CMOS工藝制造。2. 工作電壓范圍寬。3.通過外部接法最多可產生65536種用戶碼。4. 可通過SEL管腳選擇,最多可支持128+6條指令碼。5.SOP-24、SOP-20、COB封裝形式可選。 圖3 控制電路圖 第四章 軟件設計移動監視車的設計包括兩部分,一部分是通過手機APP與wifi連接實現的攝像顯示,另一部分是通過HT6221芯片接受控制 信號進行移動。4.1 無線鏈接
4.2軟件流程圖 第五章 測試結果將本電路用硬件做出來,用編程器將KEIL軟件對源程序編譯生成的.HEX文件燒入AT89S52單片機,將單片機插入到小車中,連好線。 將“控制模式”開關選擇在“遙控”,打開電源,小車在遙控器的控制下開始移動,攝像頭也正常工作。 測試結果表明,本系統實現了預期功能。我們還想給小車添加自動監控的功能,遇到障礙進行躲避。為了這一目標我們繼續努力。
附錄#include <REGX52.H> //包含51單片機相關的頭文件 #include <intrins.h> sbit LeftLed=P2^0; //定義前方左側指示燈端口 sbit RightLed=P0^7; //定義前方右側指示燈端口 sbit FontLled=P1^7; sbit LeftIR=P3^5; //定義前方左側紅外探頭端口 sbit RightIR=P3^6; //定義前方右側紅外探頭端口 sbit FontIR=P3^7; //定義前方正前方紅外探頭端口 sbit M1A=P0^0; //定義左側電機驅動A端 sbit M1B=P0^1; //定義左側電機驅動B端 sbit M2A=P0^2; //定義右側電機驅動A端 sbit M2B=P0^3; //定義右側電機驅動B端 sbit B1=P0^4; //定義語音識識別傳感器端口 sbit SB1=P0^6; //定義蜂鳴器端口 sbit IRIN=P3^3; //定義紅外接收端口 unsigned char code LedShowData[]={0x03,0x9F,0x25,0x0D,0x99, //定義數碼管顯示數據 0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9 unsigned char code RecvData[]={0x19,0x46,0x15,0x43,0x44,0x40,0x0D,0x0E,0x00,0x0F}; unsigned char IRCOM[7]; static unsigned int LedFlash; //定義閃動頻率計數變量 bit EnableLight=0; //定義指示燈使能位 #define ShowPort P2 //定義數碼管顯示端口 unsigned char temp = 1; void tingzhi() { M1A=0; //將M1電機A端初始化為0 M1B=0; //將M1電機B端初始化為0 M2A=0; //將M2電機A端初始化為0 M2B=0; } void qianjin() { M1A=1; M1B=0; M2A=1; M2B=0; } void houtui() { M1A=0; M1B=1; M2A=0; M2B=1; } void zuozhuan() { M1A=0; M1B=1; M2A=1; M2B=0; } void youzhuan() { M1A=1; M1B=0; M2A=0; M2B=1; } void Delay1ms(unsigned int i) { unsigned char j,k; do{ j = 10; do{ k = 50; do{ _nop_(); }while(--k); }while(--j); }while(--i); } void delay_nus(unsigned int i) //延時:i>=12 ,i的最小延時單12 us { i=i/10; while(--i); } void delay_nms(unsigned int n) //延時n ms { n=n+1; while(--n) delay_nus(900); //延時 1ms,同時進行補償 } void delayms(unsigned char x) //0.14mS延時程序 { unsigned char i; //定義臨時變量 while(x--) //延時時間循環 { for (i = 0; i<13; i++) {} //14mS延時 } } void Delay() //定義延時子程序 { unsigned int DelayTime=30000; //定義延時時間變量 while(DelayTime--); //開始進行延時循環 return; //子程序返回 } void ControlCar(unsigned char ConType) //定義電機控制子程序 {
tingzhi(); switch(ConType) //判斷用戶設定電機形式 { case 1: //前進 //判斷用戶是否選擇形式1 { //tingzhi(); //進入前進之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 //Delay1ms(50); LeftLed = 0 ; qianjin(); break; } case 2: //后退 //判斷用戶是否選擇形式2 { // tingzhi(); //進入后退之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 // Delay1ms(50); LeftLed = 1 ; houtui(); //M2電機反轉 break; } case 3: //左轉 //判斷用戶是否選擇形式3 { //tingzhi(); //進入左轉之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 // Delay1ms(50); zuozhuan(); //M2電機正轉 break; } case 4: //右轉 //判斷用戶是否選擇形式4 { // tingzhi(); //進入右轉之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 // Delay1ms(50); youzhuan(); //M1電機正轉 //M2電機反轉 break; } case 8: //停止 //判斷用戶是否選擇形式8 { tingzhi(); break; //退出當前選擇 } } } void ControlCar_yaokong(unsigned char ConType) //定義電機控制子程序 (紅外遙控單獨設置一個 switch case 語句 ) {
tingzhi(); switch(ConType) //判斷用戶設定電機形式 { case 1: //前進 //判斷用戶是否選擇形式1 { tingzhi(); //進入前進之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 Delay1ms(150); LeftLed = 0 ; qianjin(); break; } case 2: //后退 //判斷用戶是否選擇形式2 { tingzhi(); //進入后退之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 Delay1ms(150); LeftLed = 1 ; houtui(); //M2電機反轉 break; } case 3: //左轉 //判斷用戶是否選擇形式3 { tingzhi(); //進入左轉之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 Delay1ms(150); zuozhuan(); //M2電機正轉 break; } case 4: //右轉 //判斷用戶是否選擇形式4 { tingzhi(); //進入右轉之前 先停止一段時間 防止電機反向電壓沖擊主板 導致系統復位 Delay1ms(150); youzhuan(); //M1電機正轉 //M2電機反轉 break; } case 8: //停止 //判斷用戶是否選擇形式8 { tingzhi(); break; //退出當前選擇 } } } void Robot_Avoidance() //機器人避障子程序 { LeftLed=LeftIR; //前方左側指示燈指示出前方左側紅外探頭狀態 RightLed=RightIR; //前方右側指示燈指示出前方右側紅外探頭狀態 FontLled= FontIR; SB1=FontIR; if(FontIR == 0) //如果前面避障傳感器檢測到障礙物 { ControlCar(8); //停止 delay_nms (300); //停止300MS 防止電機反相電壓沖擊 導致系統復位 ControlCar(2); //后退 delay_nms (1000); //后退1500MS ControlCar(3); // delay_nms (1800); } else { ControlCar(1); //右側沒有信號時,開始向左轉一定的角度 delay_nms (10); } ControlCar(1); } //機器人循跡子程序 void Robot_Traction() //機器人循跡子程序 { LeftLed=LeftIR; //前方左側指示燈指示出前方左側紅外探頭狀態 RightLed=RightIR; //前方右側指示燈指示出前方右側紅外探頭狀態 FontLled= FontIR; SB1=LeftIR; if(LeftIR == 0 && RightIR == 0) //三個紅外檢測到黑線,就前進 { ControlCar(1); //左側沒有信號時,開始向右轉一定的角度 delay_nms (10); } else if(LeftIR == 0 && RightIR == 1) { ControlCar(3); //右側沒有信號時,開始向左轉一定的角度 delay_nms (10); } else if(LeftIR == 1 && RightIR == 0) { ControlCar(4); //右側沒有信號時,開始向左轉一定的角度 delay_nms (10); } ControlCar(8); } void main() //主程序入口 { bit RunFlag=0; //定義小車運行標志位 LedFlash=3000; //對閃燈數據進行初始化 //EX1=1; //同意開啟外部中斷1 IT1=1; //設定外部中斷1為低邊緣觸發類型 EA=1; //總中斷開啟 ControlCar(8); //初始化小車運行狀態 while(1) //程序主循環 { if(P3_2 == 0) { delay_nms(10); if(P3_2 == 0) { temp++; while(!P3_2); } } if(temp > 3) { temp = 1; } switch(temp) { case 1: ShowPort = LedShowData[1];Robot_Traction();EX1 = 0;break; case 2: ShowPort = LedShowData[2];Robot_Avoidance();EX1 = 0;break; case 3: ShowPort = LedShowData[3];EX1 = 1;break; } } } //----------紅外遙控------------------------------------------------------------- void IR_IN() interrupt 2 using 0 //定義INT2外部中斷函數 { unsigned char j,k,N=0; //定義臨時接收變量 EX1 = 0; //關閉外部中斷,防止再有信號到達 delayms(15); //延時時間,進行紅外消抖 if (IRIN==1) //判斷紅外信號是否消失 { EX1 =1; //外部中斷開 return; //返回 } while (!IRIN) //等IR變為高電平,跳過9ms的前導低電平信號。 { delayms(1); //延時等待 } for (j=0;j<4;j++) //采集紅外遙控器數據 { for (k=0;k<8;k++) //分次采集8位數據 { while (IRIN) //等 IR 變為低電平,跳過4.5ms的前導高電平信號。 { delayms(1); //延時等待 } while (!IRIN) //等 IR 變為高電平 { delayms(1); //延時等待 } while (IRIN) //計算IR高電平時長 { delayms(1); //延時等待 N++; //計數器加加 if (N>=30) //判斷計數器累加值 { EX1=1; //打開外部中斷功能 return; //返回 } } IRCOM[j]=IRCOM[j] >> 1; //進行數據位移操作并自動補零 if (N>=8) //判斷數據長度 { IRCOM[j] = IRCOM[j] | 0x80; //數據最高位補1 } N=0; //清零位數計錄器 } } if (IRCOM[2]!=~IRCOM[3]) //判斷地址碼是否相同 { EX1=1; //打開外部中斷 return; //返回 } for(j=0;j<10;j++) //循環進行鍵碼解析 { if(IRCOM[2]==RecvData[j]) //進行鍵位對應 { // ControlCar(j); ControlCar_yaokong(j); //數碼管顯示相應數碼 } } EX1 = 1; //外部中斷開 } |