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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(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)康?、掌握寶貝車機(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 uVision2 IDE集成開發(fā)環(huán)境、PROGISP1.72下載軟件、串口調(diào)試軟件。三、實(shí)驗(yàn)內(nèi)容和步驟單片機(jī)控制的寶貝車機(jī)器人是通過串并口或USB接口通信交互,由硬件系統(tǒng)與軟件系統(tǒng)相互結(jié)合組成的一個(gè)完整的智能控制系統(tǒng)。單片機(jī)必

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

3、或者是供電電源。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):ProjectNew Project,命名,保存在新建立的用戶文件夾內(nèi);選擇單片機(jī)生產(chǎn)公司及類型:Atmel、AT89S52。2) 新建C程序文件:;編輯好程序,保存為*.c的文件。注意程序

4、關(guān)鍵字的拼寫、英文標(biāo)點(diǎn)、字母的大小寫等。3) 添加C程序到項(xiàng)目工程:Source Group 1右鍵單擊Add Files to Group Source。Source Group 1前面出現(xiàn)+號,單擊它出現(xiàn)剛才添加的C程序文件名,單擊此C文件,Keil會自動識別關(guān)鍵字,并以不同的顏色提示用戶加以注意,這樣會使用戶少犯錯(cuò)誤,有利于提高編程效率。4) 生成執(zhí)行文件十六進(jìn)制目標(biāo)代碼文件(*.hex):Target 1 右鍵單擊Option for targetTarget 1Output選中“Create Hex Fi:”連接編譯生成可執(zhí)行文件*.hex。編譯要求沒有錯(cuò)誤產(chǎn)生,允許出現(xiàn)警告。進(jìn)入下

