基于arm+linux的嵌入式探月小車_第1頁
已閱讀1頁,還剩36頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  嵌入式探月小車作品設(shè)計(jì)報(bào)告</p><p>  廣東科貿(mào)職業(yè)學(xué)院信息工程系</p><p>  開發(fā)小組成員:黃文哲、歐信、楊毅英</p><p>  指導(dǎo)老師: 滕泓虬、禹濤</p><p><b>  2011年5月</b></p><p><b>  目

2、 錄</b></p><p>  1.原創(chuàng)性聲明1</p><p><b>  2.摘要2</b></p><p>  3.嵌入式探月小車系統(tǒng)方案3</p><p><b>  3.1概述3</b></p><p>  3.2系統(tǒng)方案3<

3、;/p><p>  3.3嵌入式探月小車4</p><p>  3.4功能與指標(biāo)4</p><p>  4.探月小車硬件設(shè)計(jì)5</p><p>  4.1硬件框圖5</p><p>  4.2MINI2440開發(fā)板簡介5</p><p>  4.3主要I/O口說明6</

4、p><p>  4.4直流電機(jī)驅(qū)動模塊7</p><p>  4.4.1電機(jī)驅(qū)動模塊實(shí)物圖7</p><p>  4.4.2L298N驅(qū)動原理圖8</p><p>  4.4.3H橋控制方案8</p><p>  4.5超聲波測距模塊(避障)9</p><p>  4.6無線通

5、訊模塊10</p><p>  4.7攝像頭模塊11</p><p>  5嵌入式探月車軟件設(shè)計(jì)11</p><p>  5.1軟件整體設(shè)計(jì)12</p><p>  5.2驅(qū)動程序設(shè)計(jì)12</p><p>  5.3添加MINI2440 GPIO LED燈支持12</p><p

6、>  5.4電機(jī)控制子程序13</p><p>  5.5無線通訊子程序16</p><p>  5.6攝像頭控制程序17</p><p>  5.7Openwrt嵌入式系統(tǒng)的移植17</p><p>  5.8嵌入式小車的PC客戶端設(shè)計(jì)22</p><p>  6系統(tǒng)測試方案25<

7、/p><p>  6.1直流電機(jī)驅(qū)動模塊(l298n)測試25</p><p>  6.2無線通信模塊測試26</p><p>  7創(chuàng)新性描述27</p><p><b>  8附錄1</b></p><p><b>  原創(chuàng)性聲明</b></p>

8、<p><b>  參賽作品原創(chuàng)性聲明</b></p><p>  本人鄭重聲明:所呈交的參賽作品報(bào)告,是本人和隊(duì)友獨(dú)立進(jìn)行研究工作所取得的成果。除文中已經(jīng)注明引用的內(nèi)容外,本論文不包含任何其他個(gè)人或集體已經(jīng)發(fā)表或撰寫過的作品成果,不侵犯任何第三方的知識產(chǎn)權(quán)或其他權(quán)利。本人完全意識到本聲明的法律結(jié)果由本人承擔(dān)。</p><p><b>  參賽隊(duì)

9、員簽名:</b></p><p>  日期: 年 月 日</p><p><b>  摘要</b></p><p>  探月小車實(shí)現(xiàn)了全方位自主移動及避障,行走中的圖像采集、無線數(shù)據(jù)傳輸。采用ARM處理器S3C2440作為主板控制器。選擇一種獨(dú)特的嵌入式LINUX發(fā)行版— OpenWrt作為操作系統(tǒng)。小車系統(tǒng)采用兩層

10、架構(gòu),上層以S3C2440為核心,負(fù)責(zé)圖像采集,并將圖像通過wifi方式發(fā)送給PC機(jī);下層以51單片機(jī)為核心,負(fù)責(zé)運(yùn)動控制,傳感器數(shù)據(jù)處理。</p><p>  兩層架構(gòu)在控制、用戶擴(kuò)展方面有明顯優(yōu)勢。下層單片機(jī)接口上可接多個(gè)擴(kuò)展模塊。選擇OpenWrt作為操作系統(tǒng),也是作品的一個(gè)大膽創(chuàng)新之處。</p><p>  關(guān)鍵詞:ARM 嵌入式 linux S3C2440 OpenWrt 智能

11、wifi 攝像</p><p>  嵌入式探月小車系統(tǒng)方案</p><p><b>  概述</b></p><p>  近年來隨著人工智能技術(shù)、計(jì)算機(jī)技術(shù)等相關(guān)技術(shù)的發(fā)展,對移動機(jī)器人的研究越來越多。嵌入式探月小車實(shí)際上是一種移動機(jī)器人,它可實(shí)現(xiàn)多種不同功能,如探測險(xiǎn)情、巡視、圖像采集、定位、無線通信等。它還可以作為各種智能控制方法(包括動態(tài)

12、避障、路徑規(guī)劃、群體協(xié)作策略) 的良好載體,開展研究。</p><p><b>  系統(tǒng)方案</b></p><p>  “履帶式探月小車”采用兩層架構(gòu)。上層以ARM處理器S3C2440為核心,選用MINI2440開發(fā)板作為上層的主板,負(fù)責(zé)圖像采集,并將圖像通過wifi方式發(fā)送給遠(yuǎn)端的PC機(jī)。wifi無線通信是利用PC機(jī)與無線路由器搭配環(huán)境平臺共同實(shí)現(xiàn)的。</p

