機(jī)器人創(chuàng)新實(shí)驗(yàn)指導(dǎo)書_第1頁
機(jī)器人創(chuàng)新實(shí)驗(yàn)指導(dǎo)書_第2頁
機(jī)器人創(chuàng)新實(shí)驗(yàn)指導(dǎo)書_第3頁
機(jī)器人創(chuàng)新實(shí)驗(yàn)指導(dǎo)書_第4頁
機(jī)器人創(chuàng)新實(shí)驗(yàn)指導(dǎo)書_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、 機(jī)器人創(chuàng)新實(shí)驗(yàn)( 3) 實(shí)驗(yàn)指導(dǎo)書 機(jī)器人實(shí)驗(yàn)室 實(shí)驗(yàn)一熟悉機(jī)器人與C51單片機(jī)硬件軟件 一、實(shí)驗(yàn)?zāi)康?1、掌握寶貝車機(jī)器人用 C51 教學(xué)板與計(jì)算機(jī)硬件連接和寶貝車基本結(jié)構(gòu); 2、熟悉及掌握C51系列單片機(jī)Keil uVision IDE (集成幵發(fā)環(huán)境)軟件、ISP 下載軟件及串口調(diào)試終端的使用方法。 二、實(shí)驗(yàn)設(shè)備及軟件 寶貝車機(jī)器人套件、 ISP 下載線、串行接口線、計(jì)算機(jī)、電源。 Keil uVisio n2 IDE 集成幵發(fā)環(huán)境、PROGISP1.72下載軟件、串口調(diào)試軟件。 三、實(shí)驗(yàn)內(nèi)容和步驟 單片機(jī)控制的寶貝車機(jī)器人是通過串并口或USB接口通信交互,由硬件系統(tǒng)與 軟件系統(tǒng)相互結(jié)

2、合組成的一個完整的智能控制系統(tǒng)。單片機(jī)必須與外圍設(shè)備及軟件 組成一個完整的應(yīng)用系統(tǒng)(如圖 1.1)。 1、熟悉寶貝車機(jī)器人的結(jié)構(gòu)組成(如圖1.2):小車底板、車輪、教學(xué)板、伺 MCU 是由 Atmel 服電機(jī)、電池盒。這是寶貝車機(jī)器人的硬件系統(tǒng),它的微控制器( 公司生產(chǎn)與51系列兼容的8位AT89S52單片機(jī) 圖1.1單片機(jī)應(yīng)用系統(tǒng)圖圖1.2采用C51單片機(jī)的機(jī)器人 2、 教學(xué)板指方便單片機(jī)與電源、ISP下載線、串口線以及各種傳感器和電機(jī)的 連接制作的一個電路板(如圖 1.3 )。將寶貝車機(jī)器人與計(jì)算機(jī)硬件連接,并連接到 電源。 連接單片機(jī)教學(xué)板ISP接口到計(jì)算機(jī),以便程序下載; 連接單片機(jī)教

3、學(xué)板串行接口到計(jì)算機(jī),以便調(diào)試和交互; 連接機(jī)器人到電池或者是供電電源。 USBasp C版通用編程器 圖1.3 C51單片機(jī)教學(xué)板 3、運(yùn)用C語言編程,運(yùn)用編譯器編譯生成可執(zhí)行文件并下載到單片機(jī),用串口 調(diào)試軟件查看單片機(jī)輸出信息。 建立用戶文件夾,方便管理程序,拷入編譯所需頭文件(例如,將光盤“頭文 件”文件夾中的文件拷貝到 C:Program FilesKeilC51INC文件夾里)。 進(jìn)入編程系統(tǒng)(Keil uVision2 IDE): 1)新建項(xiàng)目工程(*.uv2 ): Project宀NewProject,命名,保存在新建立的用 戶文件夾內(nèi);選擇單片機(jī)生產(chǎn)公司及類型: Atmel、

4、AT89S52 2)新建C程序文件:File tNew編輯好程序,保存為*.c的文件。注意程序 關(guān)鍵字的拼寫、英文標(biāo)點(diǎn)、字母的大小寫等。 3)添加 C程序到項(xiàng)目工程:Source Group 1 右鍵單擊t Add Files to Group Source。 Source Group 1 前面出現(xiàn) +號,單擊它出現(xiàn)剛才添加的C 程序文件名,單 擊此C文件,Keil會自動識別關(guān)鍵字,并以不同的顏色提示用戶加以注意,這樣會 使用戶少犯錯誤,有利于提高編程效率。 4) 生成執(zhí)行文件十六進(jìn)制目標(biāo)代碼文件(*.hex) : Target 1右鍵單擊t Option for target Target

5、1 t Output t選中“ Create Hex Fi :” t連接編譯生成可執(zhí) 行文件 *.hex 。編譯要求沒有錯誤產(chǎn)生,允許出現(xiàn)警告。 進(jìn)入下載系統(tǒng)(PROGISP1.72: 1) 參數(shù)選擇:勾選芯片擦除、編程FLASH校驗(yàn)FLASH單片機(jī)型號:AT89S52 2)單擊“調(diào)入 Flash ”按鈕,找到要下載的 HEX 文件。 3)單擊“編程”區(qū)的“擦除”按鈕, 開始擦除芯片內(nèi)部程序。 芯片擦除成功后, 點(diǎn)擊“自動”按鍵,完成寫、校驗(yàn) Flash 。等待下載完畢后,固件下載完成。拔掉 USBAS下載器ISP接口排線。 注意:要將 ISP 下載線連接計(jì)算機(jī)和機(jī)器人教學(xué)板,電源接好,開關(guān)撥