5、載系統(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。等待下載完畢后,固件下載完成。拔掉USBASP下載器ISP 接口排線。注意:要將ISP下載線連接計(jì)算機(jī)和機(jī)器人教學(xué)板,電源接好,開關(guān)撥到“1”檔位置(PRO),給教學(xué)板通電,才能進(jìn)行單片機(jī)程序下載。從執(zhí)行文件下載到單片機(jī)的那個(gè)時(shí)刻開始,程序就開始運(yùn)行。單片機(jī)向計(jì)算機(jī)發(fā)送信息??衫么谡{(diào)試軟件查看

6、單片機(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í)沒有消耗電能,電池可以用得更久。拆卸串口線還原。四、實(shí)驗(yàn)程序1、程序HelloRoBot.c。#include<uart.h>int main(void)uart_Init(); /串口初始化printf("Hello,this is a mes

7、sage from your Robotn");while(1);2、 利用while循環(huán)與delay_nms( )函數(shù)(毫秒級的延時(shí))編程:每秒發(fā)送一個(gè)信息(內(nèi)容為英文自己定),通過串口顯示在計(jì)算機(jī)上。delay_nms( )函數(shù)在BoeBot.h頭文件中有定義。即#include<Boebot.h>,編譯時(shí)系統(tǒng)將根據(jù)頭文件自動將延時(shí)函數(shù)插入到程序中。3、 讓豎線“|”在屏幕上順時(shí)針或逆時(shí)針轉(zhuǎn)動輸出。 參考下面的程序代碼: printf("|"); delay_nms(500); printf("/"); delay_nms(50

8、0); printf("-"); delay_nms(500); printf(""); delay_nms(500); printf("|"); delay_nms(500);4、顯示靜態(tài)圖形:* * * * * * * * * *五、實(shí)驗(yàn)報(bào)告要求1、按要求:每秒發(fā)送一個(gè)信息(內(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)是什么?

9、4、#include<uart.h>頭文件的作用是什么? 5、程序HelloRoBot.c中while(1);的作用是什么?注:實(shí)驗(yàn)操作現(xiàn)場檢查。實(shí)驗(yàn)二 C51接口與伺服電機(jī)控制一、實(shí)驗(yàn)?zāi)康?、理解和掌握C51單片機(jī)的輸入輸出接口的特性; 2、理解機(jī)器人伺服電機(jī)PWM調(diào)速原理,C語言編程輸出脈沖序列控制機(jī)器人輪子運(yùn)動。二、實(shí)驗(yàn)設(shè)備及軟件寶貝車機(jī)器人、ISP下載線、串行接口線、計(jì)算機(jī)、電源、螺絲刀、紅色發(fā)光二極管2個(gè)和470電阻2個(gè)。Keil uVision2 IDE集成開發(fā)環(huán)境、PROGISP1.72下載軟件、串口調(diào)試軟件。三、實(shí)驗(yàn)內(nèi)容和步驟1、用C51單片機(jī)的P1口的位輸出高低電

10、平控制LED發(fā)光二極管的閃爍??唇滩母戒汣關(guān)于面包板及LED的介紹。面包板上共有18行插座,通過中間槽分為兩列。每一行由5個(gè)插座組成,這5個(gè)插座在面包板上是電氣相連的,如將兩根導(dǎo)線分別插入五口插座行的任意兩個(gè)插座中,它們都是電氣相連的?!癎ND”對應(yīng)于教學(xué)板的接地端,“Vcc”指校準(zhǔn)的+5V電壓。發(fā)光二極管(如圖2.1)是單向?qū)щ姷碾娮庸?,長腳為正極,短腳為負(fù)極,必須連接正確,否則不能正常工作。通過5mA左右即可發(fā)光,電流越大,其亮度越強(qiáng),但若電流過大,會燒毀二極管。給發(fā)光二極管串聯(lián)一個(gè)電阻的目的是限制通過發(fā)光二極管的電流不要太大。 圖2.1 LED零件圖 圖2.2發(fā)光二極管與I/O腳P1_0

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

12、hLowLed.c程序如下:#include<BoeBot.h>#include<uart.h>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); /延時(shí)500msP1_0=0; / P1_0 輸出低電平delay_nms(500); /延時(shí)500ms【拓展訓(xùn)練】實(shí)現(xiàn)4個(gè)或更多LED流水燈控制,對應(yīng)流水燈從全滅到一個(gè)一個(gè)亮或者對應(yīng)流水燈從全亮到一個(gè)一個(gè)

13、滅。編程方法與兩個(gè)LED閃爍類似,接入的LED二極管繼續(xù)接在面包板左側(cè)其他的端口位上。注意,程序控制各引腳輸出高低電平要與所接的端口要一一對應(yīng)起來。2、兩伺服電機(jī)調(diào)零。在操作之前,先確認(rèn)一下機(jī)器人兩個(gè)伺服電機(jī)的電源控制線(如圖2.3)是否已經(jīng)正確的連接到C51單片機(jī)教學(xué)板的兩個(gè)專用電機(jī)控制接口上。P1_1引腳控制左邊電機(jī),P1_0引腳控制右邊電機(jī),在電路板上我們分別采用W、R、B來表示信號線、電源線和地,電機(jī)控制線顏色與教學(xué)板接口對應(yīng)字母一致(白紅黑對應(yīng)WRB)。圖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)中,按一個(gè)固定的頻率來接通和斷開電源,并根據(jù)需要改變一個(gè)周期內(nèi)“接通”和“斷開”時(shí)間的長短。通過改變直流電機(jī)電樞上電壓的“占空比”來改變平均電壓的大小,從而控制電動機(jī)的轉(zhuǎn)速。如圖2.4,在脈沖作用下,當(dāng)電機(jī)通電時(shí),速度增加;電機(jī)斷電時(shí),速度逐漸減少。只要按一定規(guī)律,改變通、斷電的時(shí)間,即可讓電機(jī)轉(zhuǎn)速得到控制。高電平持續(xù)的時(shí)間控制電機(jī)轉(zhuǎn)速,即脈沖寬度控制連續(xù)旋轉(zhuǎn)電機(jī)速度和方向。將時(shí)間間隔為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ī)有時(shí)也不轉(zhuǎn)動。繼續(xù)檢測:l 當(dāng)高電平持續(xù)時(shí)間為1.3ms時(shí),電機(jī)順時(shí)針全速旋轉(zhuǎn);l 當(dāng)高電平持續(xù)時(shí)間為1.7ms時(shí),電機(jī)逆時(shí)針全速旋轉(zhuǎn);l 當(dāng)高電平持續(xù)時(shí)間為1.3ms1.5ms之間時(shí),電機(jī)順時(shí)針旋轉(zhuǎn);l 當(dāng)高電平持續(xù)時(shí)間為1.5ms1.7ms之間時(shí),電機(jī)逆時(shí)針旋轉(zhuǎn)。 圖2.5.1經(jīng)過孔把螺絲刀插入電位器 圖2.5.2輕輕地旋轉(zhuǎn)螺絲刀調(diào)節(jié)電位器3、測試電機(jī),改變脈沖寬度控制機(jī)器人運(yùn)動速度和方向。如圖2.6,定義機(jī)器人的前、后、左、右四個(gè)方向。例程中使用printf函數(shù)是為了起提示作用,若覺得串口

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

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