13、><p>  下層是以51單片機(jī)為核心的單片機(jī)控制板,由作者手工焊接單片機(jī)芯片及外圍電路而成。下層負(fù)責(zé)小車運(yùn)動控制,傳感器數(shù)據(jù)處理。51單片機(jī)通過IO口輸出PWM信號控制直流電機(jī)的轉(zhuǎn)速,實(shí)現(xiàn)小車的前進(jìn)、停止、左轉(zhuǎn)和右轉(zhuǎn)。單片機(jī)接口電路上掛接了1個(gè)超聲波測距模塊、1個(gè)人體紅外感應(yīng)模塊、1個(gè)步進(jìn)電機(jī)模塊。超聲波測距模塊用來實(shí)現(xiàn)小車避障。在探月小車的前端安裝了一個(gè)步進(jìn)電機(jī),而超聲波測距模塊安置在步進(jìn)電機(jī)的轉(zhuǎn)軸上,步進(jìn)電機(jī)不

14、停地來回轉(zhuǎn)動,隨之轉(zhuǎn)動,這樣用1個(gè)超聲波測距模塊就可實(shí)現(xiàn)多方位測距,大大減少了超聲波測距模塊的數(shù)量。</p><p>  小車主要由硬件系統(tǒng)和軟件系統(tǒng)構(gòu)成。硬件系統(tǒng)主要包括:ARM處理器、單片機(jī)、外圍接口電路、外設(shè)、小車車體以及電源等,其中ARM處理器是上層的核心,51單片機(jī)是下層的核心;軟件包括:嵌入式LINUX操作系統(tǒng)、外設(shè)驅(qū)動程序、LINUX應(yīng)用程序以及單片機(jī)應(yīng)用程序等。我們并沒有選用平常的嵌入式LINUX

15、版本,而是另辟蹊徑,選用一種獨(dú)特的嵌入式LINUX發(fā)行版之— OpenWrt 作為操作系統(tǒng)。OpenWrt提供了一個(gè)完全可寫的文件系統(tǒng)及軟件包管理,它通過簡單易用的方式,極大地降低了嵌入式linux開發(fā)的門檻,它允許開發(fā)者使用軟件包的概念來定制嵌入式設(shè)備,簡化了嵌入軟件開發(fā)的工序。我們由于選擇了OpenWrt,在開發(fā)過程中,我們發(fā)現(xiàn),定制linux的內(nèi)核變成了一件相當(dāng)容易的事情。</p><p>  探月小車的工

16、作流程為:車載傳感器模塊實(shí)時(shí)采集周圍環(huán)境信息,將此數(shù)據(jù)信息傳輸?shù)叫≤嚳刂葡到y(tǒng)中,單片機(jī)通過數(shù)據(jù)分析獲取有效數(shù)據(jù),從而獲知小車與障礙物的相對位置,然后根據(jù)此位置信息產(chǎn)生控制信號,單片機(jī)會產(chǎn)生PWM信號控制直流電機(jī)來控制小車轉(zhuǎn)向,從而達(dá)到小車自主“行走”的目的。下層的單片機(jī)與上層的ARM處理器通過串口來通信,ARM主板可將下層單片機(jī)控制板的工作數(shù)據(jù)通過無線wifi的方式傳輸?shù)竭h(yuǎn)端的PC機(jī)。ARM主板平時(shí)不間斷地將USB攝像頭采集的清晰現(xiàn)場圖

17、片發(fā)給PC機(jī)。</p><p><b>  嵌入式探月小車</b></p><p><b>  功能與指標(biāo)</b></p><p>  探月小車的功能特點(diǎn):</p><p>  小車直線行走和轉(zhuǎn)彎行走</p><p>  履帶式小車,履帶底盤長180mm,寬135mm,高58

18、mm,可成功越障30~40mm,爬坡能力:40度</p><p>  USB攝像頭圖像采集</p><p>  無線圖像傳輸,可達(dá)每秒15幀</p><p>  超聲波測距及避障,最大測距80CM</p><p>  攝像頭帶云臺,轉(zhuǎn)動范圍360度</p><p>  主板采用S3C2440處理芯片,系統(tǒng)主頻穩(wěn)定400

19、MHz,可以輕松應(yīng)對視頻采集,視頻處理,無線傳輸,聯(lián)網(wǎng)和語音控制等功能。</p><p>  可擴(kuò)展能力強(qiáng):多種傳感器模塊,并支持傳感器擴(kuò)展</p><p>  Linux操作系統(tǒng)支持,可擴(kuò)展高級網(wǎng)絡(luò)和圖形應(yīng)用</p><p>  通過WebUI的方式對小車上的嵌入式linux系統(tǒng)進(jìn)行配置</p><p><b>  探月小車硬件設(shè)

20、計(jì)</b></p><p><b>  硬件框圖</b></p><p>  MINI2440開發(fā)板簡介</p><p>  MINI2440開發(fā)板基于三星S3C2440芯片,如下圖所示:</p><p><b>  主要接口說明:</b></p><p>  電

21、源接口:輸入電壓不能大于7伏電壓,標(biāo)準(zhǔn)電源試配器為5伏。</p><p>  音頻接口:紅色為音頻輸入接口,另一個(gè)為音頻輸出接口。</p><p>  USB接口:主要用于傳輸數(shù)據(jù)。</p><p>  串口接口:串口接口主要是它能使PC機(jī)和開發(fā)板直接進(jìn)行交換操作和數(shù)據(jù)傳送,完成調(diào)試。SB</p><p>  網(wǎng)卡接口:在啟動操作系統(tǒng)后,接上