6、到“ 1” 檔位置(PRO,給教學(xué)板通電,才能進(jìn)行單片機(jī)程序下載。 從執(zhí)行文件下載到單片機(jī)的那個時刻幵始,程序就幵始運(yùn)行。單片機(jī)向計(jì)算機(jī) 發(fā)送信息??衫么谡{(diào)試軟件查看單片機(jī)輸出信息,“ Reset ”按鈕可讓下載到單 片機(jī)內(nèi)的程序重新運(yùn)行一次。 使用串口調(diào)試助手之前,首先使用串口線將單片機(jī)的串口與計(jì)算機(jī)的USB 口相 連,然后通過計(jì)算機(jī)的設(shè)備管理器查看要使用的串口號,如圖所示。 記下該串口號,打開串口調(diào)試助手軟件,選擇正確的串口號,如圖所示。 4、做完實(shí)驗(yàn)斷幵電源,將幵關(guān)撥到“0”檔(OFF,系統(tǒng)在不使用時沒有消耗 電能,電池可以用得更久。拆卸串口線還原。 四、實(shí)驗(yàn)程序 1、程序 Hell

7、oRoBot.c 。 #include int main(void) uart_Init(); / 串口初始化 printf(Hello,this is a message from your Robotn); while(1); 2、利用 while 循環(huán)與 delay_nms( ) 函數(shù)(毫秒級的延時)編程:每秒發(fā)送一 BoeBot.h 頭文件中有定義。即 #include ,編譯時系統(tǒng)將根據(jù)頭文件自動 將延時函數(shù)插入到程序中。 3、讓豎線“ | ”在屏幕上順時針或逆時針轉(zhuǎn)動輸出 參考下面的程序代碼: printf(|); delay_nms(500); printf(/); delay_

8、nms(500); printf(-); delay_nms(500); printf(); delay_nms(500); printf(|); delay_nms(500); 4、顯示靜態(tài)圖形: * * * * * * * * * * * * * 五、實(shí)驗(yàn)報告要求 1、按要求:每秒發(fā)送一個信息(內(nèi)容為英文自己定),通過串口顯示在計(jì)算機(jī) 上,進(jìn)行程序設(shè)計(jì)。 2、程序調(diào)試心得。 3、觀察到的程序運(yùn)行效果并加以分析。 六、思考題 1、什么是單片機(jī)? 2、MCS51 8051、C51、AT89S52之間是什么關(guān)系? 3、寶貝車機(jī)器人采用的 AT89S52單片機(jī)的特點(diǎn)是什么? 4、#include

9、頭文件的作用是什么? 的作用是什么? 5、程序 HelloRoBot.c 中 while(1); 注:實(shí)驗(yàn)操作現(xiàn)場檢查。 圖2.1 LED零件圖圖2.2發(fā)光二極管與I/O腳P1 0的連接 實(shí)驗(yàn)二 C51 接口與伺服電機(jī)控制 一、實(shí)驗(yàn)?zāi)康?1、理解和掌握C51單片機(jī)的輸入 輸出接口的特性; 2、理解機(jī)器人伺服電機(jī) PW碉速原理,C語言編程輸出脈沖序列控制機(jī)器人輪 子運(yùn)動。 二、實(shí)驗(yàn)設(shè)備及軟件 寶貝車機(jī)器人、 ISP 下載線、串行接口線、計(jì)算機(jī)、電源、螺絲刀、紅色發(fā)光 二極管2個和470Q電阻2個。 Keil uVisio n2 IDE集成幵發(fā)環(huán)境、PROGISP1.72下載軟件、串口調(diào)試軟件。

10、三、實(shí)驗(yàn)內(nèi)容和步驟 1、用C51單片機(jī)的P1 口的位輸出高低電平控制 LED發(fā)光二極管的閃爍??唇?材附錄C關(guān)于面包板及LED的介紹。面包板上共有18行插座,通過中間槽分為兩列。 每一行由 5 個插座組成,這 5 個插座在面包板上是電氣相連的,如將兩根導(dǎo)線分別 插入五口插座行的任意兩個插座中,它們都是電氣相連的?!癎ND對應(yīng)于教學(xué)板的 接地端,“Vcc”指校準(zhǔn)的+5V電壓。發(fā)光二極管(如圖 2.1 )是單向?qū)щ姷碾娮庸埽?長腳為正極,短腳為負(fù)極,必須連接正確,否則不能正常工作。通過5mA左右即可 發(fā)光,電流越大,其亮度越強(qiáng),但若電流過大,會燒毀二極管。給發(fā)光二極管串聯(lián) 一個電阻的目的是限制通過

11、發(fā)光二極管的電流不要太大。 色環(huán)電阻為五色,用五條色環(huán)表示電阻的阻值大小。 黑0棕1紅2橙3黃4綠5藍(lán)6紫7灰8白9金、銀表示誤差 具體如下: 第一條色環(huán): 阻值的第一位數(shù)字; 第二條色環(huán): 阻值的第二位數(shù)字; 第三條色環(huán): 阻值的第三位數(shù)字; 第四條色環(huán): 阻值乘數(shù)的 10的冪數(shù); 第五條色環(huán): 誤差(常見是棕色,誤差為1%0 由此,470Q電阻為黃紫黑黑棕。 搭建一個發(fā)光二極管閃爍的 LED電路(如圖2.2 )并編寫程序HighLowLed.c。 注意,在教學(xué)底板上搭建電路時要斷幵電源。修改程序讓兩個LED同時閃爍,并修 改程序讓兩個LED交替亮或者滅,也可以改變延時函數(shù)參數(shù) n的值,改變

12、LED閃爍 頻率。 HighLowLed.c 程序如下: #in clude #in clude int main(void) uart_Init(); / 初始化串口 printf(The LED connected to P1_0 is blinking!n); while(1) P1_0=1; / P1_0 輸出高電平 delay_nms(500); / 延時 500ms P1_0=0; / P1_0 輸出低電平 delay_nms(500); / 延時 500ms 【拓展訓(xùn)練】實(shí)現(xiàn)4個或更多LED流水燈控制,對應(yīng)流水燈從全滅到一個一個 亮或者對應(yīng)流水燈從全亮到一個一個滅。編程方法與兩個

13、LED閃爍類似,接入的LED 二極管繼續(xù)接在面包板左側(cè)其他的端口位上。注意,程序控制各引腳輸出高低電平 要與所接的端口要一一對應(yīng)起來。 2、兩伺服電機(jī)調(diào)零。在操作之前,先確認(rèn)一下機(jī)器人兩個伺服電機(jī)的電源控制 線(如圖2.3 )是否已經(jīng)正確的連接到C51單片機(jī)教學(xué)板的兩個專用電機(jī)控制接口 上。P1_1引腳控制左邊電機(jī),P1_0引腳控制右邊電機(jī),在電路板上我們分別采用 W R、B來表示信號線、電源線和地,電機(jī)控制線顏色與教學(xué)板接口對應(yīng)字母一致(白 紅黑對應(yīng)WRBo 圖2.3伺服電機(jī)實(shí)物圖圖2.4電壓“占空比”與平均電壓關(guān)系 電機(jī)調(diào)速應(yīng)用 PWM脈寬調(diào)制)基本原理,通過控制固定電壓的直流電源幵關(guān) 頻

14、率改變負(fù)載兩端的電壓。在 PWM驅(qū)動控制的調(diào)整系統(tǒng)中,按一個固定的頻率來接 通和斷幵電源,并根據(jù)需要改變一個周期內(nèi)“接通”和“斷幵”時間的長短。通過 改變直流電機(jī)電樞上電壓的“占空比”來改變平均電壓的大小,從而控制電動機(jī)的 轉(zhuǎn)速。 如圖2.4,在脈沖作用下,當(dāng)電機(jī)通電時,速度增加;電機(jī)斷電時,速度逐漸 減少。只要按一定規(guī)律,改變通、斷電的時間,即可讓電機(jī)轉(zhuǎn)速得到控制。高電平 持續(xù)的時間控制電機(jī)轉(zhuǎn)速,即脈沖寬度控制連續(xù)旋轉(zhuǎn)電機(jī)速度和方向。將時間間隔 為20ms,脈寬為1.5ms的一系列脈沖稱為零點(diǎn)標(biāo)定信號,電機(jī)轉(zhuǎn)速為零,機(jī)器人輪 子靜止不動。如果電機(jī)沒有進(jìn)行零點(diǎn)標(biāo)定,機(jī)器人輪子會轉(zhuǎn)動,如圖2.5

15、所示,用 螺絲刀輕輕調(diào)節(jié)馬達(dá)上的電位器,直到馬達(dá)停止轉(zhuǎn)動。 如電機(jī)已經(jīng)完成了零點(diǎn)調(diào)節(jié),不會轉(zhuǎn)動。但是損壞了或有缺陷的電機(jī)有時也不 轉(zhuǎn)動。繼續(xù)檢測: 當(dāng)高電平持續(xù)時間為1.3ms時,電機(jī)順時針全速旋轉(zhuǎn); 當(dāng)高電平持續(xù)時間為1.7ms時,電機(jī)逆時針全速旋轉(zhuǎn); 當(dāng)高電平持續(xù)時間為1.3ms1.5ms之間時,電機(jī)順時針旋轉(zhuǎn); 當(dāng)高電平持續(xù)時間為1.5ms1.7ms之間時,電機(jī)逆時針旋轉(zhuǎn)。 3、測試電機(jī),改變脈沖寬度控制機(jī)器人運(yùn)動速度和方向。如圖2.6,定義機(jī)器 人的前、后、左、右四個方向。例程中使用printf函數(shù)是為了起提示作用,若覺得 串口線影響機(jī)器人的運(yùn)動,可以不用此函數(shù)。將程序下載到單片機(jī),關(guān)

16、閉機(jī)器人電 源幵關(guān),斷幵ISP下載線,將幵關(guān)撥到“ 2”檔(RUN,觀察寶貝車運(yùn)動情況。 圖2.6機(jī)器人及其前進(jìn)方向的定義 四、實(shí)驗(yàn)程序 1、參考一個LED閃爍的程序(程序 HighLowLed.c),編寫程序讓兩個 LED同時 閃爍,并修改程序讓兩個LED交替閃爍,也可以改變延時函數(shù)參數(shù) n的值,改變LED 閃爍頻率。 *編程實(shí)現(xiàn)4個或更多LED流水燈控制,對應(yīng)流水燈從全滅到一個一個亮或者對 應(yīng)流水燈從全亮到一個一個滅。 2、編程實(shí)現(xiàn)兩伺服電機(jī)調(diào)零,可以分別調(diào)零,也可一起調(diào)零。實(shí)現(xiàn)右輪調(diào)零參 考代碼如下,注意編程的完整性。 while(1) P1_0=1; P1_0 輸出高電平 delay_

17、nus(1500); / 延時 1.5ms P1_0=0; /P1_0 輸出低電平 delay_nus(20000); / 延時 20ms 3、驗(yàn)證下列程序 BothServosThreeSeconds.c 是否讓寶貝車向前進(jìn) 3s ,后退 3s。 并根據(jù)此程序按照實(shí)驗(yàn)報告要求編程。 #include #include int main(void) int counter; uart_Init(); printf(Program Running!n); for(counter=1;counter=130;counter+) P1_1=1; delay_nus(1700); P1_1=0; P1

18、_0=1; delay_nus(1300); P1_0=0; delay_nms(20); for(counter=1;counter=130;counter+) P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); while(1); 4、用 LED 指示電機(jī)運(yùn)動狀態(tài) 在實(shí)際應(yīng)用中, LED 往往起到狀態(tài)提示作用, 交通紅綠燈就是一個典型的應(yīng)用。 你可以修改程序來模擬交通燈過程:假設(shè) A 燈為交通燈, B 燈為電機(jī)運(yùn)行狀態(tài)指示 燈。模擬過程如下: A 燈閃爍, B 燈滅,電機(jī)停止運(yùn)行;

19、 A 燈滅, B 燈亮,電機(jī)開始運(yùn)行; B 燈閃爍,電機(jī)減速運(yùn)行; B 燈滅, A 燈閃爍,電機(jī)停止運(yùn)行;如此往復(fù)。 五、實(shí)驗(yàn)報告要求 1、實(shí)現(xiàn)兩個LED交替閃爍的編程及電路原理圖, 觀察到的運(yùn)行效果并加以分析, 程序調(diào)試心得。 有興趣的同學(xué)還可以完成 4個或更多LED流水燈控制,對應(yīng)流水燈從全滅到一 個一個亮或者對應(yīng)流水燈從全亮到一個一個滅。要求編程及繪制電路原理圖,觀察 到的運(yùn)行效果并加以分析,程序調(diào)試心得 2、編程實(shí)現(xiàn)兩伺服電機(jī)調(diào)零,可以分別調(diào)零,也可一起調(diào)零,觀察到的運(yùn)行效 果并加以分析,程序調(diào)試心得。 3、控制兩個電機(jī)的delay_nus函數(shù)的參數(shù)n有不同的組合,各種組合的運(yùn)動狀 況

20、填寫下表。 P1_1 P1_0 描述 運(yùn)動狀況 1700 1300 全速,P1_1電機(jī)逆時針,P1_0電機(jī)順時 針 1300 1700 1700 1700 1300 1300 1500 1700 1500 1300 1300 1500 1700 1500 1500 1500 兩個電機(jī)都靜止 六、思考題 1、LED閃爍的工作原理,即引腳輸出高低電平信號,發(fā)光二極管會滅或者亮的 原因是什么? 2、 LED閃爍的實(shí)驗(yàn)中,逐漸減小延時函數(shù)參數(shù)n的值,還能看到LED閃爍嗎? 為什么? 3、 LED閃爍的實(shí)驗(yàn)中,分別將幵關(guān)撥到“ 1”(PRO與“ 2”( RUN,看實(shí)驗(yàn)現(xiàn) 象有什么區(qū)別?分析原因。 4、

21、將電機(jī)調(diào)零的程序下載到單片機(jī),幵關(guān)撥到“2”,按“ Reset”按鈕,輪子 仍轉(zhuǎn)動,不能完全停下來,試分析有哪些原因造成的? 5 、編程給與P1_1連接的左輪發(fā)出脈寬為1.7ms,與P1_0連接的右輪發(fā)出脈寬 1.3ms,觀察到寶貝車后退,分析是什么原因引起的? 注:實(shí)驗(yàn)操作現(xiàn)場檢查。 實(shí)驗(yàn)三 C 語言函數(shù)與機(jī)器人巡航控制 一、實(shí)驗(yàn)?zāi)康?1、掌握對單片機(jī)編程使機(jī)器人做基本的巡航動作:向前、向后、左轉(zhuǎn)、右轉(zhuǎn)和 原地旋轉(zhuǎn)。通過測試機(jī)器人脈沖數(shù)與機(jī)器人運(yùn)動距離的關(guān)系,實(shí)現(xiàn)機(jī)器人的精確動 作。 2、掌握編寫程序時機(jī)器人由突然啟動或停止變?yōu)橹鸩郊铀倩驕p速運(yùn)動。 3、寫一些執(zhí)行基本巡航動作的函數(shù),每一個函

22、數(shù)都能夠被多次調(diào)用。 4、將復(fù)雜巡航運(yùn)動記錄在數(shù)組中,編寫程序執(zhí)行這些巡航運(yùn)動。 二、實(shí)驗(yàn)設(shè)備及軟件 寶貝車機(jī)器人、 ISP 下載線、串行接口線、計(jì)算機(jī)、電源。 Keil uVisio n2 IDE集成幵發(fā)環(huán)境、PROGISP1.72下載軟件、串口調(diào)試軟件。 三、實(shí)驗(yàn)內(nèi)容和步驟 1 、驗(yàn)證程序 ForwardLeftRightBackward.c ,看機(jī)器人是否向前、左轉(zhuǎn)、右轉(zhuǎn) 及向后走。 如果寶貝車向前運(yùn)動的過程輕微向左或右偏移,不是一條直線。結(jié)果就是左輪 與右輪程序上是以全速行駛,實(shí)際輸出有速度差,要么左輪速度太慢,要么右輪速 度太慢。讓輪子加速不太實(shí)際,但是減小輪子的速度就可以解決問題。

23、電機(jī)速度是 脈沖寬度即程序中延時函數(shù) delay_nus 的參數(shù) n 決定的。 n 越接近 1500,電機(jī)轉(zhuǎn)速 越慢。要重復(fù)試驗(yàn)得到一個比較準(zhǔn)確的輸出。將確定好的沿直線運(yùn)動的參數(shù)更新到 程序 ForwardLeftRightBackward.c 中相應(yīng)的值。 利用 for 循環(huán)控制電機(jī)的運(yùn)行時間,由小車運(yùn)動形式?jīng)Q定輸出距離或角度。例 程中 for 循環(huán)的循環(huán)次數(shù)為 65,小車運(yùn)行時間為 1.5s ,運(yùn)行距離減半。 for 循環(huán)的 循環(huán)次數(shù)為 26,電機(jī)的運(yùn)行時間決定小車旋轉(zhuǎn)的角度。調(diào)整for 循環(huán)的循環(huán)次數(shù)得 到非常接近你想要的旋轉(zhuǎn)角度。 由于每個小車的情況不一樣, 在向左轉(zhuǎn)與右轉(zhuǎn)中 for

24、循環(huán)的循環(huán)次數(shù)增加或減少電機(jī)的轉(zhuǎn)角, 使寶貝車旋轉(zhuǎn)期望的角度, 例如旋轉(zhuǎn) 90 度。 如果發(fā)現(xiàn)一個值使旋轉(zhuǎn)超過 90,而另一個使旋轉(zhuǎn)小于 90, 嘗試選擇一個使其旋 轉(zhuǎn)更多的值,然后稍微減小電機(jī)速度。測試一下你的小車要循環(huán)多少次才能旋轉(zhuǎn) 90 度。 在轉(zhuǎn)彎半徑較大時,可以采用一個電機(jī)增速另一個電機(jī)減速的方法轉(zhuǎn)彎。由于 小車結(jié)構(gòu)的影響,這種方法轉(zhuǎn)彎較慢,轉(zhuǎn)彎半徑較大,效果受運(yùn)動速度的影響大。 在需要轉(zhuǎn)彎半徑較小時,可以采用一個電機(jī)轉(zhuǎn)動,而另一個靜止的方法。兩個電機(jī) 等速反向轉(zhuǎn)動可以實(shí)現(xiàn)原地轉(zhuǎn)彎。 測試寶貝車速度。將寶貝車放在尺子旁邊,確保輪子接觸的地面與尺子的 0 厘 米對齊在一條線上,按復(fù)位鍵

25、重新運(yùn)行程序,讓寶貝車向前走 1 秒鐘,測量從出發(fā) 點(diǎn)到機(jī)器人停下來所接觸的地面距離,測量結(jié)果就是以厘米 /s 為單位的。可以參考 下列程序。 #include #include int main(void) int counter; uart_Init(); printf(Program Running!n); for(counter=0;counter130;counter+)/ 運(yùn)行 3 秒 P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); while(1); 2、將加速或減速

26、與基本巡航動作結(jié)合起來, 使機(jī)器人的每一個動作都能夠勻加 速或勻減速。參考教材 程序 StartAndStopWithRamping.c 及相似代 碼更改 ForwardLeftRightBackward.c 。 3、教材程序 MovementsWithFuntions.c 、 MovementsWithOneFuntion.c 運(yùn)行結(jié) 果與 ForwardLeftRightBackward.c 產(chǎn)生的效果是相同的,用函數(shù)調(diào)用簡化運(yùn)動程 序。修改 MovementsWithOneFuntion.c 使機(jī)器人走一個正方形。 4、驗(yàn)證程序 NavigationWithSwitch.c 是否走了一個

27、矩形。 使用數(shù)組或調(diào)用函數(shù) 編寫程序,使機(jī)器人按你的想法運(yùn)動,實(shí)現(xiàn)較為復(fù)雜的運(yùn)動。 【 拓展訓(xùn)練 】編程使履帶坦克機(jī)器人、相撲機(jī)器人、爬蟲機(jī)器人巡航控制。 四、實(shí)驗(yàn)程序 1、驗(yàn)證程序 ForwardLeftRightBackward.c 。 #include #include int main(void) 向前 向左轉(zhuǎn) int counter; uart_Init(); printf(Program Running!n); for(counter=1;counter=65;counter+)/ P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus

28、(1300); P1_0=0; delay_nms(20); for(counter=1;counter=26;counter+)/ P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); 向右轉(zhuǎn) for(counter=1;counter=26;counter+)/ P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); for(counter=1;counter=65;counte

29、r+)/ 向后 P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); while(1); 2、編程反復(fù)測試一下小車要循環(huán)多少次才能旋轉(zhuǎn)精確的90 度。 3、編程測試寶貝車速度,測量結(jié)果就是以厘米/s 為單位的。 4、參考以下程序 StartAndStopWithRamping.c 及相似代碼,更改 ForwardLeftRightBackward.c ,使機(jī)器人的每一個動作都能夠勻加速或勻減速 #include #include int main(void) int pulseCount