18、unter+)P1_1=1;delay_nus(1700);P1_1=0;P1_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)提示作用,交通紅綠燈就是一個(gè)典型的應(yīng)用。你可以修改程序來模擬交通燈過程:假設(shè)A 燈為交通燈,B 燈為電機(jī)運(yùn)行狀態(tài)指示燈。模擬過

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

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

21、”按鈕,輪子仍轉(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)康?、掌握對單片機(jī)編程使機(jī)器人做基本的巡航動作:向前、向后、左轉(zhuǎn)、右轉(zhuǎn)和原地旋轉(zhuǎn)。通過測試機(jī)器人脈沖數(shù)與機(jī)器人運(yùn)動距離的關(guān)系,實(shí)現(xiàn)機(jī)器人的精確動作。 2、掌握編寫程序時(shí)機(jī)器人由突然啟動或停止變?yōu)橹鸩郊铀倩驕p速運(yùn)動。3、寫一些執(zhí)行基本巡航動作的函數(shù),每一個(gè)函數(shù)都能夠被多次調(diào)用。4、將復(fù)雜巡航運(yùn)動記錄在數(shù)組中,編寫程序執(zhí)行這些巡航運(yùn)動。二、實(shí)

22、驗(yàn)設(shè)備及軟件寶貝車機(jī)器人、ISP下載線、串行接口線、計(jì)算機(jī)、電源。Keil uVision2 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í)際,但是減小輪子的速度就可以解決問題。電機(jī)速度是脈沖寬度即程序中延時(shí)函數(shù)delay_nus的參數(shù)n決定的。n越接近1500,電機(jī)轉(zhuǎn)速越慢。要重復(fù)試驗(yàn)得到一

23、個(gè)比較準(zhǔn)確的輸出。將確定好的沿直線運(yùn)動的參數(shù)更新到程序ForwardLeftRightBackward.c中相應(yīng)的值。利用for循環(huán)控制電機(jī)的運(yùn)行時(shí)間,由小車運(yùn)動形式?jīng)Q定輸出距離或角度。例程中for循環(huán)的循環(huán)次數(shù)為65,小車運(yùn)行時(shí)間為1.5s,運(yùn)行距離減半。for循環(huán)的循環(huán)次數(shù)為26,電機(jī)的運(yùn)行時(shí)間決定小車旋轉(zhuǎn)的角度。調(diào)整for循環(huán)的循環(huán)次數(shù)得到非常接近你想要的旋轉(zhuǎn)角度。由于每個(gè)小車的情況不一樣,在向左轉(zhuǎn)與右轉(zhuǎn)中for循環(huán)的循環(huán)次數(shù)增加或減少電機(jī)的轉(zhuǎn)角,使寶貝車旋轉(zhuǎn)期望的角度,例如旋轉(zhuǎn)90度。如果發(fā)現(xiàn)一個(gè)值使旋轉(zhuǎn)超過90°,而另一個(gè)使旋轉(zhuǎn)小于90°,嘗試選擇一個(gè)使其旋轉(zhuǎn)更多

