官术网_书友最值得收藏!

3.3 軟件設(shè)計(jì)

Arduino虛擬現(xiàn)實(shí)感知小車的功能實(shí)現(xiàn)需要Arduino UNO R3主板、驅(qū)動模塊、電源模塊及其他硬件模塊相互配合,統(tǒng)一協(xié)調(diào)。這就需要使用Arduino程序?qū)⒏鱾€模塊連接成一個相互關(guān)聯(lián)的系統(tǒng)。Arduino UNO R3主板相當(dāng)于小車的大腦。Arduino程序就是這個大腦所擁有的思想,根據(jù)軟件指令,控制各個模塊完成自己的動作,從而最終完成任務(wù)所要求的動作。Arduino程序可以用PC端的Arduino IDE編譯軟件進(jìn)行編寫。

由于Arduino虛擬現(xiàn)實(shí)感知小車采用模塊化多功能設(shè)計(jì),各個控制系統(tǒng)之間相互獨(dú)立(這是為了不讓小車出現(xiàn)連帶損害,小車不會因?yàn)橐粋€系統(tǒng)故障而影響其他系統(tǒng)的正常工作),因此各個系統(tǒng)的控制程序也是相對獨(dú)立的。模塊化多功能設(shè)計(jì)的優(yōu)點(diǎn),首先是每個模塊的程序結(jié)構(gòu)相對簡單,任務(wù)明確,易于編寫、調(diào)試和修改;其次是程序可讀性好,對特定模塊的程序修改可局部進(jìn)行,不會干擾其他模塊的程序,有利于調(diào)試。另外,對于在程序中高頻率使用的子程序,我們建立了子程序庫,以便于在編寫各個模塊的程序時可以快速調(diào)用。

Arduino虛擬現(xiàn)實(shí)感知小車的程序主要由無線數(shù)據(jù)傳輸程序、模式識別程序、電動機(jī)驅(qū)動程序、舵機(jī)程序、各種傳感器程序等組成。由控制端向小車的信號接收端發(fā)送指令,信號接收端將信息傳給Arduino UNO R3主板,由Arduino UNO R3主板進(jìn)行解碼,進(jìn)而執(zhí)行相應(yīng)的子程序。Arduino虛擬現(xiàn)實(shí)感知小車的程序總體設(shè)計(jì)圖如圖3.16所示。

圖3.16 Arduino虛擬現(xiàn)實(shí)感知小車程序總體設(shè)計(jì)圖

1.程序整體結(jié)構(gòu)框架

Arduino虛擬現(xiàn)實(shí)感知小車的程序由7部分組成。其中,防護(hù)預(yù)警系統(tǒng)程序由6個傳感器的相應(yīng)程序組成。6個傳感器采集到的信息由Arduino程序進(jìn)行分析處理,發(fā)出相應(yīng)的警報(bào)信號,同時將信息經(jīng)無線數(shù)據(jù)傳輸模塊發(fā)回控制端,供指揮員決策。Arduino虛擬現(xiàn)實(shí)感知小車程序整體結(jié)構(gòu)框架如圖3.17所示。

圖3.17 Arduino虛擬現(xiàn)實(shí)感知小車程序整體結(jié)構(gòu)框架

2.程序結(jié)構(gòu)

Arduino語言以setup()函數(shù)作為程序初始化,以loop()函數(shù)作為循環(huán)。setup()函數(shù)用來初始化變量、管腳模式及調(diào)用庫函數(shù)等,在整個程序運(yùn)行過程中只執(zhí)行一次。loop()函數(shù)是一個循環(huán)函數(shù),函數(shù)內(nèi)的語句周而復(fù)始地循環(huán)執(zhí)行,功能類似C語言中的main()函數(shù)。

(1)遙控通信程序的實(shí)現(xiàn)

Arduino虛擬現(xiàn)實(shí)感知小車采用Arduino APC 220 USB無線數(shù)據(jù)傳輸模塊與Arduino開源無線遙控手柄配合進(jìn)行控制。Arduino開源無線遙控手柄的程序主要由初始化函數(shù)setup()和循環(huán)函數(shù)loop()組成,首先進(jìn)行按鍵編碼、定義、初始化,然后設(shè)置波特率,與無線數(shù)據(jù)傳輸模塊建立通信協(xié)議,最后讀取按鍵變化值,并發(fā)送數(shù)據(jù)。Arduino開源無線遙控手柄的程序流程圖如圖3.18所示。

圖3.18 Arduino開源無線遙控手柄的程序流程圖