30、; uart_Init(); printf(Program Running!n); for(pulseCount=10;pulseCount=200;pulseCount=pulseCount+1) P1_1=1; delay_nus(1500+pulseCount); P1_1=0; P1_0=1; delay_nus(1500-pulseCount); P1_0=0; delay_nms(20); for(pulseCount=1;pulseCount=0;pulseCount=pulseCount-1) P1_1=1; delay_nus(1500+pulseCount); P1_1=0

31、; P1_0=1; delay_nus(1500-pulseCount); P1_0=0; delay_nms(20); while(1); 5、修改 MovementsWithOneFuntion.c 使機(jī)器人走一個正方形。 #include #include void Move(int counter,int PC1_pulseWide,int PC0_pulseWide) int i; for(i=1;i=counter;i+) P1_1=1; delay_nus(PC1_pulseWide); P1_1=0; P1_0=1; delay_nus(PC0_pulseWide); P1_0

32、=0; delay_nms(20); int main(void) uart_Init(); printf(Program Running!n); Move(65,1700,1300); Move(26,1300,1300); Move(26,1700,1700); Move(65,1300,1700); while(1); 6、使用數(shù)組或調(diào)用函數(shù)編寫程序,使機(jī)器人按你的想法運(yùn)動,實(shí)現(xiàn)較為復(fù)雜的 運(yùn)動。 五、實(shí)驗(yàn)報告要求 1、程序設(shè)計(jì)小車要循環(huán)多少次才能旋轉(zhuǎn)精確的90 度,觀察到的運(yùn)行效果并加 以分析,程序調(diào)試心得。 2、更改 ForwardLeftRightBackward.c ,使機(jī)器人的