24、的值,然后稍微減小電機(jī)速度。測試一下你的小車要循環(huán)多少次才能旋轉(zhuǎn)90度。在轉(zhuǎn)彎半徑較大時(shí),可以采用一個(gè)電機(jī)增速另一個(gè)電機(jī)減速的方法轉(zhuǎn)彎。由于小車結(jié)構(gòu)的影響,這種方法轉(zhuǎn)彎較慢,轉(zhuǎn)彎半徑較大,效果受運(yùn)動速度的影響大。在需要轉(zhuǎn)彎半徑較小時(shí),可以采用一個(gè)電機(jī)轉(zhuǎn)動,而另一個(gè)靜止的方法。兩個(gè)電機(jī)等速反向轉(zhuǎn)動可以實(shí)現(xiàn)原地轉(zhuǎn)彎。測試寶貝車速度。將寶貝車放在尺子旁邊,確保輪子接觸的地面與尺子的0厘米對齊在一條線上,按復(fù)位鍵重新運(yùn)行程序,讓寶貝車向前走1秒鐘,測量從出發(fā)點(diǎn)到機(jī)器人停下來所接觸的地面距離,測量結(jié)果就是以厘米/s為單位的??梢詤⒖枷铝谐绦?。#include<BoeBot.h>#includ

25、e<uart.h>int main(void)int counter;uart_Init();printf("Program Running!n");for(counter=0;counter<130;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、將加速或減速與基本巡航動作結(jié)合起來,使機(jī)器人的每一個(gè)動作都能夠勻加速或勻減速。參考教材程序StartAndStopWithRamping.c及相似代碼更改For

26、wardLeftRightBackward.c。3、教材程序MovementsWithFuntions.c、MovementsWithOneFuntion.c運(yùn)行結(jié)果與ForwardLeftRightBackward.c產(chǎn)生的效果是相同的,用函數(shù)調(diào)用簡化運(yùn)動程序。修改MovementsWithOneFuntion.c使機(jī)器人走一個(gè)正方形。4、驗(yàn)證程序NavigationWithSwitch.c是否走了一個(gè)矩形。使用數(shù)組或調(diào)用函數(shù)編寫程序,使機(jī)器人按你的想法運(yùn)動,實(shí)現(xiàn)較為復(fù)雜的運(yùn)動?!就卣褂?xùn)練】編程使履帶坦克機(jī)器人、相撲機(jī)器人、爬蟲機(jī)器人巡航控制。四、實(shí)驗(yàn)程序1、驗(yàn)證程序ForwardLeftR

27、ightBackward.c。#include<BoeBot.h>#include<uart.h>int main(void)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(1300);P1_0=0;delay_nms(20);for(counter=1;counter<=26;counter+)/向左轉(zhuǎn)P1_1=1

28、;delay_nus(1300);P1_1=0;P1_0=1;delay_nus(1300);P1_0=0;delay_nms(20);for(counter=1;counter<=26;counter+)/向右轉(zhuǎn)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;counter+)/向后P1_1=1;delay_nus(1300);P1_1=0;P1_0=1;delay_nus(1700);P1_0=0;delay_nms(20);w

29、hile(1);2、編程反復(fù)測試一下小車要循環(huán)多少次才能旋轉(zhuǎn)精確的90度。3、編程測試寶貝車速度,測量結(jié)果就是以厘米/s為單位的。4、參考以下程序StartAndStopWithRamping.c及相似代碼,更改ForwardLeftRightBackward.c,使機(jī)器人的每一個(gè)動作都能夠勻加速或勻減速。#include<BoeBot.h>#include<uart.h>int main(void)int pulseCount;uart_Init();printf("Program Running!n");for(pulseCount=10;pul

30、seCount<=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<=75;pulseCount+)P1_1=1;delay_nus(1700);P1_1=0;P1_0=1;delay_nus(1300);P1_0=0;delay_nms(20);for(pulseCount=200;pulseCount>=0;pulseCo

31、unt=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);while(1);5、 修改MovementsWithOneFuntion.c使機(jī)器人走一個(gè)正方形。#include <BoeBot.h>#include <uart.h>void Move(int counter,int PC1_pulseWide,int PC0_pulseWide)int i;for(i=1;i<=counter;i+)

32、P1_1=1;delay_nus(PC1_pulseWide);P1_1=0;P1_0=1;delay_nus(PC0_pulseWide);P1_0=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)報(bào)告要求1、程序設(shè)計(jì)小車要循環(huán)多少