22、無線網(wǎng)卡,就可以對小車發(fā)送無線信號。</p><p>  J tag接口:J tag接口主要作用是當(dāng)Nand Flash或 Nor Flash 中沒有bootloader時(shí),使用J tag接口進(jìn)行燒寫。</p><p><b>  主要I/O口說明</b></p><p>  主控芯片為三星S3C2440芯片,如圖:</p>&l

23、t;p>  主要用到的I/O口包括:</p><p>  1. 用COM2 IO與單片機(jī)通訊。</p><p>  2. 用GPIO nLED_1、nLED_2、nLED_3、nLED_4</p><p>  來顯示當(dāng)前系統(tǒng)狀態(tài).</p><p><b>  直流電機(jī)驅(qū)動模塊</b></p>&l

24、t;p><b>  電機(jī)驅(qū)動模塊實(shí)物圖</b></p><p>  驅(qū)動板主要采用了L298N芯片,它具有帶載能力強(qiáng)的特點(diǎn)。</p><p>  L298N驅(qū)動原理圖</p><p>  驅(qū)動電路芯片外圍電路主要用由二極管構(gòu)成的電橋電路,兩組電機(jī)</p><p><b>  并聯(lián)而成。</b>

25、</p><p><b>  H橋控制方案 </b></p><p>  小車通過采用L298N芯片可以達(dá)到目的,整體控制方案如圖</p><p>  電機(jī)共有四4路PWM輸出分別作為左右輪的驅(qū)動,而通過兩路PWM輸出可控制一個(gè)電機(jī),兩電機(jī)為并聯(lián)即可。</p><p>  當(dāng)使能信號 ENABLE 為高時(shí) 輸出才隨輸入變

26、化,否則為高阻態(tài),所以焊接時(shí),ENABLE及VS均接VCC。</p><p><b>  具體驅(qū)動過程為:</b></p><p>  通過編程由控制芯片經(jīng)PWM發(fā)出驅(qū)動信號,PWM輸出作為L298N的輸入,經(jīng)L298N轉(zhuǎn)換輸出控制信號使電機(jī)轉(zhuǎn)動,從而實(shí)現(xiàn)電動機(jī)的驅(qū)動。</p><p>  PWM輸出信號的高低則可以控制直流電機(jī)轉(zhuǎn)速,當(dāng)占空比大

27、時(shí),轉(zhuǎn)速高,占空比小時(shí),轉(zhuǎn)速低,所以當(dāng)PWM信號輸出占空比為0時(shí)可控制電機(jī)的停止。</p><p>  當(dāng)左輪停止,右輪轉(zhuǎn)時(shí),小車左轉(zhuǎn)。 當(dāng)右輪停止,左輪轉(zhuǎn)動時(shí),小車右轉(zhuǎn)。而兩路PWM輸出的正負(fù)順序轉(zhuǎn)換則可控制電機(jī)的正反轉(zhuǎn),進(jìn)而控制小車的前進(jìn)和后退。</p><p>  超聲波測距模塊(避障)</p><p><b>  基本工作原理:</b>

28、</p><p> ?。?)采用IO口TRIG觸發(fā)測距,給至少10us的高電平信號;</p><p> ?。?)模塊自動發(fā)送8個(gè)40khz的方波,自動檢測是否有信號返回;</p><p> ?。?)有信號返回,通過IO口ECHO輸出一個(gè)高電平,高電平持續(xù)的時(shí)間就是超聲波從發(fā)射到返回的時(shí)間。測試距離=(高電平時(shí)間*聲速(340M/S))/2;</p>&

29、lt;p>  與單片機(jī)連接如右圖接線,VCC供5V電源,GND為地,TRIG(接單片機(jī)P1^0)觸發(fā)控制信號輸入,ECHO(接單片機(jī)P1^1)回響信號輸出等四支線。</p><p><b>  無線通訊模塊</b></p><p>  通過無線網(wǎng)卡實(shí)現(xiàn)無線數(shù)據(jù)的傳輸。</p><p>  上圖是我們在小車上使用的無線網(wǎng)卡模塊。</p

30、><p>  下面是他的具體參數(shù):</p><p>  主芯片:RealTek RTL8187L</p><p>  網(wǎng)絡(luò)標(biāo)準(zhǔn) IEEE 802.11g、IEEE 802.11b     數(shù)據(jù)傳輸率 54、48、36、24、18、12、11、9、6、5.5、2、1Mbps  有

31、效工作距離 室內(nèi)最遠(yuǎn)100米、外最遠(yuǎn)300米(環(huán)境而異)   頻率范圍 2.4-2.4835GHz      信道數(shù) 13       調(diào)制方式 OFDM、DBPSK、DQPSK、CCK    

32、支持網(wǎng)絡(luò)協(xié)議 CSMA/CA with ACK     傳輸方式 直接序列擴(kuò)頻 (DSSS)     靈敏度 54:-68dBm@10%PER、11M:-85dBm@8% PER、6M:-88dBm@10% PER、1M:-90dBm@8% PER、256K:-105dBm@8% PER(典型值)

33、60;   天線 天線增益 5dBi    總線接口 USB.</p><p>  在Openwrt里面對該網(wǎng)卡的支持也非常簡單。</p><p>  只需要選擇上對應(yīng)的驅(qū)動就可以。        </p><

34、;p><b>  攝像頭模塊</b></p><p>  攝像頭的安裝位置對小車的性能有很大的影響,主要體現(xiàn)在圖像采樣效果和對小車重心的影響兩個(gè)方面。安裝的低了,易導(dǎo)致視野不夠廣闊,影響尋線的有效范圍;安裝得高了,指引線在圖像坐標(biāo)上會變得過窄而無法被檢測到。 若安裝的太高,系統(tǒng)會因重心抬高而穩(wěn)定性變差。若安裝太靠前,則小車的重心會前移,進(jìn)而在前行的過程中容易出現(xiàn)“點(diǎn)頭”的不穩(wěn)定情況,重