33、每一個動作都能夠勻加速 或勻減速。寫出程序,觀察到的運(yùn)行效果并加以分析,程序調(diào)試心得。 3、修改 MovementsWithOneFuntion.c ,使機(jī)器人走一個正方形。寫出程序,觀 察到的運(yùn)行效果并加以分析,程序調(diào)試心得。 4、使用數(shù)組或調(diào)用函數(shù)編寫程序,使機(jī)器人按你的想法運(yùn)動,實(shí)現(xiàn)較為復(fù)雜的 運(yùn)動。寫出程序,觀察到的運(yùn)行效果并加以分析,程序調(diào)試心得。 六、思考題 1、在程序 ForwardLeftRightBackward.c 中,向左轉(zhuǎn)與右轉(zhuǎn)的 for 循環(huán)的循環(huán) 次數(shù)為 26,這是什么意思?程序運(yùn)行效果是怎樣的? 2、機(jī)器人完成各種巡航動作的過程中,每次啟動和停止時,動作太快,幾乎

34、傾 倒,為什么會這樣呢?采用什么方法可以解決這種問題? 3、讓小車實(shí)現(xiàn)轉(zhuǎn)彎的方法有哪些? 注:實(shí)驗(yàn)操作現(xiàn)場檢查。 P1 220 Q電阻2個; Keil uVisio n2 IDE集成幵發(fā)環(huán)境、PROGISP1.72下載軟件、串口調(diào)試軟件 三、實(shí)驗(yàn)內(nèi)容和步驟 1 、通過布置恰當(dāng)?shù)碾娐?,在機(jī)器人前端安裝并測試一個稱為胡須的觸覺開關(guān), 對 C51 單片機(jī)編程來監(jiān)視觸覺開關(guān)的狀態(tài)。 安裝并測試機(jī)器人胡須見圖 4.2 。確定兩條胡須比較靠近,但又不接觸面包板 上的3-pin頭,推薦保持3mm的距離。參考接線圖4.3,搭建胡須電路。 色環(huán)電阻你會讀嗎?(提示:棕紅橙黃綠,藍(lán)紫灰白黑) 220 Q電阻(紅紅

35、黑黑棕),10k Q電阻(棕黑黑紅棕)。 注意:右邊胡須狀態(tài)信息輸入是通過 P1 口的第 4引腳完成, 左邊胡須狀態(tài)信息 輸入是通過P2 口的第3引腳完成。也可以接其他引腳,注意電路與程序要匹配。 圖 4.2 安裝機(jī)器人胡須圖 4.3 胡須電路示意圖 圖 4.4 是實(shí)際的參考接線圖,安裝好的觸覺胡須的機(jī)器人如圖 4.5 。 圖 4.4 胡須接線圖圖 4.5 安裝好觸覺胡須的機(jī)器人 單片機(jī)AT89S52的四個端口 P0、P1、P2和P3是可以按位來操作,從低到高依 次為第0 口、第1 口第7 口,書寫分別為 PX.0、PX.1、PX.7 (X取0到 3)。 P1 P1.7 P1.6 P1.5 P