無線數(shù)據(jù)傳輸模塊接收到由Arduino開源無線遙控手柄發(fā)送的信息后,將信息傳送給Arduino UNO R3主板,由Arduino UNO R3主板判斷所接收到的信號,從而執(zhí)行相應(yīng)的動作。比如,Arduino UNO R3主板解析到接收的信號為djqj(電動機(jī)前進(jìn)),就會控制小車向前移動。其相應(yīng)的程序?yàn)?/p>

(2)電動機(jī)控制程序的實(shí)現(xiàn)

步進(jìn)電動機(jī)是將電脈沖信號轉(zhuǎn)變?yōu)榫€位移或角位移信號的開環(huán)控制部件。在不超載的情況下,步進(jìn)電動機(jī)的停止位置、轉(zhuǎn)速只取決于輸入電脈沖信號的脈沖數(shù)和頻率,不受負(fù)載變化的影響,當(dāng)步進(jìn)驅(qū)動器接收到一個電脈沖信號時,就會驅(qū)動步進(jìn)電動機(jī)按設(shè)定的方向轉(zhuǎn)動一個固定的角度(稱為步距角)。其旋轉(zhuǎn)是以固定的角度一步一步進(jìn)行的,可以通過控制電脈沖信號的脈沖數(shù)來控制角位移,從而達(dá)到準(zhǔn)確定位的目的;同時,可以通過控制電脈沖信號的頻率來控制步進(jìn)電動機(jī)轉(zhuǎn)動的加速度和速度,從而達(dá)到改變速度的目的。步進(jìn)電動機(jī)可以作為一種用于控制的特種電動機(jī),利用其沒有積累誤差(精度為100%)的特點(diǎn),廣泛應(yīng)用于各種開環(huán)控制。

Arduino程序通過調(diào)整PWM占空比來控制兩組四個步進(jìn)電動機(jī)的轉(zhuǎn)速,即通過改變PWM的占空比來控制步進(jìn)電動機(jī)的供電電壓,從而控制步進(jìn)電動機(jī)的轉(zhuǎn)速,實(shí)現(xiàn)差速轉(zhuǎn)向、切邊轉(zhuǎn)向、中心轉(zhuǎn)向三種轉(zhuǎn)彎模式。Arduino虛擬現(xiàn)實(shí)感知小車步進(jìn)電動機(jī)驅(qū)動程序流程圖如圖3.19所示。

圖3.19 Arduino虛擬現(xiàn)實(shí)感知小車步進(jìn)電動機(jī)驅(qū)動程序流程圖

差速轉(zhuǎn)向是通過調(diào)節(jié)轉(zhuǎn)彎時兩側(cè)步進(jìn)電動機(jī)的轉(zhuǎn)速,使得內(nèi)側(cè)步進(jìn)電動機(jī)的轉(zhuǎn)速大于外側(cè)步進(jìn)電動機(jī)的轉(zhuǎn)速,從而完成轉(zhuǎn)彎的。其轉(zhuǎn)彎半徑較大,適用于行進(jìn)過程中及路面較寬闊情況下的轉(zhuǎn)彎。切邊轉(zhuǎn)向是使內(nèi)側(cè)步進(jìn)電動機(jī)的轉(zhuǎn)速為零,外側(cè)步進(jìn)電動機(jī)的轉(zhuǎn)速大于零,小車依靠外側(cè)履帶完成旋轉(zhuǎn)式轉(zhuǎn)彎。其轉(zhuǎn)彎半徑介于差速轉(zhuǎn)向與中心轉(zhuǎn)向之間,適用于道路較狹窄時的轉(zhuǎn)彎、變向等。中心轉(zhuǎn)向是使外側(cè)步進(jìn)電動機(jī)的轉(zhuǎn)速大于零,內(nèi)側(cè)步進(jìn)電動機(jī)的轉(zhuǎn)速小于零,通過外側(cè)前進(jìn)、內(nèi)側(cè)后退的方式在原地完成轉(zhuǎn)彎。其轉(zhuǎn)彎半徑是三種轉(zhuǎn)彎模式中最小的,適用于狹窄地段的方向變更。Arduino虛擬現(xiàn)實(shí)感知小車步進(jìn)電動機(jī)控制程序流程圖如圖3.20所示。

圖3.20 Arduino虛擬現(xiàn)實(shí)感知小車步進(jìn)電動機(jī)控制程序流程圖

PWM(Pulse Width Modulation)是一種方波控制信號。其高電平的寬度在一個周期里所占的比例被稱為占空比(Duty Cycle)。改變PWM的占空比,可以改變輸出信號的平均電壓。

