自己寫的關于WiFi智能小車的實驗報告,寫的不好,敬請改正
2018年全國大學生電子設計競賽
WIFI智能小車(控制類題)
摘要 隨著科學技術的發展,機器人的設計越來越精細,功能越來越復雜,智能小車作為其的一個分支,也在不斷發展。在近幾年的電子設計大賽中,關于小車的智能化功能的實現也多種多樣,因此本次我們也打算設計一智能小車,通過WiFi連接,使用PC端或手機軟件控制,使其能夠實現前進后退,攝像并將圖像傳回控制端,并實現循跡和避障等功能。 本次小車采用STC89C51單片機作為控制芯片,步進電機作為行進部件,WIFI模塊作為接受部件,紅外對管為識別器件,要求能在遙控的情況下,能在方圓20米的范圍內自由活動,且能夠識別以白底為道路色,寬度10mm左右的黑色膠帶制作的不規則的封閉曲線為引導軌跡并能沿該軌跡行進的智能小車。并能實現避障功能
Abstract
With the development of science and technology, the design of robots is becoming more and more sophisticated and functions are becoming more and more complex. As a branch of intelligent vehicles, intelligent cars are also developing. In the electronic design competition in recent years, the realization of the intelligent function of the car is also varied, so this time we also intend to design a smart car, through the WIFI connection, using the PC end or mobile software control, so that it can achieve forward back, camera and image back to the control end, and achieve tracking and obstacle avoidance and so on Function. This small car uses STC89C51 as the control chip, the stepping motor is a moving part, the WIFI module is used as the acceptance component, the infrared pair is a recognition device, and it is required to operate freely within the range of 20 meters in the square circle under the condition of remote control, can identify the black tape with the white bottom as the road color and the width of about 10mm. The production of irregular closed curves is a smart car that guides the trajectory and travels along the trajectory. And the obstacle avoidance function can be realized
目錄 一、系統方案 1.單片機模塊的選擇 2.電機控制模塊的選擇 3.無線通信模塊的論證與選擇 4.驅動模塊的選擇與論證 5.其他模塊的選擇與論證 二、系統理論分析與計算 1.系統總體設計 2.超聲波模塊的距離計算方法 三、電路與程序設計 1.電路的設計 2. 程序的設計 (1)程序功能描述與設計思路 (2) 程序流程圖 四、測試方案與測試結果 1、測試方案 2 測試條件與儀器 3 測試結果及分析 五、結論與心得 六、參考文獻 附錄(程序)
WIFI智能小車【專科組】 一、系統方案本次智能小車主要采用無線通信模塊、驅動模塊、單片機模塊、傳感器模塊、超聲波模塊、電源模塊組成。下面分別論證這幾個模塊的選擇。 1.單片機模塊的選擇方案一: 采用STC89C51為主控芯片的最小系統板,即由單片機來實現對WIFI模塊接受的信號進行處理并發出。STC89C51是一種低功耗、高性能CMOS 8位微控制器,具有4K 在系統可編程Flash 存儲器。使用Atmel 公司高密度非易失性存儲器技術制造,與工業80C51 產品指令和引腳完全兼容。片上Flash允許程序存儲器在系統可編程,亦適于常規編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統可編程Flash,使得STC89C51在眾多嵌入式控制應用系統中得到廣泛應用。 優點:操作方便,配置簡單,應用普遍。 缺點:I/O口較少,設計外部電路較為復雜。 方案二:STM32系列單片機 STM32系列為高性能、低成本、低功耗的嵌入式應用控制系統。 優點:處理速度快,片內程序存儲空間大,功耗低,資源豐富。 缺點:程序編寫要求較高,價格高。 為了能夠很好的完成題目的基本要求以及發揮部分的要求,考慮到本次小車結構簡單,不需要較為復雜的運算。所以采用方案一 2.電機控制模塊的選擇方案一:采用步進電機,其轉過的角度可以精確定位,可實現小車行進過程的精確定位。但步進電機的輸出力矩低,歲轉速的升高而降低,且轉速越快,下降的越快。 方案二:采用直流電機,其轉動力矩大,體積小,重量輕,裝配簡單,操作方便。速度的調節可以改變電壓也可以調節PWM。 基于以上方案,選擇方案二采用直流電機作為驅動電機。
3.無線通訊模塊的論證與選擇方案一:藍牙模塊 采用普遍的HC05藍牙模塊,是一種新興無線通訊技術是一個標準的無線通訊協議,基于低成本設備的收發器芯片,近距離傳輸、功耗低。屬于WPAN無線個域網,即點對點、多點對多點、主要是用來連接一些外接設備的,或者是在近距離進行數據傳輸。在2016年5月份推出的最新的版本Bluetooth5.0傳輸距離可以達到150米。 方案二:WIFI模塊 Wi-Fi模塊又名串口Wi-Fi模塊,屬于物聯網傳輸層,功能是將串口或TTL電平轉為符合Wi-Fi無線網絡通信標準的嵌入式模塊,內置無線網絡協議IEEE802.11b.g.n協議以及TCP/IP協議。傳統的硬件設備嵌入Wi-Fi模塊可以直接利用Wi-Fi聯入互聯網,是實現無線智能家居、M2M等物聯網應用的重要組成部分。其傳輸速度快。信號穿墻能力強。 綜合以上兩種方案,考慮到傳輸距離的問題,采取方案二的WIFI模塊。 4.驅動模塊的選擇與論證驅動模塊是本次智能小車的關鍵所在,直流電機的功率較大,所以必須選擇合適的驅動模塊 方案一:采用L298N模塊, L298N是一種特殊的驅動集成電路,屬于H橋集成電路, 其輸出電流增加, 功率增強。其輸出電流為2A,最高電流為4A, 最高工作電壓為50V。它可以驅動感應負載, 如大功率直流電機、步進電機、電磁閥等, 特別是其輸入端子可以直接連接到單片機, 因此單片機控制非常方便。在驅動直流電機時,它可以直接控制兩個電機, 實現電機的正反向, 使我們只能改變輸入端的邏輯電平。該系統設計所用的電機是大功率的直流電機,故在考慮范圍之內。 方案二: 中小電流電機專用驅動器, 使用芯片1298屬于H橋集成電流,輸出電流為 2000mA, 最大電流為 4A, 最大工作電壓為 36V, 可驅動感應負載,比如: 中繼電器、直流電機、步進電機和光功率晶體管, 特別是輸入可以直接與單片機連接, 可以很容易地由單片機控制。但此模塊只能驅動小型直流電機, 不能驅動大功率型的直流電機。 經過仔細反復的論證與選擇,我們發現方案一比較合適,所以我們選擇L298N模塊作為驅動模塊。 5.其他模塊的選擇與論證傳感器模塊:使用光電傳感器來采集路面信息。使用紅外光電管,其結構 簡明,實現方便,成本低廉,沒有復雜的圖像處理工作,因此反應靈敏,響應時間少。 電源模塊:采用5V直流電源作為為電機及WIFI模塊供電的電源。 超聲波模塊:SSD-ME007TX串口超聲波測距模塊是高性能,高性價比的非接觸式距離感測模塊,測量范圍在0.02~4.00m,測量精度1cm,測量時與被測物體無直接接觸,能夠清晰穩定地顯示測量結果。 二、系統理論分析與計算
1.系統總體設計智能小車系統總體框圖如圖1.1,系統工作流程為:以STC89C51單片機作為控制核心,通過手機上的APP對小車發出控制命令,小車上的WIFI芯片接收到APP發出的指令后通過串口傳輸給STC89C51單片機,開發板通過對指令的一系列處理控制小車上的相關原件:電機,來指導小車完成指導小車的動作。
0.png (12.95 KB, 下載次數: 43)
下載附件
2018-5-26 19:09 上傳
圖1.1 系統總體框圖 2.超聲波模塊的距離計算方法圖1.2示意了超聲波測距的原理,即超聲波發生器T在某一時刻發出一個超聲波信號,當該信號遇到被測物體后反射回來,被超聲波接收器R所接收到。計算從發出超聲波信號到接收到返回信號所用的時間,就可算出超聲波發生器與反射物體的距離。 圖1.2 超聲波測距原理圖 計算公式為: d = s/2 = (Vt)/2 (1) 式中:d為被測物與測距儀的距離;s為聲波來回的路程;v為聲速;t為聲波往返所用的時間。 在測量中需要考慮兩個參數:聲速和發射脈沖個數。聲速的精確程度決定了測量精度。聲速與溫度有關,測距儀多用于常溫測量距離較短,如溫度變化不大,則可認為聲速是基本不變的,約為344m/s。如測距精度要求很高,則應通過溫度補償的方法加以校正。為增強系統可靠性,應在軟硬件上采用抗干擾措施。發射超聲波脈沖個數決定測距儀測量盲區,影響測量精度,同時與信號發射能量有關。發射脈沖個數少,可提高測量精度,但減少了發射能量對接收回波不利;脈沖個數過多會增加測量盲區。在設計中經過比較,選擇發射5個40KHZ的脈沖方波作為測量信號。 三、電路與程序設計1.電路的設計1.1 控制系統原理圖圖1.1.控制系統原理圖 1.2L298N原理圖 圖1.2 L298N原理圖 1.3超聲波模塊原理圖 圖1.3超聲波原理圖 2. 程序的設計(1)程序功能描述與設計思路1、程序功能描述 通過手機或電腦控制軟件控制小車前進,后退,左轉,右轉,尋跡,避障等功能。 2、程序設計思路 根據題目要求,程序設計要做到包括小車的前進,后退,左轉,右轉。即通過程序控制直流電機的轉動和方向。尋跡;通過光電傳感器檢測到地面信號后,程序控制車輪的左轉,右轉,停止等。避障;通過超聲波模塊檢測到前方15cm處有障礙物時,傳回至單片機,單片機控制舵機左右轉動,計算出最佳路線使小車避開障礙。 (2)程序流程圖
1.主程序流程圖 圖1.4 主程序流程圖 2.WiFi模塊流程圖 圖1.5 WIFI模塊流程圖 3. 超聲波子程序流程圖
圖1.6超聲波子程序流程圖 4.尋跡模塊流程圖 圖1.7 尋跡模塊流程圖 四、測試方案與測試結果1、測試方案1.1硬件測試 焊接完成后,首先進行的調試是用數字萬用表測量各個電路是否焊接正常,是否有虛焊漏焊等現象的出現,以及各個電容是否是正常的未被擊穿狀態、電阻的阻值是否與設計的原理圖上的一致。接通電源,用數字萬用表測量當有+5V的各引腳是否有+5V的電壓,測量電路中是否出現了不該有的短路現象。接入光電傳感器模塊,使各個光電檢測器的光電管靠近白紙,觀察對應的發光二極管是否發光,不發光表示正常。 然后再使各個光電管靠近黑線,觀察對應的發光二級管是否發光,發光表示正常。 通過手機或PC端軟件連接WIFI,控制小車相應功能是否實現。 1.2硬件軟件聯調 通過編寫簡單的關于電機轉動方向程序,觀察目的轉動方向與實際轉動方向是否一致,軟件都調試無誤后,進入系統最后的軟件編寫調試。 2 測試條件與儀器測試條件:帶有尋跡條件的場地(在地板上貼有黑膠帶、適當障礙物) 測試儀器:數字萬用表、手機或PC端軟件 3 測試結果及分析3.1測試結果(數據) 小車速度對尋跡的影響 WIFI信號強弱對通訊的影響
3.2測試分析與結論 根據上述測試數據,此系統所有硬件電路都正常工作,系統工作穩定,可實現下述功能: 1.能夠通過WIFI控制智能小車的前進后退等功能。 2.能夠傳輸視頻信號到設備上。 3.能夠一鍵尋跡。 4.能夠通過超聲波模塊實現避障功能。 五、結論與心得經過自己不斷的搜索努力以及老師的耐心指導和熱情幫助,本設計已經基本完成。在這個過程中老師以及曾做過此類設計的同學給予了我很大的幫助,給我提供了大量的硬件和軟件資料,也給我的設計提出了寶貴的意見和建議。在此,對大家表示衷心的感謝!這次設計不僅是對我的專業知識的一次集中地檢驗,同時也為我們提供了一個進入職場前的實戰機會;通過這次在老師指導下做設計的機會,我對于技術實踐方面有了更深刻的認識,也進一步夯實了所學的專業知識。雖然在設計中對于知識的運用和銜接還不夠熟練。但是我將在以后的工作和學習中繼續努力、不斷完善。這設計是對過去所學知識的系統提高和擴充的過程,為今后的發展打下了良好的基礎。由于自身水平有限,設計中一定存在很多不足之處,敬請老師批評指正 六、參考文獻[1] 單片機C語言教程 郭天祥 電子工業出版社 [2] 譚浩強.C語言程序設計[M].北京:清華大學出版社,2012. [3] 黃智偉 全國大學生電子設計競賽訓練教程. [M].修訂版.北京:電子工業出版社 附錄(程序)- #include <STC12C5A.h> //包含STC12C5A系列單片機的頭文件
-
- /*晶振為22.1184MHz 以下為可選波特率*/
- #define BPS_9600 0x70
- #define BPS_19200 0xB8
- #define BPS_38400 0xDC
- #define BPS_57600 0xE8
- #define BPS_11520 0xF4
-
-
- #define Left_moto_go1 {P10=1,P12=1;} //左邊兩個電機向前走
- #define Left_moto_back1 {P10=0,P12=0;} //左邊兩個電機向后轉
- #define Right_moto_go1 {P14=1,P16=1;} //右邊兩個電機向前走
- #define Right_moto_back1 {P14=0,P16=0;} //右邊兩個電機向前走
-
-
- #define Left_moto_go {P10=1,P11=0,P12=1,P13=0;} //左邊兩個電機向前走
- #define Left_moto_back {P10=0,P11=1,P12=0,P13=1;} //左邊兩個電機向后轉
- #define Left_moto_Stop {P10=0,P11=0,P12=0,P13=0;} //左邊兩個電機停轉
- #define Right_moto_go {P14=1,P15=0,P16=1,P17=0;} //右邊兩個電機向前走
- #define Right_moto_back {P14=0,P15=1,P16=0,P17=1;} //右邊兩個電機向前走
- #define Right_moto_Stop {P14=0,P15=0,P16=0,P17=0;} //右邊兩個電機停轉
-
- #define Left_2_led P24 //
- #define Right_1_led P25 //
-
- #define Left_moto_pwm P11 //PWM信號端
- #define Left_moto_pwm1 P13
- #define Right_moto_pwm P15
- #define Right_moto_pwm1 P17
-
-
- #define RELOAD_COUNT BPS_9600 //波特率選擇
-
-
- sbit TEST_WEEL =P0^0; //測試電機
- sbit TEST_SEVR =P0^1; //測試舵機
- sbit LED5 = P0^2; //接收指示燈
-
-
- bit rec_flag=0;
- unsigned char buffer[5];
- unsigned char se_timer[5]={0x0A,0x5a,0,0,0};
- unsigned int time=0;
-
- unsigned char pwm_val_left =0;//變量定義
- unsigned char push_val_left =0;// 左電機占空比N/10
- unsigned char pwm_val_right =0;
- unsigned char push_val_right=0;// 右電機占空比N/10
- bit Right_moto_stop=1;
- bit Left_moto_stop =1;
-
- void Delaynms(unsigned int di) //延時
- {
- unsigned int da,db;
- for(da=0;da<di;da++)
- for(db=0;db<1000;db++);
- }
-
-
- //前速前進
- void run(void)
- {
-
- Left_moto_go ; //左電機往前走
- Right_moto_go ; //右電機往前走
- }
-
- //前速后退
- void backrun(void)
- {
-
- Left_moto_back ; //左電機往前走
- Right_moto_back ; //右電機往前走
- }
-
- //左轉
- void leftrun(void)
- {
-
- Left_moto_back ; //左電機往前走
- Right_moto_go ; //右電機往前走
- }
-
- //右轉
- void rightrun(void)
- {
-
- Left_moto_go ; //左電機往前走
- Right_moto_back ; //右電機往前走
- }
- //STOP
- void stoprun(void)
- {
-
- Left_moto_Stop ; //左電機往前走
- Right_moto_Stop ; //右電機往前走
- }
-
-
- void UART_init(void)
- {
- // PCON |= 0x80; //使能波特率倍速位SMOD
- // SCON = 0x50; //8位數據,可變波特率
- // BRT = RELOAD_COUNT; //設定獨立波特率發生器重裝值
- // AUXR |= 0x04; //獨立波特率發生器時鐘為Fosc,即1T
- // AUXR |= 0x01; //串口1選擇獨立波特率發生器為波特率發生器
- // AUXR |= 0x10; //啟動獨立波特率發生器
-
- PCON |= 0x80; //使能波特率倍速位SMOD
- SCON = 0x50; //8位數據,可變波特率
- AUXR |= 0x04; //獨立波特率發生器時鐘為Fosc,即1T
- BRT = 0xB8; //設定獨立波特率發生器重裝值
- AUXR |= 0x01; //串口1選擇獨立波特率發生器為波特率發生器
- AUXR |= 0x10; //啟動獨立波特率發生器
-
-
- PS = 1;
- ES = 0; //允許串口中斷
- TI = 1;
- }
-
- /*****************************************************
- void UART_send_byte(unsigned char byte)
- {
- ES = 0; //關串口中斷
- TI = 0; //清零串口發送完成中斷請求標志
- SBUF = byte;
- while(TI ==0); //等待發送完成
- TI = 1; //清零串口發送完成中斷請求標志
- ES = 1; //允許串口中斷
- }
- *****************************************************/
-
- void Communication_Decode(void)
- {
- if(buffer[0]==0x00)
- {
- TR1=0;ET1=0; //關閉中斷不尋跡
- stoprun();
- switch(buffer[1])
- {
- case 0x01: run(); break;
- case 0x02: backrun(); break;
- case 0x03: leftrun(); break;
- case 0x04: rightrun(); break;
- case 0x00: stoprun(); break;
- default: return;
- }
- }
- else if(buffer[0]==0x01)
- {
- TR1=0;ET1=0; //關閉中斷不尋跡
- stoprun();
-
- if(buffer[2]>180)
- return;
- switch(buffer[1])
- {
- case 0x01:
- {
- se_timer[0]=buffer[2];
- if(se_timer[0]<11)se_timer[0]=11;
- if(se_timer[0]>162)se_timer[0]=162;
- }
- return;
- case 0x02:
- {
- se_timer[1]=buffer[2];
- if(se_timer[1]<11)se_timer[1]=11;
- if(se_timer[1]>162)se_timer[1]=162;
- }
- return;
- //case 0x03:se_timer[2]=buffer[2]; return;
- //case 0x04:se_timer[4]=buffer[2]; return;
- default : return;
- }
- }
- else if((buffer[0]==0x09)&&(buffer[1]==0x09))
- {
- switch(buffer[2])
- {
- case 0x00: TR1=1;ET1=1; break; //尋跡
- case 0x01: break; //避障
- default: return;
- }
- }
- else
- {
- return;
- }
- }
-
- void UART_Interrupt_Receive(void) interrupt 4
- {
- static unsigned char i;
-
- if(RI==1)
- {
- RI = 0;
-
- if(rec_flag==0)
- {
- if(SBUF==0xff)
- {
- rec_flag=1;
- i=0;
- }
- }
- else
- {
- if(SBUF==0xff)
- {
- rec_flag=0;
- if(i==3)
- {
- Communication_Decode();
- }
- i=0;
- }
- else
- {
- buffer[i]=SBUF;
- i++;
- }
- }
- }
- else
- {
- TI = 0;
- }
- }
-
-
- void Timer0_Init(void)
- {
- TMOD &= 0xf0;
- TMOD |= 0x02;
- AUXR |= 0XC0;
- // TH0=10; // 22.1184
- // TL0=10; //
-
- TH0=133; // 22.1184
- TL0=133; //
-
- TR0=1;
- ET0=1;
- }
-
- void Timer1_Init(void)
- {
-
- TMOD &= 0x0f;
- TMOD |= 0x10;
- // TH1 = 0xA9; //1MS定時 22.1184
- // TL1 = 0x9A;
-
- TL1 = 0xCD; //設置定時初值1MS定時 11.0592
- TH1 = 0xD4; //設置定時初值
- TR1 = 0; //開定時器1
- ET1 = 0;
-
- }
-
- void Timer_0(void) interrupt 1 //舵機控制程序
- {
-
- time++;
- if(time<=se_timer[0]+45)
- P27=1;
- else P27=0;
-
- if(time<=se_timer[1]+45)
- P26=1;
- else P26=0;
-
-
- if(time>=1800)
- {
- time=0;
- }
-
- }
-
- /************************************************************************/
- /* PWM調制電機轉速 */
- /************************************************************************/
- /* 左電機調速 */
- /*調節push_val_left的值改變電機轉速,占空比 */
- void pwm_out_left_moto(void)
- {
- if(Left_moto_stop)
- {
- if(pwm_val_left<=push_val_left)
- {
- Left_moto_pwm=1;
- Left_moto_pwm1=1;
- }
- else
- {
- Left_moto_pwm=0;
- Left_moto_pwm1=0;
- }
- if(pwm_val_left>=10)
- pwm_val_left=0;
- }
- else
- {
- Left_moto_pwm=0;
- Left_moto_pwm1=0;
- }
- }
- /******************************************************************/
- /* 右電機調速 */
- void pwm_out_right_moto(void)
- {
- if(Right_moto_stop)
- {
- if(pwm_val_right<=push_val_right)
- {
- Right_moto_pwm=1;
- Right_moto_pwm1=1;
- }
- else
- {
- Right_moto_pwm=0;
- Right_moto_pwm1=0;
- }
- if(pwm_val_right>=10)
- pwm_val_right=0;
- }
- else
- {
- Right_moto_pwm=0;
- Right_moto_pwm1=0;
- }
- }
-
-
- void Timer_1(void) interrupt 3
- {
- // static unsigned int ms_count=0;
-
- TL1 = 0xCD; //設置定時初值1MS定時 11.0592
- TH1 = 0xD4; //設置定時初值
-
- pwm_val_left++;
- pwm_val_right++;
- pwm_out_left_moto();
- pwm_out_right_moto();
-
- // if(ms_count++ >= 100)
- // {
- // ms_count = 0;
-
- if(Left_2_led==0&&Right_1_led==0)
- {
- Left_moto_go1;
- Right_moto_go1 ; //右電機往前走
- }
-
- else
- {
- if(Right_1_led==1&&Left_2_led==0) //右邊檢測到黑線
- {
- // rightrun(); //右轉
- Left_moto_go1 ; //左電機往前走
- Right_moto_back1 ; //右電機往前走
- }
-
- if(Left_2_led==1&&Right_1_led==0) //左邊檢測到黑線
- {
-
- // leftrun(); //左轉
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
完整的Word格式文檔51黑下載地址(內含清晰圖片):
WiFi智能小車2.docx
(420.06 KB, 下載次數: 31)
2018-5-26 09:35 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|