36、1.4 P1.3 P1.2 P1.1 P1.0 0 x1 0 0 0 0 1 0 0 0 0 P2當(dāng)胡須被碰到時,使引腳電壓為0V,胡須狀態(tài)為0。 2、通過胡須導(dǎo)航。機(jī)器人行走時,如果有胡須被觸動,意味著碰到了什么。嘗 試讓寶貝車向前行走,當(dāng)在其路線上遇到障礙物時,它將后退、旋轉(zhuǎn)并向另一個方 向行走以避幵障礙物。具體程序RoamingWithWhiskers.c??梢哉{(diào)整Left _Turn() 和Right_Turn ()子程序中for循環(huán)的循環(huán)次數(shù)增加或減少電機(jī)的轉(zhuǎn)角,使寶貝車 旋轉(zhuǎn)期望的角度。在空間比較狹小的地方,可以調(diào)整程序Backward。中for循環(huán)的 循環(huán)次數(shù)來減少后退的距離 3

37、、基于人工智能決策的編程使機(jī)器人逃離進(jìn)入墻角死區(qū)。編程使機(jī)器人逃離進(jìn) 入墻角死區(qū)。當(dāng)寶貝車進(jìn)入墻角時,左胡須觸墻,于是它倒退,右轉(zhuǎn)。當(dāng)小車再向 前行走,右胡須觸墻,于是再倒退,左轉(zhuǎn)。然后它又前進(jìn)又會碰到左墻,再次碰到 右墻等,直到有人把它從困境中解救出來。使用含ifelse嵌套語句用于探測連 續(xù)的、交替出現(xiàn)的胡須觸動。編程使寶貝車在行走時,輪流觸動它的胡須,胡須在 經(jīng)過 四次觸動之后, 寶貝車 會進(jìn)行后退 、旋轉(zhuǎn) 180離開墻角 。 具體程序 EscapingCorners.c 。嘗試增加或減小變量 counter 的數(shù)值, 觀察機(jī)器人在正常行走 過程中是否有任何不同。 【 拓展訓(xùn)練 】觸覺導(dǎo)

38、航機(jī)器人走迷宮競賽。 四、實(shí)驗(yàn)報告要求 1、搭建觸覺導(dǎo)航電路,測試胡須源程序TestWhiskers.c 。使用串口調(diào)試助手 觀察運(yùn)行效果并加以分析。程序調(diào)試心得。 #include #include int P1_4state(void)獲取 P1_4 的狀態(tài) return (P1 int P2_3state(void)/ 獲取 P2_3 的狀態(tài) return (P2 int main(void) uart_Init(); printf(WHISKER STARTESn); while(1) printf( 右邊胡須的狀態(tài) :%d ,P1_4state(); printf( 左邊胡須的狀態(tài)

39、:%dn,P2_3state(); delay_nms(150); 2、程序 RoamingWithWhiskers.c 觸覺導(dǎo)航的實(shí)現(xiàn),胡須機(jī)器人怎樣行走。 #include #include int P1_4state(void) return (P1 int P2_3state(void) return (P2 void Forward(void) P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); void Left_Turn(void) int i; for(i=1;i=26

40、;i+) P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay_nms(20); void Right_Turn(void) int i; for(i=1;i=26;i+) P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); void Backward(void) int i; for(i=1;i=65;i+) P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; de