33、次才能旋轉(zhuǎn)精確的90度,觀察到的運(yùn)行效果并加以分析,程序調(diào)試心得。2、更改ForwardLeftRightBackward.c,使機(jī)器人的每一個(gè)動作都能夠勻加速或勻減速。寫出程序,觀察到的運(yùn)行效果并加以分析,程序調(diào)試心得。3、修改MovementsWithOneFuntion.c,使機(jī)器人走一個(gè)正方形。寫出程序,觀察到的運(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

34、,這是什么意思?程序運(yùn)行效果是怎樣的?2、機(jī)器人完成各種巡航動作的過程中,每次啟動和停止時(shí),動作太快,幾乎傾倒,為什么會這樣呢?采用什么方法可以解決這種問題?3、讓小車實(shí)現(xiàn)轉(zhuǎn)彎的方法有哪些?注:實(shí)驗(yàn)操作現(xiàn)場檢查。實(shí)驗(yàn)四 C51接口與觸覺導(dǎo)航一、實(shí)驗(yàn)?zāi)康?、接觸型傳感器作為輸入反饋與C51單片機(jī)的編程實(shí)現(xiàn)。 2、編程使機(jī)器人基于胡須導(dǎo)航,條件判斷語句的嵌套與機(jī)器人的人工智能決策的編程使機(jī)器人逃離進(jìn)入墻角死區(qū)。二、實(shí)驗(yàn)設(shè)備及軟件寶貝車機(jī)器人、ISP下載線、串行接口、USB接口、計(jì)算機(jī)、電源、安裝機(jī)器人胡須,所需硬件如圖4.1。元件清單: (1) 胡須狀金屬絲2根; (2) 平頭M3x22盤頭螺釘2

35、個(gè); (3) 13mm圓形立柱2個(gè);(4) M3尼龍墊圈2個(gè); (5) 3-pin公-公接頭2個(gè);(6) 220電阻2個(gè); (7) 10k電阻2個(gè)。 圖4.1 胡須硬件Keil uVision2 IDE集成開發(fā)環(huán)境、PROGISP1.72下載軟件、串口調(diào)試軟件。三、實(shí)驗(yàn)內(nèi)容和步驟1、通過布置恰當(dāng)?shù)碾娐?,在機(jī)器人前端安裝并測試一個(gè)稱為胡須的觸覺開關(guān),對C51單片機(jī)編程來監(jiān)視觸覺開關(guān)的狀態(tài)。安裝并測試機(jī)器人胡須見圖4.2。確定兩條胡須比較靠近,但又不接觸面包板上的3-pin頭,推薦保持3mm的距離。參考接線圖4.3,搭建胡須電路。色環(huán)電阻你會讀嗎?(提示:棕紅橙黃綠,藍(lán)紫灰白黑)220電阻(紅紅黑

36、黑棕),10k電阻(棕黑黑紅棕)。注意:右邊胡須狀態(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的四個(gè)端口P0、P1、P2和P3是可以按位來操作,從低到高依次為第0口、第1口第7口,書寫分別為PX.0、PX.1、PX.7(X取0到3)。P1&0x10:取P1.4P1P1.7P1.6P1.5P1.4P1.3P1.2P1.1

37、P1.00x1000010000P2&0x08:取P2.3P2P2.7P2.6P2.5P2.4P2.3P2.2P2.1P2.00x0800001000P1&0x10和P2&0x08分別提取了P1.4和P2.3的值,屏蔽了其他位。測試胡須源程序TestWhiskers.c。要用到調(diào)試終端,當(dāng)程序運(yùn)行時(shí)要確保串口已經(jīng)接好。弄清哪條胡須是左胡須,哪條是右胡須。當(dāng)胡須沒有被碰到,使引腳電壓為5V,胡須狀態(tài)為1;當(dāng)胡須被碰到時(shí),使引腳電壓為0V,胡須狀態(tài)為0。2、通過胡須導(dǎo)航。機(jī)器人行走時(shí),如果有胡須被觸動,意味著碰到了什么。嘗試讓寶貝車向前行走,當(dāng)在其路線上遇到障礙物時(shí),它將后

38、退、旋轉(zhuǎn)并向另一個(gè)方向行走以避開障礙物。具體程序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、基于人工智能決策的編程使機(jī)器人逃離進(jìn)入墻角死區(qū)。編程使機(jī)器人逃離進(jìn)入墻角死區(qū)。當(dāng)寶貝車進(jìn)入墻角時(shí),左胡須觸墻,于是它倒退,右轉(zhuǎn)。當(dāng)小車再向前行走,右胡須觸墻,于是再倒退,左轉(zhuǎn)。然后它又前進(jìn)又會碰到左墻,再次碰到右墻等,直到有人把它從困境中解救出來。使用含ifelse嵌套語句用

39、于探測連續(xù)的、交替出現(xiàn)的胡須觸動。編程使寶貝車在行走時(shí),輪流觸動它的胡須,胡須在經(jīng)過四次觸動之后,寶貝車會進(jìn)行后退、旋轉(zhuǎn)180°離開墻角。具體程序EscapingCorners.c。嘗試增加或減小變量counter的數(shù)值,觀察機(jī)器人在正常行走過程中是否有任何不同?!就卣褂?xùn)練】觸覺導(dǎo)航機(jī)器人走迷宮競賽。四、實(shí)驗(yàn)報(bào)告要求1、搭建觸覺導(dǎo)航電路,測試胡須源程序TestWhiskers.c。使用串口調(diào)試助手觀察運(yùn)行效果并加以分析。程序調(diào)試心得。#include<BoeBot.h>#include<uart.h>int P1_4state(void)/獲取P1_4 的狀態(tài)