Arduino UNO R3主板的3、5、6、9、10、11接口可以通過語句analogWrite(pin,duty-Cycle)來確定指定占空比的PWM。其中,pin的值在3、5、6、9、10、11接口中選擇,dutyCycle的值在0~255之間,0代表占空比為0%,127代表占空比為50%,255代表占空比為100%。這種方式下,PWM信號的頻率是固定的默認(rèn)值,為1000Hz左右,在analogWrite(pin,dutyCycle)之后,占空比會一直保持不變,除非下一個analogWrite(pin,dutyCycle)執(zhí)行。我們可以手動切換高電平和低電平,并在中間加入延時函數(shù)delay(),就可以實(shí)現(xiàn)自定義頻率的PWM。

Arduino UNO R3主板有三個Timer,即Timer0、Timer1、Timer2。三個Timer都可以自定義調(diào)節(jié)頻率,但各有特點(diǎn)。Timer0負(fù)責(zé)控制delay()等函數(shù),如果改變Timer0的頻率,就會導(dǎo)致計(jì)時函數(shù)不準(zhǔn)確;Timer1的計(jì)數(shù)器是16位的,與Timer0、Timer2的8位計(jì)數(shù)器是不一樣的;Timer2的頻率可調(diào)擋位更多,有7擋預(yù)除數(shù),我們選擇Timer2。Arduino UNO R3主板離線存儲的步進(jìn)電動機(jī)調(diào)用函數(shù)為

小車在接收到遙控信號后,通過判斷執(zhí)行相應(yīng)的動作。

(3)初始化部分源代碼

Arduino語言的初始化部分由setup()執(zhí)行。Arduino虛擬現(xiàn)實(shí)感知小車的初始化部分源代碼為

3.編譯環(huán)境

Arduino虛擬現(xiàn)實(shí)感知小車使用Arduino IDE進(jìn)行編譯。Arduino IDE是一款專業(yè)的Arduino開發(fā)工具,主要用于Arduino程序的編寫和開發(fā),擁有開放源代碼的電路圖設(shè)計(jì),支持ISP在線燒錄,兼容Flash、Max/Msp、VVVV、PD、C、Processing等多種程序,是廣受歡迎的編譯環(huán)境。Arduino語言是建立在C/C++語言基礎(chǔ)上的,基本與C語言相通。其實(shí)也就是基礎(chǔ)的C語言,Arduino語言只不過把與AVR單片機(jī)(微控制器)相關(guān)的一些寄存器參數(shù)、設(shè)置等都函數(shù)化了,不需使用者了解底層,有利于進(jìn)行開發(fā)。

Arduino IDE的編程特色:

特色一:開放源代碼的電路圖設(shè)計(jì),程序開發(fā)接口免費(fèi)下載,也可依需求自己修改。

特色二:使用低價格的微處理控制器(ATmega8或ATmega128),可以采用USB接口供電,不需外接電源,也可以使用外部9VDC供電。

特色三:支持ISP在線燒錄,可以將新的bootloader固件燒入ATmega8或ATmega128芯片,有了bootloader之后,即可通過串口或USBtoRs232更新固件。

特色四:可依據(jù)官方提供Eagle格式的PCB和SCH電路圖簡化Arduino模組,完成獨(dú)立運(yùn)作的微處理器控制,各種電子元器件的連接非常方便。

特色五:支持多種互動程序,如Flash、Max/Msp、VVVV、PD、C、Processing等。

特色六:利用Arduino可突破以往只能使用鼠標(biāo)、鍵盤、CCD等輸入裝置的互動內(nèi)容,可以更簡單地達(dá)成單人或多人互動。

Arduino IDE界面截圖如圖3.21所示。

圖3.21 Arduino IDE界面截圖

所完成的Arduino虛擬現(xiàn)實(shí)感知小車的實(shí)物圖如圖3.22所示。

圖3.22 Arduino虛擬現(xiàn)實(shí)感知小車的實(shí)物圖

主站蜘蛛池模板: 宁安市| 中超| 怀远县| 乡宁县| 平乡县| 鞍山市| 巴马| 辛集市| 松桃| 东乡| 旬邑县| 钟山县| 贵港市| 大连市| 沙雅县| 荣成市| 卢龙县| 沂源县| 精河县| 阳高县| 钟祥市| 潼南县| 东乌| 高淳县| 远安县| 葵青区| 巴彦淖尔市| 七台河市| 乌恰县| 揭西县| 庆城县| 清水县| 丘北县| 卓资县| 奉化市| 丰都县| 延津县| 宣城市| 当阳市| 七台河市| 巍山|