41、lay_nms(20); int main(void) uart_Init(); printf(Program Running!n); while(1) 兩胡須同時碰到 if(P1_4state()=0) / 向后 Left_Turn();/ 向左 Left_Turn();/ 向左 else if(P1_4state()=0) / 右胡須碰到 Backward();/ 向后 Left_Turn();/ 向左 else if(P2_3state()=0) /左胡須碰到 Backward();/ 向后 Right_Turn();/ 向右 else / 胡須沒有碰到 Forward();/ 向前 3

42、、程序 EscapingCorners.c 是如何工作的。 #include #include int P1_4state(void) return (P1 int P2_3state(void) return (P2 void Forward(void) P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); void Left_Turn(void) int i; for(i=1;i=26;i+) P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; dela

43、y_nus(1300); P1_0=0; delay_nms(20); void Right_Turn(void) int i; for(i=1;i=26;i+) P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); void Backward(void) int i; for(i=1;i4) counter=1; Backward();/ 向后 Left_Turn();/ 向左 Left_Turn();/ 向左 else counter=1; if(P1_4state()=0)/ 向后

44、 Left_Turn();/ 向左 Left_Turn();/ 向左 else if(P1_4state()=0) Backward();/ 向后 Left_Turn();/ 向左 else if(P2_3state()=0) Backward();/ 向后 Right_Turn();/ 向右 else Forward();/ 向前 五、思考題 1、觸覺導(dǎo)航的原理是什么?通過胡須導(dǎo)航時如何避開障礙物? 2、語句 Return(P1Left_Turn();Left_Turn(); 的含義是什么? 4、在胡須導(dǎo)航程序中函數(shù) Forward() 有變動,只發(fā)送一個脈沖,然后返回,這 樣的好處是什么?

45、 5、是否有且只有一根胡須被觸動,如何通過獲取左、右胡須的狀態(tài)作出判斷 寫出具體的判斷語句 注:實(shí)驗(yàn)操作現(xiàn)場檢查 實(shí)驗(yàn)五 C51 接口與紅外線導(dǎo)航 一、實(shí)驗(yàn)?zāi)康?1、掌握紅外傳感器作為輸入反饋與單片機(jī)的編程實(shí)現(xiàn),讓機(jī)器人的 C51 單片機(jī) 可以收發(fā)紅外光信號。 2、使用紅外線發(fā)射和接收器件探測道路,編程實(shí)現(xiàn)高性能的IR 導(dǎo)航和邊沿探 測。 二、實(shí)驗(yàn)設(shè)備及軟件 寶貝車機(jī)器人、ISP下載線、串行接口、USB接口、計(jì)算機(jī)、電源。 所需元件: (1) 兩個紅外檢測器,如圖 5.1 ; (2) 兩個 IR LED,如圖 5.2 ; (3) 四個470 Q電阻(黃紫黑黑棕); (4) 兩個 9013三極管