40、return (P1&0x10)?1:0;int P2_3state(void)/獲取P2_3 的狀態(tài)return (P2&0x08)?1:0;int main(void)uart_Init();printf("WHISKER STARTESn");while(1)printf("右邊胡須的狀態(tài):%d ",P1_4state();printf("左邊胡須的狀態(tài):%dn",P2_3state();delay_nms(150);2、 程序RoamingWithWhiskers.c觸覺導(dǎo)航的實(shí)現(xiàn),胡須機(jī)器人怎樣行走。#inc

41、lude<BoeBot.h>#include<uart.h>int P1_4state(void)return (P1&0x10)?1:0;int P2_3state(void)return (P2&0x08)?1:0;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

42、_0=1;delay_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;i<=65;i+)P1_1=1;delay_nus(1300);P1_1=0;P1_0=1;delay_nus(1700);P1_0=0;delay_nms(20);int main(void)uart

43、_Init();printf("Program Running!n");while(1)if(P1_4state()=0)&&(P2_3state()=0) /兩胡須同時(shí)碰到Backward(); /向后Left_Turn();/向左Left_Turn();/向左else if(P1_4state()=0) /右胡須碰到Backward();/向后Left_Turn();/向左else if(P2_3state()=0) /左胡須碰到Backward();/向后Right_Turn();/向右else /胡須沒有碰到Forward();/向前3、 程序Esc

44、apingCorners.c是如何工作的。#include<BoeBot.h>#include<uart.h>int P1_4state(void)return (P1&0x10)?1:0;int P2_3state(void)return (P2&0x08)?1:0;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;

45、delay_nus(1300);P1_1=0;P1_0=1;delay_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;i<=65;i+)P1_1=1;delay_nus(1300);P1_1=0;P1_0=1;delay_nus(1700);P1_0=0;delay_n