35、心前移也易導(dǎo)致驅(qū)動輪即后輪對地的壓力減小,容易出現(xiàn)驅(qū)動力不足或者打滑的現(xiàn)象。安裝位置合適的一個(gè)原則就是:攝像頭的安裝,首先必須滿足頭像采樣效果的需要。控制策略簡單,則所需的拍攝范圍就可較?。环粗呗詮?fù)雜,需獲得的賽道信息較多,則拍攝范圍應(yīng)大一些。其次,攝像頭的安裝對小車重心的影響不能導(dǎo)致小車出現(xiàn)運(yùn)動不穩(wěn)定的現(xiàn)象。 </p><p>  另外,在Openwrt對該攝像頭的支持只需要選擇上下面kmod-video-c

36、ore. kmod-video-gspca-core. kmod-video-gspca-zc3xx. kmod-usb-video.內(nèi)核模塊。</p><p>  嵌入式探月車軟件設(shè)計(jì)</p><p>  軟件部分是小車的智能化的體現(xiàn),它控制小車所有的運(yùn)行狀態(tài)。</p><p>  程序在Kubuntu CodeBlock IDE進(jìn)行編寫,用Openwrt編譯出來

37、的ARM eabi交叉編譯工具編譯,在經(jīng)過終端Sercurt-CRT通過串行口向小車燒入交叉編譯后的程序以及系統(tǒng)。</p><p>  應(yīng)用軟件控制小車的避障、攝像、發(fā)送視頻等行為。</p><p>  此外,在主機(jī)端用vsftp軟件架設(shè)FTP服務(wù)器,并通過802.11.g(RTL8187)無線網(wǎng)卡建立無線局域網(wǎng)。</p><p>  這樣,小車就可以接收控制到達(dá)指

38、定地點(diǎn)拍照并發(fā)送圖片,而PC機(jī)端就可以接收通過wifi傳送過來的圖片。</p><p><b>  軟件整體設(shè)計(jì)</b></p><p>  “探月車”軟件部分整體設(shè)計(jì)如下圖所示:</p><p><b>  驅(qū)動程序設(shè)計(jì)</b></p><p>  驅(qū)動程序利用MINI2440開發(fā)板提供的例程進(jìn)行

39、改寫,并編譯進(jìn)內(nèi)核。</p><p>  添加MINI2440 GPIO LED燈支持</p><p>  通過參考MINI2440電路圖,得知LED連接GPIO引腳:</p><p>  LED1 GPIO5</p><p>  LED1 GPIO6</p><p>  LED1 GPIO7</p>&

40、lt;p>  LED1 GPIO8</p><p><b>  主要代碼 :</b></p><p><b>  //LED</b></p><p>  static struct gpio_led mini2440_led_pins[] = {</p><p><b>  {<

41、;/b></p><p>  .name= "LED1",</p><p>  .gpio= S3C2410_GPB(5),</p><p>  .active_low= true,</p><p><b>  },</b></p><p><b> 

42、 {</b></p><p>  .name= "LED2",</p><p>  .gpio= S3C2410_GPB(6) ,</p><p>  .active_low= true,</p><p><b>  },</b></p><p><

43、b>  {</b></p><p>  .name= "LED3",</p><p>  .gpio= S3C2410_GPB(7),</p><p>  .active_low= true,</p><p><b>  },</b></p><p>

44、;<b>  {</b></p><p>  .name= "LED4",</p><p>  .gpio= S3C2410_GPB(8),</p><p>  .active_low= true,</p><p><b>  },</b></p><

45、;p><b>  };</b></p><p>  static struct gpio_led_platform_data mini2440_led_data = {</p><p>  .num_leds= ARRAY_SIZE(mini2440_led_pins),</p><p>  .leds= mini2440_le

46、d_pins,</p><p><b>  };</b></p><p>  static struct platform_device mini2440_leds = {</p><p>  .name= "leds-gpio",</p><p>  .id= -1,</p>

47、<p>  .dev.platform_data= &mini2440_led_data,</p><p><b>  };</b></p><p>  //GPIO resource</p><p>  static struct resource gpiodev_resource = {</p><

48、;p>  .start= 0xFFFFFFFF,</p><p><b>  };</b></p><p><b>  }</b></p><p><b>  電機(jī)控制子程序</b></p><p><b>  基本代碼如下:</b></

49、p><p>  Motor.c //電機(jī)控制</p><p>  #include<reg52.h></p><p>  sbit StepMotor1One=P2^0; //步進(jìn)電機(jī)1第一相</p><p>  sbit StepMotor1Two=P2^1; //步進(jìn)電機(jī)1第二相</p><

50、;p>  sbit StepMotor1Three=P2^2; //步進(jìn)電機(jī)1第三相</p><p>  sbit StepMotor1Four=P2^3; //步進(jìn)電機(jī)1第四相</p><p>  sbit MotorLeft1=P1^2; //直流電機(jī)</p><p>  sbit MotorLeft2=P1^3;</p><

51、;p>  sbit MotorRight1=P1^4;</p><p>  sbit MotorRight2=P1^5;</p><p>  sbit MotorLeftEn=P1^6; //直流電機(jī)使能</p><p>  sbit MotorRightEn=P1^7;</p><p>  void delay(unsigned i