46、,如圖 5.3。 圖5.1紅外檢測器圖5.2紅外線二極管LED發(fā)射器 圖 5.3.1 三極管 9013管腳圖 圖 5.3.2 三極管 9013結(jié)構(gòu)圖及符號圖 Keil uVisio n2 IDE集成幵發(fā)環(huán)境、PROGISP1.72下載軟件、串口調(diào)試軟件 三、實(shí)驗(yàn)內(nèi)容和步驟 使用紅外光來照射機(jī)器人前進(jìn)的路線, 確定何時有光線從被探測目標(biāo)反射回來, 通過檢測反射回來的紅外光可以確定前方是否有物體。 機(jī)器人使用紅外線二極管 LED 發(fā)射紅外光線,紅外檢測器相當(dāng)于眼睛,檢測到反射回來的紅外光線,并發(fā)出信號 來表明檢測到從物體反射回紅外線,如圖 5.4 。紅外線( IR )接收/ 檢測器有內(nèi)置的 光濾波

47、器,除了需要檢測 980nm 波長的紅外線外,幾乎不允許其他光通過。紅外檢 測器還有一個電子濾波器,只允許大約 38.5kHz 的電信號通過。 圖 5.4 用紅外探測障礙物 1、搭建并測試 IR 發(fā)射和探測器對,如圖 5.5 。注意斷開主板和電機(jī)的電源。 圖 5.5 左側(cè)和右側(cè) IR 組電路原理圖 圖 5.6 左右 IR 組實(shí)物參考圖 本任務(wù)中,發(fā)送持續(xù)1ms的38.5kHz的紅外光,如果紅外光被小車路徑上的物 體反射回來,紅外檢測器將給微控制器發(fā)送一個信號,讓它知道已經(jīng)檢測到反射回 的紅外光。當(dāng)沒有 IR 信號返回時,探測器的輸出狀態(tài)為高電平。當(dāng)它探測到被物體 反射的 38.5kHz 的紅外