46、ms(20);int main(void)int counter=1; /胡須碰撞總次數(shù)int old2=1; /右胡須舊狀態(tài)int old3=0; /左胡須舊狀態(tài)uart_Init();printf("Program Running!n");while(1)if(P1_4state()!=P2_3state()if(old2!=P1_4state()&&(old3!=P2_3state()counter=counter+1;old2=P1_4state();old3=P2_3state();if(counter>4)counter=1;Backwar

47、d();/向后Left_Turn();/向左Left_Turn();/向左elsecounter=1;if(P1_4state()=0)&&(P2_3state()=0)Backward();/向后Left_Turn();/向左Left_Turn();/向左else if(P1_4state()=0)Backward();/向后Left_Turn();/向左else if(P2_3state()=0)Backward();/向后Right_Turn();/向右elseForward();/向前五、思考題1、觸覺導(dǎo)航的原理是什么?通過胡須導(dǎo)航時(shí)如何避開障礙物?2、語句Return

48、(P1&0x10)?1:0的意義是什么?試說明。3、語句if(P1_4state()=0)&&( P2_3state()=0)Backward();Left_Turn();Left_Turn(); 的含義是什么?4、在胡須導(dǎo)航程序中函數(shù)Forward()有變動,只發(fā)送一個(gè)脈沖,然后返回,這樣的好處是什么?5、是否有且只有一根胡須被觸動,如何通過獲取左、右胡須的狀態(tài)作出判斷?寫出具體的判斷語句。注:實(shí)驗(yàn)操作現(xiàn)場檢查。實(shí)驗(yàn)五 C51接口與紅外線導(dǎo)航一、實(shí)驗(yàn)?zāi)康?、掌握紅外傳感器作為輸入反饋與單片機(jī)的編程實(shí)現(xiàn),讓機(jī)器人的C51單片機(jī)可以收發(fā)紅外光信號。 2、使用紅外線發(fā)射和接

49、收器件探測道路,編程實(shí)現(xiàn)高性能的IR導(dǎo)航和邊沿探測。二、實(shí)驗(yàn)設(shè)備及軟件寶貝車機(jī)器人、ISP下載線、串行接口、USB接口、計(jì)算機(jī)、電源。所需元件:(1) 兩個(gè)紅外檢測器,如圖5.1; (2) 兩個(gè)IR LED,如圖5.2; (3) 四個(gè)470電阻 (黃紫黑黑棕);(4) 兩個(gè)9013三極管,如圖5.3。 圖5.1紅外檢測器 圖5.2紅外線二極管LED發(fā)射器 圖5.3.1 三極管9013管腳圖 圖5.3.2 三極管9013結(jié)構(gòu)圖及符號圖Keil uVision2 IDE集成開發(fā)環(huán)境、PROGISP1.72下載軟件、串口調(diào)試軟件。三、實(shí)驗(yàn)內(nèi)容和步驟使用紅外光來照射機(jī)器人前進(jìn)的路線,確定何時(shí)有光線從被

50、探測目標(biāo)反射回來,通過檢測反射回來的紅外光可以確定前方是否有物體。機(jī)器人使用紅外線二極管LED發(fā)射紅外光線,紅外檢測器相當(dāng)于眼睛,檢測到反射回來的紅外光線,并發(fā)出信號來表明檢測到從物體反射回紅外線,如圖5.4。紅外線(IR)接收/檢測器有內(nèi)置的光濾波器,除了需要檢測980nm波長的紅外線外,幾乎不允許其他光通過。紅外檢測器還有一個(gè)電子濾波器,只允許大約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的紅外光,如

51、果紅外光被小車路徑上的物體反射回來,紅外檢測器將給微控制器發(fā)送一個(gè)信號,讓它知道已經(jīng)檢測到反射回的紅外光。當(dāng)沒有IR信號返回時(shí),探測器的輸出狀態(tài)為高電平。當(dāng)它探測到被物體反射的38.5kHz的紅外信號時(shí),它的輸出為低電平。放一個(gè)物體,比如手或一張紙,距離IR組大約1英寸。驗(yàn)證當(dāng)你放一個(gè)物體在IR組前時(shí),調(diào)試終端是否會顯示0,當(dāng)你將物體移開時(shí),它是否顯示1。注意:保持寶貝車機(jī)器人與串口電纜的連接,因?yàn)槟銓⒂么谡{(diào)試助手來測試你的IR組。參考程序(TestLeftIrPair.c):#include<BoeBot.h>#include<uart.h>int P1_2stat

52、e(void)return (P1&0x04)?1:0;int main(void)int counter;int irDetectLeft;uart_Init();printf("Program Running!n");while(1)for(counter=0;counter<38;counter+)P1_3=1;delay_nus(13);P1_3=0;delay_nus(13);irDetectLeft=P1_2state();printf("irDetectLeft=%dn",irDetectLeft);delay_nms(100

53、);2、IR檢測器探測和避開障礙物IR檢測器的輸出與觸須的輸出非常相象。沒有檢測到物體時(shí),輸出為高,檢測到物體時(shí),輸出為低。故采取與胡須相同的導(dǎo)航策略。#include<BoeBot.h>#include<uart.h>#include<intrins.h>#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_6void IR

54、Launch(unsigned char IR)int counter;if(IR='L') /左邊發(fā)射for(counter=0;counter<38;counter+) /發(fā)射時(shí)間比胡須長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;counter<38;counter+)RightLaunch=1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論