52、nt s) //延時(shí)函數(shù)</p><p><b>  {</b></p><p>  while(s--);</p><p><b>  }</b></p><p>  void Motor(unsigned char a,unsigned char b,unsigned char c)

53、//主電機(jī)控制函數(shù)</p><p><b>  {</b></p><p>  unsigned char z=0;</p><p><b>  switch(a)</b></p><p><b>  {</b></p><p>  case '

54、1': //進(jìn)入左右電機(jī)控制</p><p>  MotorLeftEn=1;</p><p>  MotorRightEn=1;</p><p>  if(b=='1') //左驅(qū)電機(jī)</p><p><b>  {</b></p><

55、;p>  if(c=='1')</p><p><b>  {</b></p><p>  MotorLeft1=1; //左驅(qū)正轉(zhuǎn)</p><p>  MotorLeft2=0;</p><p><b>  }</b></p><p>  else

56、 if(c=='2')</p><p><b>  {</b></p><p>  MotorLeft1=0; //左驅(qū)反轉(zhuǎn)</p><p>  MotorLeft2=1;</p><p><b>  }</b></p><p><b>  el

57、se</b></p><p><b>  {</b></p><p>  MotorLeft1=1;//停</p><p>  MotorLeft2=1;</p><p><b>  }</b></p><p><b>  }</b>&l

58、t;/p><p>  else if(b=='2') //右驅(qū)電機(jī)</p><p><b>  {</b></p><p>  if(c=='1')////右驅(qū)正轉(zhuǎn)</p><p><b>  {</b></p><p>  MotorRi

59、ght1=0;</p><p>  MotorRight2=1;</p><p><b>  }</b></p><p><b>  else</b></p><p>  if(c=='2')//右驅(qū)反轉(zhuǎn)</p><p><b>  {<

60、/b></p><p>  MotorRight1=1;</p><p>  MotorRight2=0;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p&

61、gt;<p>  MotorRight1=1;//停</p><p>  MotorRight2=1;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p>&l

62、t;p>  case '2': //進(jìn)入步進(jìn)電機(jī)控制</p><p><b>  P2=0xFF;</b></p><p>  if(b=='1') //StepMotor1</p><p><b>  {</b></p>

63、<p>  if(c=='1') </p><p><b>  {</b></p><p><b>  z=135;</b></p><p><b>  while(z)</b></p><p><b>  {</b>

64、</p><p><b>  z--;</b></p><p>  StepMotor1One=0;</p><p>  delay(300);</p><p>  StepMotor1One=1;</p><p>  StepMotor1Two=0; </p><p>

65、  delay(300);</p><p>  StepMotor1Two=1;</p><p>  StepMotor1Three=0;</p><p>  delay(300);</p><p>  StepMotor1Three=1;</p><p>  StepMotor1Four=0;</p>

66、<p>  delay(300);</p><p>  StepMotor1Four=1;</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(c=='2')</p><p><b> 

67、 {</b></p><p><b>  z=135;</b></p><p><b>  while(z)</b></p><p><b>  {</b></p><p><b>  z--;</b></p><p>

68、  StepMotor1Four=0;</p><p>  delay(300);</p><p>  StepMotor1Four=1;</p><p>  StepMotor1Three=0; </p><p>  delay(300);</p><p>  StepMotor1Three=1;</p>

69、;<p>  StepMotor1Two=0;</p><p>  delay(300);</p><p>  StepMotor1Two=1;</p><p>  StepMotor1One=0;</p><p>  delay(300);</p><p>  StepMotor1One=1;</

70、p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  P2=0xFF;</b></p><p><b>  break;</b&g

71、t;</p><p>  default :break;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  無線通訊子程序</b></p><p>  此部分內(nèi)容為Linux下socket編程,

72、為客戶端提供遠(yuǎn)程控制支持,部分代碼如下:</p><p>  int sendstring(char *addr,int port,char *sendchar)</p><p><b>  {</b></p><p>  struct sockaddr_in s_addr;</p><p><b>  int

73、 sock;</b></p><p>  int addr_len;</p><p>  int len,i;</p><p>  if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {</p><p>  perror("no socket");</p&

74、gt;<p>  exit(errno);</p><p><b>  }</b></p><p><b>  else</b></p><p>  printf("create socket.\n\r");</p><p>  s_addr.sin_family

75、= AF_INET;</p><p><b>  if (port)</b></p><p>  s_addr.sin_port = htons(port);</p><p><b>  else</b></p><p>  s_addr.sin_port = htons(10001);</p

76、><p>  if (*addr)</p><p>  s_addr.sin_addr.s_addr = inet_addr(addr);</p><p><b>  else {</b></p><p>  printf("Send a message must have a receiver!\n")

77、;</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  addr_len = sizeof(s_addr);</p><p><b>  len = -1;</b></p><p>  for

78、 (i = 0;i<4;i++) {</p><p>  if(len < 0)len = sendto(sock,sendchar, strlen(sendchar), 0,(struct sockaddr *) &s_addr, addr_len); </p><p>  else {printf("send success!");return

79、0;}</p><p><b>  }</b></p><p>  printf("send error!");</p><p><b>  return 0;</b></p><p><b>  攝像頭控制程序</b></p><p&g

80、t;  攝像頭控制軟件mjpg-streamer由Openwrt以軟件包形式提供。</p><p>  通過端口8080輸出為mjpeg格式的圖像。</p><p>  Openwrt嵌入式系統(tǒng)的移植</p><p>  我們需要通過MINI2440使小車實(shí)現(xiàn)下面的功能:驅(qū)動并控制攝像頭,通過串口控制硬件層的C51單片機(jī),驅(qū)動無線網(wǎng)卡并連接,運(yùn)行服務(wù)端,提供UI界面

81、。而實(shí)現(xiàn)以上的功能,我們需要首先構(gòu)建一個(gè)嵌入式操作系統(tǒng)。經(jīng)過反復(fù)地討論研究,我們決定在MINI2440移植Openwrt,因?yàn)樗梢源蠓葴p少我們的開發(fā)周期。</p><p>  OpenWrt它是一個(gè)開源的用于各種無線路由及嵌入式設(shè)備的linux發(fā)行版。它可以實(shí)現(xiàn)與另外一個(gè)著名的固件DD-WRT相類似的功能。</p><p>  OpenWrt提供了一個(gè)完全可寫文件系統(tǒng)及軟件包管理,它通

82、過簡單易用的方式,最大限度地降低了嵌入式linux開發(fā)的門檻,它允許使用軟件包的概念來定制嵌入式設(shè)備,這使得它能適用于絕大多數(shù)應(yīng)用并實(shí)現(xiàn)更多的功能。對于開發(fā)人員,OpenWrt提供簡單易用的環(huán)境框架來構(gòu)建應(yīng)用程序。</p><p>  Openwrt主頁:http://www.openwrt.org</p><p>  經(jīng)過一個(gè)星期的,如果我們使用openwrt,就可以大幅度減沙開發(fā)以及移

83、植時(shí)間,調(diào)試也非常方便。最終,花費(fèi)了將近一個(gè)星期成功在mini2440上運(yùn)行了openwrt。具體請參考我們的openwrt移植文檔。</p><p>  Openwrt的編譯很簡單,我們只需要獲取到我們所需要的源碼并進(jìn)行簡單的配置,執(zhí)行make就可以編譯了。</p><p>  編譯完成后的Openwrt效果圖:</p><p>  Openwrt LuCi的控制

84、界面:</p><p>  嵌入式小車的PC客戶端設(shè)計(jì)</p><p>  1. 客戶端程序大致分成四大部分:初始化,顯示,更新,連接</p><p><b>  2. 程序樹</b></p><p>  界面預(yù)覽圖(注:未連接目標(biāo))。</p><p>  完成后的JAVA客戶端</p>

85、;<p><b>  系統(tǒng)測試方案</b></p><p>  系統(tǒng)采用先分塊測試,然后再整體測試的方案。先分塊測試直流電機(jī)、步進(jìn)電機(jī)、超聲波測距、串口通信、嵌入式系統(tǒng)移植、無線數(shù)據(jù)傳輸?shù)饶K,然后再整體測試系統(tǒng)性能。采用直接由單片機(jī)控制和上位機(jī)通過無線數(shù)據(jù)傳輸控制等多種情況進(jìn)行測試。下面是具體的兩個(gè)模塊的測試方案。</p><p>  直流電機(jī)驅(qū)動模塊

86、(l298n)測試</p><p><b>  1. 被測模塊簡介</b></p><p>  通過對直流電機(jī)的控制實(shí)現(xiàn)小車前進(jìn)后退左轉(zhuǎn)右轉(zhuǎn)等動作,主要是控制速度與轉(zhuǎn)彎角度等指標(biāo)。</p><p><b>  2. 測試目的</b></p><p>  通過兩路PWM波控制兩個(gè)直流電機(jī)速度,用單片機(jī)

87、4個(gè)IO口控制兩個(gè)直流電機(jī)的轉(zhuǎn)向,從而控制小車前進(jìn)和后退和轉(zhuǎn)彎。</p><p>  3. 測試方法及步驟</p><p>  通過在兩電機(jī)上安裝霍耳測速傳感器,從而得到電機(jī)的轉(zhuǎn)速參數(shù);</p><p>  調(diào)節(jié)PWM的占空比從而調(diào)節(jié)電機(jī)的轉(zhuǎn)速;</p><p>  在不同環(huán)境下測試得出兩電機(jī)轉(zhuǎn)速之差與小車旋轉(zhuǎn)角度的關(guān)系;</p>

88、<p>  4. 測試環(huán)境和工具</p><p><b>  測試工具:</b></p><p>  軟件:Keil 、stc單片機(jī)isp下載軟件</p><p>  硬件:車載stc89c52單片機(jī)的小車一部、下載器一個(gè)、霍耳測速傳感器二個(gè)、尺子一套。</p><p><b>  測試環(huán)境:&

89、lt;/b></p><p>  水泥地板、平滑地面、草地、沙地等。</p><p><b>  5. 測試表格</b></p><p><b>  6. 測試結(jié)論</b></p><p>  小車在不同環(huán)境下相同運(yùn)行參數(shù)下,水泥地板效果最理想,沙地最不理想。PWM的占空比與轉(zhuǎn)速之差的關(guān)系是:

90、大概占空比每差10%,轉(zhuǎn)速10s內(nèi)大概差1轉(zhuǎn)。</p><p><b>  無線通信模塊測試</b></p><p><b>  1. 被測模塊簡介</b></p><p>  主芯片:RealTek RTL8187L</p><p>  網(wǎng)絡(luò)標(biāo)準(zhǔn) IEEE 802.11b/g 

91、   數(shù)據(jù)傳輸率 54、48、36、24、18、12、11、9、6、5.5、2、1Mbps  有效工作距離 室內(nèi)最遠(yuǎn)100米、外最遠(yuǎn)300米(環(huán)境而異)   頻率范圍 2.4-2.4835GHz      信道數(shù) 13   

92、;    調(diào)制方式 OFDM、DBPSK、DQPSK、CCK    支持網(wǎng)絡(luò)協(xié)議 CSMA/CA with ACK     傳輸方式 直接序列擴(kuò)頻 (DSSS)     靈敏度 54:-68dBm@10%PER、

93、11M:-85dBm@8% PER、6M:-88dBm@10% PER、1M:-90dBm@8% PER、256K:-105dBm@8% PER(典型值)    天線 天線增益 5dBi    2. 測試目的</p><p>  測試網(wǎng)絡(luò)通信的信號強(qiáng)度及其效率.</p><p>  3. 測試方法

94、及步驟</p><p>  通過無線網(wǎng)卡的控制工具,檢查測試無線模塊在MINI2440的信號強(qiáng)度跟質(zhì)量,從而得網(wǎng)絡(luò)連通的速率跟質(zhì)量;</p><p>  在不同環(huán)境下測試得出無線模塊傳輸信號強(qiáng)度與傳輸距離之前的關(guān)系;</p><p>  4. 測試環(huán)境和工具</p><p><b>  測試工具:</b></p&g

95、t;<p>  軟件:wireles-stools</p><p>  硬件:無線模塊,無線接入點(diǎn)。</p><p>  測試環(huán)境:教室,宿舍操場空地。</p><p><b>  5. 測試表格</b></p><p><b>  6. 測試結(jié)論</b></p><

96、;p>  在距離5到30米左右無障礙物左右的為較理想通訊距離,連接信號以及連接速率都符合正常通訊的需要。</p><p><b>  創(chuàng)新性描述</b></p><p>  本設(shè)計(jì)上層通過MINI2440使小車實(shí)現(xiàn)下面的功能:驅(qū)動并控制攝像頭,通過串口控制硬件層的C51單片機(jī),驅(qū)動無線網(wǎng)卡并連接,運(yùn)行服務(wù)端,提供UI界面。這樣實(shí)際上實(shí)現(xiàn)了雙重控制,既可以通過底層

97、STC89C52單片機(jī)實(shí)現(xiàn)小車的運(yùn)動控制,也可以在上層通過無線通訊傳回圖像,進(jìn)行遠(yuǎn)程控制。本設(shè)計(jì)可以用于可以科學(xué)探測、消防排險(xiǎn)等多種特殊作業(yè)場合,有一定的實(shí)際應(yīng)用價(jià)值。</p><p>  本設(shè)計(jì)具有以下創(chuàng)新和特點(diǎn):</p><p> ?。?)使用MINI2440開發(fā)板,比較適合運(yùn)動小車等現(xiàn)場控制領(lǐng)域。</p><p>  (2)在MINI2440移植Openwrt

98、,大幅度減少我們的開發(fā)周期,大大提高了開發(fā)效率。</p><p> ?。?)采用B/S架構(gòu),通過無線數(shù)據(jù)傳輸,在服務(wù)端即可通過實(shí)時(shí)傳回的視頻圖像,監(jiān)控小車實(shí)際運(yùn)行情況。在遇到意外情況時(shí),可以遠(yuǎn)程控制小車。在服務(wù)器端發(fā)送命令操控小車恢復(fù)正常運(yùn)行,從而增加了系統(tǒng)的可靠性。</p><p> ?。?)模塊化設(shè)計(jì),分工完成各個(gè)模塊,最終進(jìn)行整合調(diào)試,加快了項(xiàng)目開發(fā)進(jìn)度。</p>&l

99、t;p>  (5)系統(tǒng)完整性強(qiáng),從PC上位機(jī)軟件、嵌入式操作系統(tǒng)搭建、各模塊驅(qū)動到底層小車控制等的實(shí)現(xiàn),使整個(gè)作品設(shè)計(jì)有較好的完整度。</p><p><b>  附錄 </b></p><p>  附錄1 無線小車服務(wù)端程序</p><p>  /********************************************

100、***********************</p><p>  ; 程序名稱: 無線小車服務(wù)端程序</p><p>  ; 文件名: server.c</p><p>  ; 作者: lintel</p><p>  ; 參考: 基于TCP服務(wù)器的例子</p><p>  ; <

101、;Linux下C程序開發(fā)詳解>283頁</p><p>  *******************************************************************/</p><p>  #include <sys/types.h></p><p>  #include <sys/socket.h><

102、/p><p>  #include <netinet/in.h></p><p>  #include <arpa/inet.h></p><p>  #include <netdb.h></p><p>  #include <stdio.h></p><p>  #inc

103、lude <unistd.h> </p><p>  #include <fcntl.h></p><p>  #include <string.h></p><p>  #include <termios.h></p><p>  #include <stdio.h></p&

104、gt;<p>  #include <unistd.h></p><p>  #include <fcntl.h></p><p>  #include <sys/signal.h></p><p>  #include <sys/types.h></p><p>  #defin

105、e PORT 1500</p><p>  #define MAX 10</p><p>  #define SUCCESS 0</p><p>  #define ERROR 1</p><p>  /*******************************************************************&

106、lt;/p><p><b>  命令列表:</b></p><p><b>  5前</b></p><p><b>  2后</b></p><p><b>  1左</b></p><p><b>  3右<

107、/b></p><p><b>  4步進(jìn)左</b></p><p><b>  6步進(jìn)右</b></p><p><b>  0停</b></p><p><b>  8測距</b></p><p>  9返回(斷

108、續(xù)運(yùn)行)</p><p>  ;*******************************************************************/</p><p>  int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300,</p><p>  B38400, B1

109、9200, B9600, B4800, B2400, B1200, B300, };</p><p>  int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, </p><p>  19200, 9600, 4800, 2400, 1200, 300, };</p><p>  voi

110、d set_speed(int fd, int speed){</p><p><b>  int i; </b></p><p>  int status; </p><p>  struct termios Opt;</p><p>  tcgetattr(fd, &Opt); </p>

111、;<p>  for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) { </p><p>  if (speed == name_arr[i]) { </p><p>  tcflush(fd, TCIOFLUSH); </p><p>  cfsetispeed(&O

112、pt, speed_arr[i]); </p><p>  cfsetospeed(&Opt, speed_arr[i]); </p><p>  status = tcsetattr(fd, TCSANOW, &Opt); </p><p>  if (status != 0) { </p><p>  perro

113、r("tcsetattr fd1"); </p><p>  return; </p><p><b>  } </b></p><p>  tcflush(fd,TCIOFLUSH); </p><p><b>  } </b></p><

114、p><b>  }</b></p><p><b>  }</b></p><p>  int main(void)</p><p><b>  {</b></p><p>  int sockfd,newsockfd,is_connected[MAX],fd,ser_f

115、d,result1;</p><p>  struct sockaddr_in addr;</p><p>  int addr_len = sizeof(struct sockaddr_in);</p><p>  fd_set myreadfds;</p><p>  char msgbuffer[256];</p><

116、;p>  char msg[] ="Welcome to Car_serv.\n";</p><p>  ser_fd = open("/dev/s3c2410_serial1", O_WRONLY); //打開串口</p><p>  if (ser_fd < 0) </p><p><b>  { &

117、lt;/b></p><p>  printf("無法打開串口.\n"); </p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  se

118、t_speed(ser_fd,9600);/*設(shè)置波特率*/</p><p>  //result1 = write(ser_fd, "0", 1); //打開成功,向串口發(fā)送命令 ‘0’ 即停止</p><p>  write(ser_fd, "0", 1); //打開成功,向串口發(fā)送命令 ‘5’ 即停止</p><p>

119、<b>  }</b></p><p>  if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0)</p><p><b>  {</b></p><p>  perror("socket");</p><p><b>  

120、exit(1);</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  printf("socket已連接 .\n");</p>&

121、lt;p>  printf("socked id: %d \n",sockfd);</p><p><b>  }</b></p><p>  bzero(&addr,sizeof(addr));</p><p>  addr.sin_family =AF_INET;</p><p> 