48、信號時,它的輸出為低電平。 放一個物體,比如手或一張紙,距離 IR 組大約 1 英寸。驗(yàn)證當(dāng)你放一個物體在 IR 組前時,調(diào)試終端是否會顯示 0,當(dāng)你將物體移開時,它是否顯示 1。 注意:保持寶貝車機(jī)器人與串口電纜的連接,因?yàn)槟銓⒂么谡{(diào)試助手來測試 你的 IR 組。 參考程序( TestLeftIrPair.c ): #include #include int P1_2state(void) return (P1 int main(void) int counter; int irDetectLeft; uart_Init(); printf(Program Running!n); whil

49、e(1) for(counter=0;counter38;counter+) P1_3=1; delay_nus(13); P1_3=0; delay_nus(13); irDetectLeft=P1_2state(); printf(irDetectLeft=%dn,irDetectLeft); delay_nms(100); 2、IR 檢測器探測和避開障礙物 IR 檢測器的輸出與觸須的輸出非常相象。沒有檢測到物體時,輸出為高,檢測 到物體時,輸出為低。故采取與胡須相同的導(dǎo)航策略。 #include #include #include #define LeftIR P1_2 / 左邊紅外接收

50、連接到 P1_2 #define RightIR P3_5 / 右邊紅外接收連接到 P3_5 #define LeftLaunch P1_3 / 左邊紅外發(fā)射連接到 P1_3 #define RightLaunch P3_6 / 右邊紅外發(fā)射連接到 P3_6 void IRLaunch(unsigned char IR) int counter; if(IR=L) /左邊發(fā)射 for(counter=0;counter38;counter+) /發(fā)射時間比胡須長 LeftLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_()

51、; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LeftLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if(IR=R) /右邊發(fā)射 for(counter=0;counter38;counter+) RightLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop

52、_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); RightLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); void Forward(void) / 向前行走子程序 P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20); 左轉(zhuǎn)子程序 void Left_T

53、urn(void) / int i; for( i=1;i=26;i+) P1_1=1; delay_nus(1300); P1_1=0; delay_nus(1300); P1_0=0; delay_nms(20); 右轉(zhuǎn)子程序 void Right_Turn(void) / int i; for( i=1;i=26;i+) P1_1=1; delay_nus(1700); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); void Backward(void) / 向后行走子程序 int i; for( i=1;i=65;i+)

54、 P1_1=1; delay_nus(1300); P1_1=0; P1_0=1; delay_nus(1700); P1_0=0; delay_nms(20); int main(void) int irDetectLeft,irDetectRight; uart_Init(); printf(Program Running!n); while(1) IRLaunch(R); / 右邊發(fā)射 irDetectRight = RightIR;/右邊接收 兩邊同時接收到紅外線 IRLaunch(L); / 左邊發(fā)射 irDetectLeft = LeftIR;/ 左邊接收 if(irDetectL

55、eft=0) Left_Turn(); Left_Turn(); else if(irDetectLeft=0)/ 只有左邊接收到紅外線 Backward(); Right_Turn(); else if(irDetectRight=0)/ 只有右邊接收到紅外線 Backward(); Left_Turn(); else Forward(); 3、高性能的 IR 導(dǎo)航,在每個脈沖之間采樣以避免碰撞 在觸須導(dǎo)航里使用的預(yù)編程機(jī)動動作很好,但是在使用IR LED和探測器時會造 成不必要的遲鈍。發(fā)送脈沖給電機(jī)之前檢查障礙物,寶貝車持續(xù)使用電機(jī)驅(qū)動脈沖 和探測,直到它繞開障礙物,然后它會繼續(xù)發(fā)送向前行

56、走的脈沖,這樣可以大大改 善寶貝車的行走性能。 參考程序: #include #include #include #define LeftIR P1_2 / 左邊紅外接收連接到 P1_2 #define RightIR P3_5 / 右邊紅外接收連接到 P3_5 #define LeftLaunch P1_3 / 左邊紅外發(fā)射連接到 P1_3 #define RightLaunch P3_6 / 右邊紅外發(fā)射連接到 P3_6 void IRLaunch(unsigned char IR) int counter; if(IR=L) / 左邊發(fā)射 for(counter=0;counter38;

57、counter+) LeftLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); LeftLaunch=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if(IR=R) / 右邊發(fā)射 for(counter=0;counter38;counte

58、r+)/ 右邊發(fā)射 RightLaunch=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); RightLaunch=0; nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); int main(void) int pulseLeft,pulseRight; int

59、irDetectLeft,irDetectRight; uart_Init(); printf(Program Running!n); do IRLaunch(R); / 右邊發(fā)射 irDetectRight = RightIR;/右邊接收 IRLaunch(L); /左邊發(fā)射 irDetectLeft = LeftIR;/左邊接收 if(irDetectLeft=0) pulseRight=1700; else if(irDetectLeft=0) pulseRight=1700; else if(irDetectLeft=1) pulseRight=1300; 右轉(zhuǎn) 左轉(zhuǎn) else / 前

60、進(jìn) pulseLeft=1700; pulseRight=1300; P1_1=1; delay_nus(pulseLeft); P1_1=0; P1_0=1; delay_nus(pulseRight); P1_0=0; delay_nms(20); while(1); 4、用絕緣帶模擬桌子的邊沿,邊沿探測編程 桌面,寶貝車向前行走。如果有一邊的 IR 探測器沒有發(fā)現(xiàn)桌面(即發(fā)現(xiàn)邊沿) ,寶 貝車會向另一個方向轉(zhuǎn)動。 參考程序: #include #include #include #define LeftIR P1_2 /左邊紅外接收連接到 P1_2 #define RightIR P3_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論