<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ARM和Linux的路徑記憶循跡小車

          基于ARM和Linux的路徑記憶循跡小車

          作者: 時(shí)間:2016-09-12 來(lái)源:網(wǎng)絡(luò) 收藏

          根據(jù)具體環(huán)境,可建立一個(gè)起點(diǎn)、多個(gè)終點(diǎn)的路線,并將各個(gè)路線記憶分別保存在下的不同文件中,通過(guò)讀取文件中內(nèi)容實(shí)現(xiàn)循跡功能。

          4 系統(tǒng)軟件設(shè)計(jì)

          系統(tǒng)軟件設(shè)計(jì)分為3個(gè)層次:應(yīng)用層、操作系統(tǒng)層和驅(qū)動(dòng)層。應(yīng)用層包括控制策略程序、建立和按鍵控制小車的工作模式;操作系統(tǒng)層包括Bootloader移植、操作系統(tǒng)內(nèi)核的移植和根文件系統(tǒng)移植;驅(qū)動(dòng)層主要包括us-100超聲波模塊、SG90舵機(jī)以及電機(jī)驅(qū)動(dòng)模塊等驅(qū)動(dòng)程序。

          4.1 系統(tǒng)移植以及驅(qū)動(dòng)程序

          操作系統(tǒng)的移植包括uboot、內(nèi)核和文件系統(tǒng)的燒寫,內(nèi)核包含GPIO口、DM9000網(wǎng)卡、內(nèi)存等關(guān)鍵的底層驅(qū)動(dòng)。小車啟動(dòng)時(shí),通過(guò)uboot對(duì)S3C6410進(jìn)行必要的初始化,然后引導(dǎo)的啟動(dòng)。

          需要的驅(qū)動(dòng)程序有:電機(jī)驅(qū)動(dòng)模塊驅(qū)動(dòng)程序、SG90舵機(jī)驅(qū)動(dòng)程序、光電測(cè)速模塊驅(qū)動(dòng)程序以及us-100超聲波模塊驅(qū)動(dòng)程序。其中,舵機(jī)與超聲波編寫到一個(gè)驅(qū)動(dòng)文件中。這些模塊的驅(qū)動(dòng)程序都是以混雜設(shè)備驅(qū)動(dòng)的方式編寫,主要的驅(qū)動(dòng)函數(shù)采用ioctl函數(shù)。而電機(jī)驅(qū)動(dòng)模塊與超聲波避障驅(qū)動(dòng)程序的結(jié)構(gòu)相似,僅是實(shí)現(xiàn)功能不同。電機(jī)驅(qū)動(dòng)模塊驅(qū)動(dòng)程序框架如下:

          d.jpg

          e.jpg

          光電測(cè)速模塊驅(qū)動(dòng)程序完成兩種功能:①采用中斷的方式來(lái)記錄小車的測(cè)速,并反饋給應(yīng)用層作為PID控制的反饋;②通過(guò)應(yīng)用層傳遞車輪運(yùn)轉(zhuǎn)的周數(shù),驅(qū)動(dòng)中利用異步通知的方式在運(yùn)轉(zhuǎn)完規(guī)定周數(shù)后通知應(yīng)用層,作為小車轉(zhuǎn)向時(shí)的控制。

          4.2 程序設(shè)計(jì)

          超聲波避障是決定智能小車運(yùn)行狀態(tài)的關(guān)鍵所在。利用超聲波測(cè)得人為障礙物,讓智能小車通過(guò)躲避障礙物實(shí)現(xiàn)按預(yù)定路線行走,并通過(guò)Linux文件系統(tǒng)將小車行走過(guò)程中所有的狀態(tài)都記錄在一個(gè)文件中形成記憶庫(kù)。程序流程圖如圖3所示。

          f.jpg

          4.3 智能小車控制策略程序設(shè)計(jì)

          智能小車基本的控制是通過(guò)電機(jī)驅(qū)動(dòng)模塊將模塊上對(duì)應(yīng)的引腳與11的GPL口和GPK口中的部分引腳相連,通過(guò)對(duì)GPIO口輸出高低電平來(lái)控制小車的直行、90°左轉(zhuǎn)彎、90°右轉(zhuǎn)彎和180°掉頭。

          由于小車在轉(zhuǎn)向時(shí),輪胎會(huì)出現(xiàn)打滑現(xiàn)象,這樣會(huì)影響小車的90°與180°的精確轉(zhuǎn)向。為了讓小車能在無(wú)黑線的情況下精確轉(zhuǎn)向,本設(shè)計(jì)中采用hmc58831電子羅盤作為小車的“眼睛”。一般的電子羅盤都會(huì)存在一定的偏差,通過(guò)校正以后可以使精度達(dá)到1°左右。

          由于本設(shè)計(jì)中只是為了讓小車轉(zhuǎn)向,并非準(zhǔn)確地測(cè)出與地理北極方向的偏向角,所以在校正后可直接使用輸出數(shù)據(jù)。為了讓小車轉(zhuǎn)向時(shí)迅速且準(zhǔn)確,設(shè)計(jì)了分段的轉(zhuǎn)向運(yùn)行方案,利用光電測(cè)速模塊和20格碼盤控制小車的運(yùn)行。主要的程序流程圖如圖4所示。

          g.jpg

          為了讓小車能在無(wú)黑線的情況下走出相對(duì)距離內(nèi)的直線,在電機(jī)的控制中采用PID控制算法進(jìn)行調(diào)速。根據(jù)測(cè)速系統(tǒng)反饋回來(lái)的當(dāng)前電機(jī)速度和設(shè)定速度進(jìn)行比較,將偏差作為新的輸入量控制PWM信號(hào)的占空比,從而實(shí)現(xiàn)各個(gè)電機(jī)在單位時(shí)間內(nèi)走的路程近似相等。PID控制算法原理如圖5所示。

          h.jpg

          在記憶庫(kù)建立完成后,智能小車的運(yùn)行是從記憶庫(kù)中讀取已定路線在各點(diǎn)的狀態(tài)值,最后實(shí)現(xiàn)小車按照規(guī)定路線行駛。主要的程序流程如圖6所示,而從終點(diǎn)回到起點(diǎn)只需將記憶庫(kù)的內(nèi)容反向讀取,并將左右轉(zhuǎn)向取反。

          i.jpg

          4.4 工作模式的控制

          本設(shè)計(jì)中智能小車的運(yùn)行有兩種工作模式:第一是建立記憶庫(kù);第二是按照記憶庫(kù)實(shí)現(xiàn)循跡。通過(guò)按鍵控制小車的工作模式,當(dāng)環(huán)境發(fā)生改變時(shí),只需通過(guò)按鍵設(shè)置成建立記憶庫(kù)模式,即可完成記憶庫(kù)的修改。

          5 系統(tǒng)測(cè)試結(jié)果及結(jié)論

          通過(guò)對(duì)智能小車的測(cè)試,小車能將行駛過(guò)程中各個(gè)狀態(tài)記錄入庫(kù),完成了利用超聲波避障和Linux文件系統(tǒng)的記憶庫(kù)的建立,并且通過(guò)記憶庫(kù)可實(shí)現(xiàn)小車按設(shè)定路徑的循跡的功能。

          本方案使得小車在不同的環(huán)境中只需人為地重新設(shè)置障礙,通過(guò)設(shè)置小車的功能模式讓智能小車按障礙路線運(yùn)行一次便可建立新的記憶庫(kù),不需要重新布線或更改程序。本設(shè)計(jì)進(jìn)一步地?cái)U(kuò)展了智能小車的應(yīng)用,增強(qiáng)了小車的環(huán)境適應(yīng)性,并且可以擴(kuò)展到智能家居和遠(yuǎn)程監(jiān)控領(lǐng)域,具有較強(qiáng)的實(shí)用性。


          上一頁(yè) 1 2 下一頁(yè)

          關(guān)鍵詞: ARM Linux 智能小車 記憶庫(kù)

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();