122、 addr.sin_port = htons(PORT);</p><p>  addr.sin_addr.s_addr = htonl(INADDR_ANY);</p><p>  if(bind(sockfd,&addr,sizeof(addr))<0)</p><p><b>  {</b></p><p

123、>  perror("connect");</p><p><b>  exit(1);</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b><

124、/p><p>  printf("已連接.\n");</p><p>  printf("本地端口:%d\n",PORT);</p><p><b>  }</b></p><p>  if(listen(sockfd,3)<0)</p><p><

125、;b>  {</b></p><p>  perror("listen");</p><p><b>  exit(1);</b></p><p><b>  }</b></p><p><b>  else</b></p>

126、<p><b>  {</b></p><p>  printf("正在監(jiān)聽......\n");</p><p><b>  }</b></p><p>  for(fd=0;fd<MAX;fd++)</p><p><b>  {</b>

127、;</p><p>  is_connected[fd]=0;/*設(shè)置所有*/</p><p><b>  }</b></p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  FD_ZERO(&a

128、mp;myreadfds);</p><p>  FD_SET(sockfd,&myreadfds);</p><p>  for(fd=0;fd<MAX;fd++)</p><p><b>  {</b></p><p>  if(is_connected[fd])</p><p>

129、;<b>  {</b></p><p>  FD_SET(fd,&myreadfds);</p><p><b>  }</b></p><p><b>  }</b></p><p>  if(!select(MAX,&myreadfds,NULL,NULL

130、,NULL))</p><p><b>  {</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p>  for(fd=0;fd<MAX;fd++)</p><p>  {

131、 </p><p>  if(FD_ISSET(fd,&myreadfds))</p><p><b>  {</b></p><p>  if(sockfd==fd)</p><p><b>  {</b></p><p>  if((newsockfd

132、 = accept (sockfd,&addr,&addr_len))<0)</p><p><b>  {</b></p><p>  perror("accept");</p><p><b>  }</b></p><p>  write(newsoc

133、kfd,msg,sizeof(msg));</p><p>  is_connected[newsockfd] =1;</p><p>  printf("%s已連接服務(wù)端\n",inet_ntoa(addr.sin_addr));</p><p><b>  }</b></p><p><b&

134、gt;  else</b></p><p><b>  { </b></p><p>  bzero(msgbuffer,sizeof(msgbuffer));</p><p>  if(read(fd,msgbuffer,sizeof(msgbuffer))<=0)</p><p>&l

135、t;b>  {</b></p><p>  printf("連接已關(guān)閉.\n");</p><p>  is_connected[fd]=0;</p><p>  close(fd);</p><p><b>  }</b></p><p><b>

136、  else</b></p><p><b>  {</b></p><p>  write(fd,msgbuffer,sizeof(msgbuffer));</p><p>  printf("向串口寫命令:%s \n",msgbuffer);</p><p>  write(ser_f

137、d,msgbuffer, 1); //向串口發(fā)送命令</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>&

138、lt;b>  }</b></p><p><b>  }</b></p><p>  附錄2 底層硬件(單片機(jī)部分)原理圖</p><p><b>  作者聲明</b></p><p><b>  GPL源碼聲明</b></p><p>

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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

提交評論