基于機(jī)器人運(yùn)動(dòng)控制系統(tǒng)軟件設(shè)計(jì)(完整資料)_第1頁(yè)
基于機(jī)器人運(yùn)動(dòng)控制系統(tǒng)軟件設(shè)計(jì)(完整資料)_第2頁(yè)
基于機(jī)器人運(yùn)動(dòng)控制系統(tǒng)軟件設(shè)計(jì)(完整資料)_第3頁(yè)
基于機(jī)器人運(yùn)動(dòng)控制系統(tǒng)軟件設(shè)計(jì)(完整資料)_第4頁(yè)
基于機(jī)器人運(yùn)動(dòng)控制系統(tǒng)軟件設(shè)計(jì)(完整資料)_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

基于機(jī)器人運(yùn)動(dòng)控制系統(tǒng)軟件設(shè)計(jì)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)

基于機(jī)器人運(yùn)動(dòng)控制系統(tǒng)軟件設(shè)計(jì)基于機(jī)器人運(yùn)動(dòng)控制系統(tǒng)軟件設(shè)計(jì)(完整資料)(可以直接使用,可編輯優(yōu)秀版資料,歡迎下載)摘要:移動(dòng)機(jī)器人的運(yùn)動(dòng)控制主要是完成移動(dòng)機(jī)器人的運(yùn)動(dòng)平臺(tái),提供一種移動(dòng)機(jī)器人的控制方式。本文通過(guò)對(duì)移動(dòng)機(jī)器人的研究,實(shí)現(xiàn)了基于渡越時(shí)間法的超聲波測(cè)距模塊設(shè)計(jì),為機(jī)器人提供簡(jiǎn)單方便的障礙物距離檢測(cè)。本文主要完成對(duì)主控板控制器軟件設(shè)計(jì)、電機(jī)驅(qū)動(dòng)控制器軟件設(shè)計(jì)和超聲波測(cè)距軟件的設(shè)計(jì),使開(kāi)發(fā)系統(tǒng)能夠服務(wù)于移動(dòng)機(jī)器人研究的通用開(kāi)發(fā)平臺(tái)。關(guān)鍵詞:機(jī)器人;運(yùn)動(dòng)控制;軟件設(shè)計(jì);超聲波測(cè)距中途分類號(hào):TP9文獻(xiàn)標(biāo)識(shí)碼:B0引言隨著計(jì)算機(jī)、網(wǎng)絡(luò)、機(jī)械電子、信息、自動(dòng)化以及人工智能等技術(shù)的飛速發(fā)展,移動(dòng)機(jī)器人的研究進(jìn)入了一個(gè)嶄新的階段。同時(shí),太空資源、海洋資源的開(kāi)發(fā)與利用為移動(dòng)機(jī)器人的發(fā)展提供了廣闊的空間。目前,智能移動(dòng)機(jī)器人,無(wú)人自主車等領(lǐng)域的研究進(jìn)入了應(yīng)用的階段,隨著研究的深入,對(duì)移動(dòng)機(jī)器人的自主導(dǎo)航能力,動(dòng)態(tài)避障策略,避障時(shí)間等方面提出了更高的要求。地面智能機(jī)器人路徑規(guī)劃,是行駛在復(fù)雜,動(dòng)態(tài)自然環(huán)境中的全自主機(jī)器人系統(tǒng)的重要環(huán)節(jié),而地面智能機(jī)器人全地域全自主技術(shù)的研究,是當(dāng)今國(guó)內(nèi)外學(xué)術(shù)界面臨的挑戰(zhàn)性問(wèn)題.智能移動(dòng)機(jī)器人是一類能夠通過(guò)傳感器感知環(huán)境和自身狀態(tài),實(shí)現(xiàn)在有障礙物的環(huán)境中面向目標(biāo)自主運(yùn)動(dòng),從而完成一定功能的機(jī)器人系統(tǒng)。移動(dòng)機(jī)器人技術(shù)研究綜合了路徑規(guī)劃、導(dǎo)航定位、路徑跟蹤與運(yùn)動(dòng)控制等技術(shù)。涉及到包括距離探測(cè)、視頻采集、溫濕度以及聲光等多種外部傳感器,作為移動(dòng)機(jī)器人的輸入信息。移動(dòng)機(jī)器人的運(yùn)動(dòng)控制主要是完成移動(dòng)機(jī)器人的運(yùn)動(dòng)平臺(tái),提供一種移動(dòng)機(jī)器人的控制方式。性能良好的移動(dòng)機(jī)器人運(yùn)動(dòng)控制系統(tǒng)是移動(dòng)機(jī)器人運(yùn)行的基礎(chǔ),能夠服務(wù)于移動(dòng)機(jī)器人研究的通用開(kāi)發(fā)平臺(tái)。移動(dòng)機(jī)器人技術(shù)研究綜合了多學(xué)科領(lǐng)域的知識(shí),關(guān)鍵技術(shù)可分為:路徑規(guī)劃、導(dǎo)航定位、路徑跟蹤與運(yùn)動(dòng)控制技術(shù)。路徑規(guī)劃又可分為全局和局部路徑規(guī)劃.全局路徑規(guī)劃是根據(jù)移動(dòng)機(jī)器人總體任務(wù)進(jìn)行路徑規(guī)劃,將總體路徑任務(wù)分解,并建立全局地形數(shù)據(jù)庫(kù);局部路徑規(guī)劃是根據(jù)全局規(guī)劃分解的子任務(wù),結(jié)合移動(dòng)機(jī)器人當(dāng)前狀態(tài)信息,實(shí)時(shí)規(guī)劃可行路徑;導(dǎo)航定位技術(shù)確定移動(dòng)機(jī)器人在全局地圖中的位置,并實(shí)時(shí)得到機(jī)器人與路徑跟蹤的相對(duì)位置關(guān)系,其關(guān)鍵技術(shù)是多傳感器信息處理與數(shù)據(jù)融合技術(shù).路徑跟蹤與運(yùn)動(dòng)控制技術(shù)的任務(wù)是控制移動(dòng)機(jī)器人跟蹤局部規(guī)劃給出的路徑,結(jié)合導(dǎo)航定位系統(tǒng)得到機(jī)器人本身狀態(tài)信息與道路信息,完成航向和速度控制。移動(dòng)機(jī)器人的路徑規(guī)劃、導(dǎo)航控制以及路徑跟蹤與運(yùn)動(dòng)控制技術(shù)是相互關(guān)聯(lián)的,任何一個(gè)系統(tǒng)的不完善都會(huì)導(dǎo)致整體性能的下降。1主控板軟件設(shè)計(jì)主控板硬件完成模塊管理、設(shè)備通訊及機(jī)器人定位脈沖檢測(cè)等內(nèi)容。在實(shí)際應(yīng)用中,主控板硬件還負(fù)責(zé)超聲波測(cè)距的軟件管理。主控板硬件中只有主控板控制器需要進(jìn)行軟件設(shè)計(jì)。主控板控制器TMS320LF2407A的主要任務(wù)是超聲波測(cè)距的軟件設(shè)計(jì)管理和其他一些基本設(shè)置內(nèi)容,包括電機(jī)碼盤(pán)的正交編碼脈沖檢測(cè)。初始選定TMS320LF2407A作為主控板控制器是考慮到此控制系統(tǒng)可以作為以后機(jī)器人應(yīng)用的平臺(tái),可以在TMS320LF2407A里嵌入實(shí)時(shí)系統(tǒng),提升系統(tǒng)性能,方便接口開(kāi)發(fā)。主控板控制器的軟件設(shè)計(jì)內(nèi)容包括模塊初始化、串口通訊、正交編碼脈沖檢測(cè)和超聲波測(cè)距軟件。這里介紹模塊初始化串口通訊和正交編碼脈沖檢測(cè)等內(nèi)容。圖1主控板控制器程序流程圖。圖1主控板控制器程序流程圖復(fù)位向量地址為程序入口,然后程序進(jìn)行初始化。初始化內(nèi)容包括擴(kuò)展方式、溢出方式、DARAM、倍頻、JTAG等基本配置.另外還有使用的相關(guān)I/O的設(shè)置、程序使用相關(guān)定時(shí)器的設(shè)置、程序使用相關(guān)中斷的設(shè)置和串口通訊的相關(guān)設(shè)置.這些配置都是控制器使用的基本配置流程。初始化之后會(huì)開(kāi)啟相關(guān)的中斷程序,隨后進(jìn)入超聲波測(cè)距程序,并一直循環(huán)。中斷服務(wù)程序處于就緒狀態(tài),一旦有中斷發(fā)生,中斷服務(wù)程序立即執(zhí)行。在TMS320LF2407A的所有程序中,需要對(duì)其串口的數(shù)據(jù)發(fā)送和接收程序做說(shuō)明.異步通信使用三條線(地線、發(fā)送線、接收線)連接采用RS232格式的終端。發(fā)送各位依次為一個(gè)起始位、l~8?jìng)€(gè)數(shù)據(jù)位、可選的一個(gè)奇偶校驗(yàn)位、1~2個(gè)停止位.因此串口通訊能夠傳輸?shù)淖畲蟮臄?shù)據(jù)單位為8位,即一個(gè)字節(jié)。在設(shè)計(jì)中控制器和各終端會(huì)有各種類型的數(shù)據(jù)交流,如整形數(shù)據(jù)和浮點(diǎn)數(shù)據(jù),因此需要對(duì)串口發(fā)送和接收的數(shù)據(jù)進(jìn)行數(shù)據(jù)轉(zhuǎn)換。四個(gè)字節(jié)的單精度浮點(diǎn)數(shù)的數(shù)據(jù)傳輸,因?yàn)榇诿看巫疃嘀荒軅鬏斠粋€(gè)字節(jié),所以只需要把每個(gè)四字節(jié)浮點(diǎn)數(shù)的存儲(chǔ)數(shù)據(jù)轉(zhuǎn)換成字節(jié)形式發(fā)送即可,設(shè)計(jì)中采用強(qiáng)制轉(zhuǎn)換的方式完成。數(shù)據(jù)接收的時(shí)候也可以采取同樣的處理方式,反向轉(zhuǎn)換即可。另外在數(shù)據(jù)轉(zhuǎn)換上也可選擇共用體來(lái)實(shí)現(xiàn),共用體的實(shí)質(zhì)和上面講述的類型轉(zhuǎn)換是一樣的,只是共用體的各個(gè)數(shù)據(jù)類型占用的存儲(chǔ)空間是共同的,對(duì)于這個(gè)存儲(chǔ)空間,共用體定義的任何結(jié)構(gòu)類型變量都可以調(diào)用。上位機(jī)里的串口數(shù)據(jù)處理采用的是這種方法,十分方便.對(duì)于正交編碼脈沖的檢測(cè),TMS320LF2407A具有獨(dú)立的正交編碼脈沖單元,只要對(duì)單元寄存器進(jìn)行簡(jiǎn)單設(shè)置即可得到機(jī)器人驅(qū)動(dòng)輪的運(yùn)行方向和距離參數(shù)。TMS320LF2407A將這些數(shù)據(jù)通過(guò)串口發(fā)送到上位機(jī),由上位機(jī)建模,對(duì)數(shù)據(jù)加以處理后得到機(jī)器人的位姿信息.2電機(jī)驅(qū)動(dòng)軟件設(shè)計(jì)電機(jī)驅(qū)動(dòng)軟件完成電機(jī)的驅(qū)動(dòng)控制和閉環(huán)調(diào)速.驅(qū)動(dòng)控制使用的是電機(jī)驅(qū)動(dòng)主控芯片STCl2C4052AD的片內(nèi)PWM外設(shè)單元,生成的PWM信號(hào)經(jīng)過(guò)電機(jī)驅(qū)動(dòng)芯片驅(qū)動(dòng)電機(jī),可以通過(guò)調(diào)節(jié)PWM占空比來(lái)調(diào)節(jié)加載在電機(jī)上24VDC電壓的占空比,從而調(diào)節(jié)電機(jī)轉(zhuǎn)速.PWM占空比由片內(nèi)8位的PWM控制寄存器進(jìn)行控制,該寄存器取值范圍為0—255,分別代表PWM信號(hào)占空比從l到0的連續(xù)變化。同時(shí)STCl2C4052AD接收電機(jī)光電碼盤(pán)的脈沖信號(hào),利用片內(nèi)時(shí)鐘計(jì)算出電機(jī)運(yùn)行速度,通過(guò)速度控制算法完成電機(jī)的閉環(huán)調(diào)速。電機(jī)驅(qū)動(dòng)及閉環(huán)調(diào)速軟件算法流程圖如圖2所示。圖2電機(jī)驅(qū)動(dòng)控制器程序流程圖如上圖所示,程序開(kāi)始后進(jìn)行初始化,初始化包括程序使用相關(guān)變量定義、10ms定時(shí)器0、定時(shí)器l及串口、脈沖計(jì)數(shù)用外中斷0、看門(mén)狗等寄存器的設(shè)置和電機(jī)狀態(tài)參數(shù)(剎車、速度)等的初始化。然后進(jìn)入循環(huán)狀態(tài),循環(huán)過(guò)程中更新看門(mén)狗寄存器的相關(guān)標(biāo)志位.速度檢測(cè)和閉環(huán)調(diào)速程序分別在外中斷0和定時(shí)器0中完成。中斷服務(wù)程序也就包含了外中斷0、定時(shí)器0以及串口中斷服務(wù)程序.外中斷0是電機(jī)光電碼盤(pán)的脈沖檢測(cè)外設(shè),所有電機(jī)光電碼盤(pán)的脈沖都會(huì)引起外中斷0的中斷。碼盤(pán)脈沖測(cè)速的原理是計(jì)算STCl2C4052AD單位定時(shí)時(shí)間內(nèi)的脈沖數(shù)目,因此外中斷0的中斷服務(wù)程序的內(nèi)容就是對(duì)脈沖計(jì)數(shù).而上位機(jī)設(shè)定的目標(biāo)電機(jī)轉(zhuǎn)速也會(huì)被轉(zhuǎn)換為此單位定時(shí)時(shí)間內(nèi)的脈沖數(shù)目??梢远x一個(gè)全局變量,每次進(jìn)入外中斷0的中斷將該變量加1即可。另外為防止程序干擾,應(yīng)該對(duì)計(jì)數(shù)值加以修正,如小于0的時(shí)候等于0,大于某一設(shè)定值的時(shí)候等于某一設(shè)定值等.3超聲波測(cè)距軟件設(shè)計(jì)設(shè)計(jì)中的超聲波測(cè)距軟件利用了常用超聲波測(cè)距的渡越時(shí)間法.渡越時(shí)間法的工作原理為發(fā)射超聲波的同時(shí)開(kāi)始計(jì)時(shí),接收到超聲波后停止計(jì)時(shí),記錄超聲波的傳輸時(shí)間為t,那么超聲波測(cè)距模塊和障礙物的距離為s由下式表示。S=v*t/2其中v為超聲波在空氣中的傳播速度。由下式表示。其中,T為空氣的華氏溫度。在常溫下,超聲波的傳輸速度隨溫度變化并不太大,而且超聲波的傳輸時(shí)間都為毫秒級(jí),因此影響不是很大。不過(guò)也可以為超聲波測(cè)距模塊添加一個(gè)溫度校正模塊,檢測(cè)環(huán)境溫度,再在主控板控制器計(jì)算超聲波速度時(shí)進(jìn)行修正?,F(xiàn)在市場(chǎng)已有集成溫度檢測(cè)器件,也很方便。超聲波測(cè)距的主要流程為發(fā)射超聲波以后,如果有反射超聲波信號(hào)返回,則由外中斷0接收計(jì)算距離.在超聲波信號(hào)發(fā)射的同時(shí)打開(kāi)定時(shí)器3,定時(shí)時(shí)間為最大超聲波測(cè)量距離所需的傳輸時(shí)間,如果在定時(shí)器3中斷的時(shí)候還沒(méi)有外中斷0中斷事件發(fā)生,即沒(méi)有反射超聲波信號(hào)返回,那么在進(jìn)入定時(shí)器3中斷的時(shí)候關(guān)閉超聲波返回中斷和超聲波傳輸時(shí)間定時(shí)器l,進(jìn)行下一次的超聲波測(cè)距循環(huán)。程序流程圖如圖3所示。圖3超聲波測(cè)距程序流程圖外中斷0接收到超聲波測(cè)距信號(hào)返回,則進(jìn)入外中斷0服務(wù)程序進(jìn)行測(cè)距程序處理。若沒(méi)有超聲波信號(hào)返回則將發(fā)生定時(shí)器3的定時(shí)中斷,說(shuō)明等待超時(shí),設(shè)定測(cè)距范圍內(nèi)無(wú)障礙物.兩種情況都將引發(fā)等待標(biāo)志位的改變,程序跳出等待狀態(tài),更改工作超聲波測(cè)距模塊,進(jìn)行下一個(gè)超聲波模塊的測(cè)距處理。外中斷0和定時(shí)器0的程序流程圖如圖4所示.圖4外中斷0和定時(shí)器3程序流程圖圖中A為外中斷0程序流程圖。進(jìn)入中斷服務(wù)程序表示有超聲波信號(hào)返回。程序開(kāi)始關(guān)閉所有系統(tǒng)的可屏蔽中斷和測(cè)距使用外設(shè),讀取定時(shí)器l計(jì)數(shù)值,計(jì)算障礙物距離。更改程序循環(huán)標(biāo)志,然后中斷服務(wù)程序返回。B為定時(shí)器3的程序流程圖。進(jìn)入中斷服務(wù)程序表示測(cè)距范圍內(nèi)無(wú)障礙物,因此只用關(guān)閉系統(tǒng)的可屏蔽中斷和測(cè)距使用外設(shè),直接更改程序循環(huán)標(biāo)志,退出中斷服務(wù)程序即可。設(shè)置定時(shí)器1不產(chǎn)生中斷,而設(shè)置定時(shí)器1為定時(shí)最大值也不會(huì)發(fā)生定時(shí)器l中斷。因此不必寫(xiě)定時(shí)器1的中斷服務(wù)程序。4結(jié)論本主控板控制器協(xié)調(diào)上位機(jī)和各模塊的工作,軟件設(shè)計(jì)中詳細(xì)講述串口傳輸中的數(shù)據(jù)類型處理問(wèn)題。利用單片機(jī)PWM外設(shè)生成脈沖寬度調(diào)制信號(hào)驅(qū)動(dòng)電機(jī),并通過(guò)光電碼盤(pán)實(shí)現(xiàn)電機(jī)的閉環(huán)調(diào)速。超聲波測(cè)距模塊已經(jīng)有廣泛的應(yīng)用,超聲波測(cè)距模塊軟件程序采用通用的渡越時(shí)間法完成距離的測(cè)量,并通過(guò)模擬開(kāi)關(guān)實(shí)現(xiàn)多超聲波測(cè)距模塊的分時(shí)工作。基于Android的智能聊天機(jī)器人的設(shè)計(jì)與實(shí)現(xiàn)學(xué)院名稱:專業(yè):班級(jí):學(xué)號(hào):姓名:任課教師:安卓智能聊天機(jī)器人開(kāi)發(fā)(一)這個(gè)聊天機(jī)器人有點(diǎn)像前段時(shí)間很火的一個(gè)安卓應(yīng)用-—小黃雞應(yīng)用的實(shí)現(xiàn)其實(shí)很簡(jiǎn)單,網(wǎng)上有許多關(guān)于智能機(jī)器人聊天的接口,我們只需要去調(diào)用對(duì)應(yīng)的接口,遵守它的API開(kāi)發(fā)規(guī)范,就可以獲取到我們想要的信息這里我使用的接口是——圖靈機(jī)器人(http://www.tuling123.com/openapi/)這個(gè)接口給我們返回的是Json字符串,我們只需要對(duì)它進(jìn)行Json字符串解析,就可以實(shí)現(xiàn)這個(gè)應(yīng)用。

開(kāi)發(fā)步驟:首先我們需要到這個(gè)圖靈機(jī)器人的官網(wǎng)去注冊(cè)一個(gè)賬號(hào),他會(huì)給我們一個(gè)唯一Key,通過(guò)這個(gè)Key和對(duì)應(yīng)的API開(kāi)發(fā)規(guī)范,我們就可以進(jìn)行開(kāi)發(fā)了.

然后在這個(gè)(http://www。tuling123.com/openapi/cloud/access_api.jsp)網(wǎng)址里可以找到相關(guān)的開(kāi)發(fā)介紹比如:請(qǐng)求方式,參數(shù),返回參數(shù),包括開(kāi)發(fā)范例,一些返回的編碼等信息這里是官方提供的一個(gè)調(diào)用小案例(JAVA),這里我也順帶貼一下/**調(diào)用圖靈機(jī)器人平臺(tái)接口*需要導(dǎo)入的包:commons-logging—1.0.4。jar、httpclient-4.3。1.jar、httpcore-4.3.jar*/publicstaticvoidmain(String[]args)throwsIOException{StringINFO=URLEncoder。encode("北京今日天氣","utf—8");Stringrequesturl="http://www.tuling123。com/openapi/api?key=注冊(cè)激活返回的Apikey&info="+INFO;HttpGetrequest=newHttpGet(requesturl);HttpResponseresponse=HttpClients。createDefault()。execute(request);//200即正確的返回碼if(response.getStat(yī)usLine().getStatusCode()==200){Stringresult=EntityUtils。toString(response.getEntity());System.out.println("返回結(jié)果:”+result);}}

好了,接下來(lái)開(kāi)始實(shí)戰(zhàn)吧,這個(gè)應(yīng)用我打算寫(xiě)成兩篇文章第一篇講下關(guān)于如何調(diào)用接口,從網(wǎng)上獲取數(shù)據(jù),包括解析Json字符串第二篇會(huì)把這些獲取的數(shù)據(jù)嵌入到安卓應(yīng)用

首先,先寫(xiě)一個(gè)工具類,這個(gè)工具類是用來(lái)獲取用戶輸入的信息并返回服務(wù)器提供的數(shù)據(jù)的這里面用到了一個(gè)第三方提供的JAR包,Gson它是谷歌提供給我們用來(lái)使Json數(shù)據(jù)序列化和反序列化的關(guān)于Gson的使用我之前寫(xiě)過(guò)一篇筆記,不熟悉的朋友可以看看:Gson簡(jiǎn)要使用筆記(http://wblogs.com/lichenwei/p/3987429.html)代碼如下:具體看注釋packagecom.example。utils;importjava.io.ByteArrayOutputStream;importjava。io.IOException;importjava.io.InputStream;importjava.io.UnsupportedEncodingException;importjava.net.HttpURLConnection;importjava。net。MalformedURLException;importjava.net。URLEncoder;importjava.util.Date;importandroid.util.Log;importcom。example.pojo.Message;importcom。example。pojo.Message.Type;importcom。example.pojo。Result;importcom.google.gson.Gson;/****獲取信息幫助類傳入用戶輸入的字符,給出相對(duì)應(yīng)的信息**/publicclassGetDataUtils{privatestaticfinalStringAPI_KEY=”這里填寫(xiě)官方提供的KEY”;//申請(qǐng)的API_KEY值privat(yī)estaticfinalStringURL=”http://www.tuling123.com/openapi/api";//接口請(qǐng)求地址publicStringgetChat(Stringmsg){//這個(gè)方法是獲取服務(wù)端返回回來(lái)的Json數(shù)據(jù),msg為用戶輸入的信息Stringresult="";//存放服務(wù)器返回信息的變量InputStreaminputStream=null;ByteArrayOutputStreamoutputStream=null;try{//進(jìn)行資源請(qǐng)求java.net。URLurl=newjava.net。URL(getMsgUrl(msg));HttpURLConnectionhttpURLConnection=(HttpURLConnection)url。openConnection();//打開(kāi)資源連接//HttpURLConnection參數(shù)設(shè)定httpURLConnection.setReadTimeout(5*1000);httpURLConnection.setConnectTimeout(5*1000);httpURLConnection。setRequestMethod(”GET");inputStream=httpURLConnection.getInputStream();//獲取一個(gè)輸入流接收服務(wù)端返回的信息intlen=-1;byte[]bs=newbyte[124];//用來(lái)接收輸入流的字節(jié)數(shù)組outputStream=newByteArrayOutputStream();//用一個(gè)輸出流來(lái)輸出剛獲取的輸入流所得到的信息while((len=inputStream.read(bs))!=—1){//從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲(chǔ)在緩沖區(qū)數(shù)組//bs中outputStream.write(bs,0,len);//往輸入流寫(xiě)入}outputStream。flush();//清除緩沖區(qū)result=newString(outputStream。toByteArray());//轉(zhuǎn)換成字符串}catch(MalformedURLExceptione){e。printStackTrace();}catch(IOExceptione){e。printStackTrace();}finally{//關(guān)閉相關(guān)資源if(inputStream!=null){try{inputStream。close();}cat(yī)ch(IOExceptione){e.printStackTrace();}}if(outputStream!=null){try{outputStream。close();}cat(yī)ch(IOExceptione){e。printStackTrace();}}}Log.i(”tuzi","result:”+result);//打印測(cè)試日志returnresult;}privateStringgetMsgUrl(Stringmsg)throwsUnsupportedEncodingException{Stringpath="";Stringinfo=URLEncoder。encode(msg,"UTF—8”);//轉(zhuǎn)換url編碼path=URL+"?key=”+API_KEY+”&info=”+msg;returnpath;}publicMessagegetInfo(Stringmsg){Messagemessage=newMessage();Gsongson=newGson();try{Resultresult=gson.fromJson(getChat(msg),Result。class);//獲取到服務(wù)器返回的json并轉(zhuǎn)換為Result對(duì)象,Result對(duì)象可能不存在,會(huì)出現(xiàn)異常message.setMsg(result.getText());//message可能為空,需要捕獲異常}catch(Exceptione){//可能服務(wù)器沒(méi)有返回正常數(shù)據(jù),也就存在著空白內(nèi)容,需要捕獲異常message.setMsg("服務(wù)器繁忙,請(qǐng)稍后再試”);}message.setTime(newDat(yī)e());message.setType(Type。INCOME);returnmessage;}}下面這2個(gè)是實(shí)體類,根據(jù)官網(wǎng)提供的示例,返回的Json字符串里包含:code狀態(tài)碼,text文本內(nèi)容packagecom.example.pojo;/****用來(lái)映射返回Json字符串**/publicclassResult{privateStringcode;privateStringtext;publicStringgetCode(){returncode;}publicvoidsetCode(Stringcode){this。code=code;}publicStringgetText(){returntext;}publicvoidsetText(Stringtext){this.text=text;}}packagecom.example.pojo;importjava.util.Dat(yī)e;publicclassMessage{privateStringname;privateStringmsg;privateDatetime;privat(yī)eTypetype;publicenumType{//類型枚舉,發(fā)送,接收INCOME,OUTCOME}publicStringgetName(){returnname;}publicvoidsetName(Stringname){t=name;}publicStringgetMsg(){returnmsg;}publicvoidsetMsg(Stringmsg){this。msg=msg;}publicDategetTime(){returntime;}publicvoidsetTime(Datetime){this。time=time;}publicTypegetType(){returntype;}publicvoidsetType(Typetype){this.type=type;}}編寫(xiě)個(gè)測(cè)試類packagecom。example。test;importandroid.test。AndroidTestCase;importandroid。util.Log;。example。pojo。Message;importcom。example。utils。GetDataUtils;publicclassGetDataUtilsTestextendsAndroidTestCase{publicvoidtest(){GetDataUtilsdataUtils=newGetDataUtils();Messagemessage=dataUtils.getInfo(”你好");Messagemessage1=dataUtils.getInfo(”你是誰(shuí)”);Messagemessage2=dataUtils.getInfo(”你知道JAVA是什么嗎");Messagemessage3=dataUtils.getInfo(”下雨了,天好冷");Log.i("兔子",message.getMsg());Log.i("兔子”,message1.getMsg());Log。i("兔子",message2.getMsg());Log.i("兔子",message3.getMsg());}}在JAVAWEB里編寫(xiě)測(cè)試單元用到的是Junit,需要導(dǎo)入jar包,在安卓開(kāi)發(fā)里也有類似這樣的步驟首先我們要在AndroidManifest。xml里的application標(biāo)簽里添加<uses—libraryandroid:name="android.test。runner"/>然后在application外添加<instrumentat(yī)ionandroid:name=”android.test.InstrumentationTestRunner"android:label="ceshi”android:targetPackage=”com。example.a(chǎn)ndroidchat”>〈/instrumentat(yī)ion>由于需要聯(lián)網(wǎng)別忘了給應(yīng)用賦予網(wǎng)絡(luò)權(quán)限〈uses-permissionandroid:name="android。permission.INTERNET"/>這里是完整文件代碼:<?xmlversion=”1.0”encoding="utf—8"?>〈manifestxmlns:android="http://schemas。androi/apk/res/android”package="com。example.androidchat"android:versionCode="1”android:versionName="1.0”>〈uses-sdkandroid:minSdkVersion="8”android:targetSdkVersion="21”/〉<uses—permissionandroid:name="android.permission.INTERNET”/〉<applicationandroid:allowBackup="true”android:icon=”@drawable/ic_launcher"android:label=”@string/app_name"android:theme=”@style/AppTheme"〉〈uses-libraryandroid:name="android。test。runner"/〉<activityandroid:name=".MainA(yù)ctivity"android:label="@string/app_name"><intent-filter><actionandroid:name=”android。intent.action。MAIN"/><categoryandroid:name="andrent.category.LAUNCHER"/></intent-filter〉</activity〉</application〉〈instrumentationandroid:name=”android.test.InstrumentationTestRunner"android:label="ceshi"android:targetPackage="com.example.androidchat”〉</instrumentation>〈/manifest〉看下我們的測(cè)試代碼效果圖:

好了,此時(shí)我們已經(jīng)可以獲取到服務(wù)端的數(shù)據(jù),并且接收到客戶端并做處理在上一篇文章中,已經(jīng)實(shí)現(xiàn)了對(duì)網(wǎng)絡(luò)數(shù)據(jù)的獲取和處理封裝,這篇文章來(lái)講下如何嵌入到安卓應(yīng)用中.先看下效果圖:從上面兩張圖我們可以發(fā)現(xiàn),這個(gè)聊天布局其實(shí)就是一個(gè)ListView,只不過(guò)它和傳統(tǒng)的ListView有些區(qū)別,因?yàn)樗褂昧硕郔tem樣式布局首先,先來(lái)分析下基礎(chǔ)布局:這個(gè)界面是由3個(gè)布局文件組成,分別是主布局,發(fā)送消息樣式布局,接收消息樣式布局先來(lái)看下主布局:這里是對(duì)應(yīng)的主布局代碼:android:divider="@null"--去除ListView的Item分割線〈Relat(yī)iveLayoutxmlns:android="http://schemas.a(chǎn)ndro/apk/res/android"xmlns:tools=”http://schemas。android.com/tools"android:layout_width="match_parent"android:layout_h(yuǎn)eight=”match_parent”android:background="@drawable/chat_bg_default">〈LinearLayoutandroid:id="@+id/title”android:layout_width=”fill_parent"android:layout_h(yuǎn)eight="wrap_content"android:layout_alignParentTop=”true”android:background="@drawable/title_bar"android:gravity="center"android:orientation=”vertical”〉<TextViewandroid:layout_width=”wrap_content"android:layout_height="fill_parent"android:layout_gravity=”center”android:text="機(jī)器兔"android:textColor="@android:color/white”android:textSize="20sp"/〉</LinearLayout>〈RelativeLayoutandroid:id="@+id/bottom"android:layout_width=”fill_parent"android:layout_height=”55dp"android:layout_alignParentBottom="true”android:background=”@drawable/bottom_bar"android:padding=”5dp"><EditTextandroid:id=”@+id/send_message”android:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_centerVertical=”true"android:layout_marginLeft="5dp”android:layout_marginRight="5dp"android:background="@drawable/login_edit_normal"/><Buttonandroid:id="@+id/send_bt"android:layout_width="wrap_content”android:layout_height=”fill_parent"android:layout_alignParentRight="true"android:layout_alignRight="@id/send_message"android:background=”@drawable/send_button_selector”android:gravity=”center_vertical”android:text="發(fā)送”/>〈/RelativeLayout>〈ListViewandroid:id="@+id/chatlistview"android:layout_width="fill_parent”android:layout_h(yuǎn)eight="fill_parent”android:layout_above=”@id/bottom"android:layout_below=”@id/title”android:divider="@null"〉〈/ListView></RelativeLayout>再來(lái)看下消息布局:(由于消息布局只是左右兩邊方向的不同,這里只給出其中一個(gè))這是2個(gè)消息布局的代碼:〈?xmlversion="1。0”encoding="utf-8”?>〈LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width=”match_parent"android:layout_height="mat(yī)ch_parent"android:orientation=”vertical”>〈TextViewandroid:id="@+id/sendtime”android:layout_width="wrap_content"android:layout_h(yuǎn)eight="wrap_content"android:layout_gravity=”center”android:background="#999999”android:text="2014—11-0718:00"android:textColor=”@android:color/white”/>〈LinearLayoutandroid:layout_width="match_parent"android:layout_h(yuǎn)eight=”wrap_content”android:orientation="horizontal">〈LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="vertical”〉<!-—頭像昵稱部分-—><ImageViewandroid:layout_width=”50dp”android:layout_h(yuǎn)eight=”50dp"android:src=”@drawable/icon1"/><TextViewandroid:layout_width=”wrap_content"android:layout_height=”wrap_content"android:layout_gravity="center"android:text="機(jī)器兔"/></LinearLayout〉〈TextViewandroid:id="@+id/sendmsg”android:layout_width=”wrap_content”android:layout_h(yuǎn)eight="wrap_content"android:background=”@drawable/chat(yī)from_bg_normal”android:text="你好,我是機(jī)器兔。"/〉</LinearLayout〉</LinearLayout><?xmlversion=”1。0"encoding=”utf—8”?>〈LinearLayoutxmlns:android="http://schemas。android.com/apk/res/android"android:layout_width="match_parent"android:layout_height=”match_parent"android:orientation=”vertical"〉〈TextViewandroid:id="@+id/receivetime"android:layout_width="wrap_content"android:layout_height=”wrap_content"android:layout_gravity=”center”android:background=”#999999”android:text=”2014—11—0718:00"android:textColor="@android:color/white"/><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content”android:gravity=”right"android:orientation=”horizontal"><TextViewandroid:id="@+id/receivemsg"android:layout_width="wrap_content"android:layout_height="wrap_content”android:background=”@drawable/chatto_bg_normal”android:text=”你好,我是機(jī)器兔?!盿ndroid:textColor="@android:color/black"/〉<LinearLayoutandroid:layout_width=”wrap_content"android:layout_height=”wrap_content”android:orientation="vertical">〈!--頭像昵稱部分--〉<ImageViewandroid:layout_width="50dp"android:layout_height="50dp”android:src=”@drawable/icon"/>〈TextViewandroid:layout_width="wrap_content"android:layout_h(yuǎn)eight=”wrap_content”android:layout_gravity="right”android:text=”我"/>〈/LinearLayout></LinearLayout></LinearLayout〉接下來(lái)看下關(guān)于ListView的自定義適配器,和往常一樣自定義適配器需要繼承BaseAdapter,并實(shí)現(xiàn)一些必須的方法這里有個(gè)需要注意的是,因?yàn)閭鹘y(tǒng)的ListView是統(tǒng)一一個(gè)樣式的,而這里的聊天布局是左右兩邊收發(fā)信息多Item樣式所以需要額外的多覆寫(xiě)2個(gè)方法:1、getViewTypeCount--返回樣式的種類數(shù)目2、getItemViewType

--給定類型標(biāo)示符,便于在回調(diào)函數(shù)getView時(shí)讓系統(tǒng)知道我們需要顯示的哪個(gè)樣式代碼里還提到了ViewHolder,這個(gè)是優(yōu)化ListView加載速度的一種方法,關(guān)于這個(gè)知識(shí)點(diǎn)我整理一篇筆記《安卓開(kāi)發(fā)筆記——ListView加載性能優(yōu)化ViewHolder》出來(lái),不熟悉的朋友可以看看。packagecom。example.a(chǎn)ndroidchat;importjava.text.SimpleDat(yī)eFormat;importjava.util。List;importcom。example.pojo。Msg;imp。example。pojo.Msg。Type;importandroid.content。Context;importandroid.view.LayoutInflater;importandroid。view。View;importandroid.view。ViewGroup;importandroid.widget。BaseAdapter;importandroid.widget.TextView;/****ListView適配器**/publicclassChatAdapterextendsBaseAdapter{privateList〈Msg>data;privat(yī)eLayoutInflaterinflater;//布局工廠,可以把res/layout的xml布局文件轉(zhuǎn)換成view對(duì)象publicChatAdapter(Contextcontext,List〈Msg>dat(yī)a){inflater=LayoutInflater。from(context);this。data=data;}@OverridepublicintgetCount(){returndata.size();}@OverridepublicObjectgetItem(intposition){returndata.get(position);}@OverridepubliclonggetItemId(intposition){returnposition;}@OverridepublicViewgetView(intposition,ViewconvertView,ViewGroupparent){Msgmessage=data.get(position);ViewHolderviewHolder=null;if(convertView==null){//未加載布局文件對(duì)象//可以通過(guò)getItemViewType所定義的標(biāo)識(shí)來(lái)設(shè)定對(duì)應(yīng)的item樣式if(getItemViewType(position)==0){//接收信息viewHolder=newViewHolder();convertView=inflat(yī)er.inflate(R.layout.send_msg,null);viewHolder。time=(TextView)convertView.findViewById(R。id。receivetime);viewHolder.msg=(TextView)convertView。findViewById(R。id.receivemsg);}else{viewHolder=newViewHolder();convertView=inflater.inflate(R.layout。receive_msg,null);viewHolder.time=(TextView)convertView。findViewById(R。id.sendtime);viewHolder。msg=(TextView)convertView。findViewById(R。id.sendmsg);}convertView.setTag(viewHolder);}else{//已經(jīng)存在布局文件對(duì)象viewHolder=(ViewHolder)convertView.getTag();}//設(shè)置數(shù)據(jù)SimpleDat(yī)eFormatdateFormat(yī)=newSimpleDateFormat(”yyyy-MM-ddHH:mm:ss”);viewHolder。time.setText(dat(yī)eFormat.format(message。getTime()));viewHolder。msg。setText(message.getMsg());returnconvertView;}/***由于此處我們要返回2種ListView的Item樣式,需要再額外多覆寫(xiě)2個(gè)方法*(1)、getItemViewType(intposition)給定類型標(biāo)示符*(2)、getViewTypeCount()類型數(shù)量*/@OverridepublicintgetItemViewType(intposition){Msgmessage=data。get(position);if(message。getType()==Type。INCOME){return0;//如果消息類型為接收,則值為0}return1;//如果消息類型為發(fā)送,則值為1}@OverridepublicintgetViewTypeCount(){return2;}privatefinalclassViewHolder{TextViewtime;//消息時(shí)間TextViewmsg;//消息內(nèi)容}}然后就是主程序代碼了:這里就沒(méi)什么好說(shuō)的了,網(wǎng)絡(luò)數(shù)據(jù)獲取工具類包括ListView的適配器類在之前已經(jīng)提過(guò),這里就只剩下調(diào)用了。注意點(diǎn)有3:1、那就是在UI主線程里不能直接取獲取網(wǎng)絡(luò)數(shù)據(jù),這里我們需要另開(kāi)一個(gè)子線程去獲取,然后在通過(guò)Handler去更新UI界面。2、當(dāng)數(shù)據(jù)源發(fā)生更新的時(shí)候,需要在UI主線程去操作,而不是子線程,還有就是不應(yīng)該去重新設(shè)置Adapter,只需要去調(diào)用Adapter的notifyDat(yī)aSetChanged()就行。3、記得設(shè)置下ListView的setSelection選項(xiàng),便于焦點(diǎn)自動(dòng)往下拉.不在UI主線程里做耗時(shí)操作,會(huì)使得UI現(xiàn)成阻塞.不在子線程里去更新UI界面,會(huì)導(dǎo)致應(yīng)用程序無(wú)響應(yīng)。packagecom.example.androidchat;importjava.util.ArrayList;importjava。util.Date;importjava.util。List;importandroid.a(chǎn)pp.Activity;importandroid.os.Bundle;importandroid.os。Handler;importandroid。os.Message;importandroid。view.View;importandroid.view。View.OnClickListener;importandroid.widget.Button;importandroid。widget.EditText;importandroid。widget.ListView;importcom.example。pojo。Msg;importcom。example.pojo.Msg。Type;importcom.example.utils.GetDataUtils;publicclassMainA(yù)ctivityextendsActivity{privateListViewlistview;privateEditTextsendmsg;privateButtonsendbt;privateChatAdapteradapter;//ListView自定義適配器privateList<Msg>data;//數(shù)據(jù)源privateHandlerhandler=newHandler(){publicvoidhandleMessage(Messagemsg){MsgreceiveMsg=(Msg)msg。obj;data.a(chǎn)dd(receiveMsg);adapter。notifyDat(yī)aSetChanged();listview.setSelection(dat(yī)a。size()-1);//定位位置,自動(dòng)下拉};};@OverrideprotectedvoidonCreat(yī)e(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R。layout.activity_main);initView();//初始化控件initData();//初始化數(shù)據(jù)initAction();//初始化事件}privatevoidinitAction(){this.sendbt.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){/***點(diǎn)擊發(fā)送按鈕執(zhí)行步驟*1、獲取用戶輸入的內(nèi)容并顯示到ListView(判斷是否為空)*2、發(fā)送用戶輸入的內(nèi)容到服務(wù)端獲取服務(wù)端返回內(nèi)容并顯示到ListView(注意線程處理)*3、清空輸入框*/finalStringsendInfo=sendmsg.getText()。toString();//獲取用戶輸入數(shù)據(jù)(用于發(fā)送)data.a(chǎn)dd(newMsg(”",sendInfo,newDate(),Type。INCOME));adapter。notifyDataSetChanged();//更新數(shù)據(jù)源listview。setSelection(data.size()-1);//定位位置,自動(dòng)下拉sendmsg.setText(”");//向服務(wù)端發(fā)送信息并接收返回信息,由于UI主線程不能執(zhí)行網(wǎng)絡(luò)獲取操作,這里需要開(kāi)一個(gè)子線程newThread(){@Overridepublicvoidrun(){//執(zhí)行網(wǎng)絡(luò)操作GetDataUtilsdat(yī)aUtils=newGetDataUtils();Msgmsg=dataUtils。getInfo(sendInfo);//獲取到一個(gè)Msg對(duì)象,但由于子線程不能夠更新UI,所以需要用到一個(gè)HandlerMessagemessage=Message。obtain();message.obj=msg;//封裝信息handler.sendMessage(message);}}.start();}});}privatevoidinitData(){data=newArrayList<Msg>();adapter=newChatAdapter(MainActivity。this,data);//獲取ListView適配器實(shí)例listview。setAdapter(adapter);}privatevoidinitView(){this.listview=(ListView)MainActivity.this.findViewById(R.id。chatlistview);this.sendmsg=(EditText)findViewById(R。id。send_message);this.sendbt=(Button)findViewById(R。id。send_bt);}}現(xiàn)場(chǎng)總線基于CAN總線的自動(dòng)門(mén)控制系統(tǒng)設(shè)計(jì)系部專業(yè)班級(jí)學(xué)生姓名指導(dǎo)教師2015年6月15日課程設(shè)計(jì)(論文)任務(wù)書(shū)題目名稱基于CAN總線的自動(dòng)門(mén)控制系統(tǒng)設(shè)計(jì)學(xué)生學(xué)部(系)專業(yè)班級(jí)姓名學(xué)號(hào)課程設(shè)計(jì)(論文)的內(nèi)容設(shè)計(jì)一個(gè)監(jiān)控系統(tǒng),用AT8952單片機(jī)和現(xiàn)場(chǎng)總線技術(shù)實(shí)現(xiàn)基于CAN總線的監(jiān)控系統(tǒng),進(jìn)而進(jìn)行相應(yīng)的硬件電路的設(shè)計(jì)并進(jìn)行軟件的設(shè)計(jì)。課程設(shè)計(jì)(論文)的要求與數(shù)據(jù)1。用AT89S52單片機(jī)和現(xiàn)場(chǎng)總線技術(shù);2。推廣嵌入應(yīng)用于各種測(cè)控領(lǐng)域;三、課程設(shè)計(jì)(論文)應(yīng)完成的工作1.完成硬件和軟件設(shè)計(jì),繪出相關(guān)原理圖;2.完成課程設(shè)計(jì)報(bào)告的撰寫(xiě)。四、課程設(shè)計(jì)(論文)進(jìn)程安排序號(hào)設(shè)計(jì)(論文)各階段內(nèi)容地點(diǎn)起止日期1收集單片機(jī)等相關(guān)資料,確定設(shè)計(jì)方案校內(nèi)2015年6月20日2進(jìn)行硬件和軟件設(shè)計(jì),繪出相關(guān)原理圖校內(nèi)2015年6月21-25日3進(jìn)行課程設(shè)計(jì)報(bào)告的撰寫(xiě)校內(nèi)2015年6月26、27日五、應(yīng)收集的資料及主要參考文獻(xiàn)1.收集設(shè)計(jì)中所涉及的主要器件等方面的資料2。收集相關(guān)的軟件方面的資料發(fā)出任務(wù)書(shū)日期:2015年6月1日指導(dǎo)教師簽名:計(jì)劃完成日期:2015年6月27日教學(xué)單位責(zé)任人簽章:目錄TOC\o”1-3”\h\z\uHYPERLINK\l”_Toc314068513"1設(shè)計(jì)思路和整體規(guī)劃思路12設(shè)計(jì)內(nèi)容3HYPERLINK\l”_Toc314068513”2.1提要3HYPERLINK\l”_Toc314068513"2.2概念3HYPERLINK\l"_Toc314068513”2。3意義32。4原理圖33系統(tǒng)硬件設(shè)計(jì)33.1CAN介紹33。2硬件組成結(jié)構(gòu)3HYPERLINK\l”_Toc314068513"3。3模塊上線5參考文獻(xiàn)6基于can總線的自動(dòng)門(mén)控制系統(tǒng)的設(shè)計(jì)黎信威杜騰波潘紹洲摘要:本設(shè)計(jì)介紹了一種基于CAN總線的自動(dòng)門(mén)控制系統(tǒng),本設(shè)計(jì)采用AT89S52單片機(jī),獨(dú)立CAN控制器SJA1000.自動(dòng)門(mén)控制系統(tǒng)軟件設(shè)計(jì)主要有開(kāi)門(mén)程序和關(guān)門(mén)程序。當(dāng)門(mén)前1米有人或按開(kāi)門(mén)按鈕時(shí),熱釋電紅外人體傳感器檢測(cè)到信號(hào)后傳給單片機(jī),當(dāng)兩對(duì)管都未檢測(cè)到信號(hào)時(shí)停止開(kāi)門(mén),此時(shí)如果繼續(xù)有人來(lái)則繼續(xù)開(kāi)門(mén)。如果無(wú)人在感應(yīng)區(qū)內(nèi)移動(dòng),則執(zhí)行關(guān)門(mén)程序,當(dāng)突然有夾人信號(hào),則門(mén)立即全部打開(kāi),防止夾人事故的發(fā)生.如果沒(méi)有人在門(mén)中間或在門(mén)口移動(dòng),則重新執(zhí)行關(guān)門(mén)程序,最后兩扇門(mén)完全關(guān)閉.由于熱釋電紅外傳感器在檢測(cè)到有人移動(dòng)開(kāi)門(mén)后,會(huì)自動(dòng)延時(shí)3-4秒,因此,在軟件上不必再設(shè)置延時(shí)程序。關(guān)鍵字:CAN總線自動(dòng)門(mén)控制系統(tǒng)AT8952單片機(jī)1設(shè)計(jì)思路和整體規(guī)劃思路自動(dòng)門(mén)的控制主要基于硬件和軟件的要求,硬件方面采用簡(jiǎn)單高效的51單片機(jī)系統(tǒng)板來(lái)實(shí)現(xiàn)還有就是直流電機(jī),紅外對(duì)管傳感器,熱釋電型紅外傳感器,軟件方面基于單片機(jī)設(shè)計(jì)。自動(dòng)門(mén)的門(mén)板由支架支撐在導(dǎo)軌上,導(dǎo)軌連接到驅(qū)動(dòng)裝置,驅(qū)動(dòng)裝置通過(guò)皮帶來(lái)帶動(dòng)門(mén)板在導(dǎo)軌內(nèi)滑動(dòng)。電動(dòng)門(mén)的驅(qū)動(dòng)裝置是一組電機(jī)組件,由直流電機(jī)來(lái)完成。主控制器單片機(jī)是自動(dòng)門(mén)的指揮中心,通過(guò)內(nèi)部指令程序,發(fā)出相應(yīng)指令,指揮電機(jī)工作。外部信號(hào)由熱釋電型紅外傳感器來(lái)完成,當(dāng)有移動(dòng)的物體進(jìn)入它的工作范圍時(shí),它就給主控制器單片機(jī)一個(gè)信號(hào),電機(jī)提供開(kāi)門(mén)與關(guān)門(mén)的主動(dòng)力。然后開(kāi)門(mén)。自動(dòng)門(mén)門(mén)扇完成一次開(kāi)門(mén)與關(guān)門(mén)的工作流程如下:感應(yīng)探測(cè)器將探測(cè)信號(hào)傳至主控制器單片機(jī)上,主控制器判斷后控制電機(jī)運(yùn)行。電機(jī)得到一定運(yùn)行電流后做正向運(yùn)行,將動(dòng)力經(jīng)傳動(dòng)機(jī)構(gòu)使自動(dòng)門(mén)扇開(kāi)啟;自動(dòng)伸縮門(mén)扇開(kāi)啟后由控制器做出判斷,控制電機(jī)作反向運(yùn)動(dòng),關(guān)閉自動(dòng)門(mén)扇。在雙開(kāi)門(mén)上兩邊分別安裝紅外對(duì)管,當(dāng)門(mén)打開(kāi)的過(guò)程中,又有人過(guò)來(lái)時(shí),人流量增大,此時(shí),紅外對(duì)管的接收器不能接收到發(fā)射器的信號(hào),把情況傳輸給主控制器單片機(jī)上,然后再由單片機(jī)控制電機(jī)將門(mén)打開(kāi)。在雙開(kāi)的門(mén)棱上安裝一組紅外對(duì)管,當(dāng)門(mén)在關(guān)的過(guò)程中有人或物時(shí),表示有夾物情況出現(xiàn),紅外對(duì)管的接收器將不能接收到發(fā)射器的信號(hào),并把情況傳輸給主控制器單片機(jī)上,然后再由單片機(jī)控制電機(jī)將門(mén)打開(kāi)。同時(shí),在門(mén)的兩側(cè),可安裝按鈕,直接控制直流電機(jī).當(dāng)控制器系統(tǒng)出現(xiàn)故障時(shí),也可由人人為的主動(dòng)按按鈕,達(dá)到在系統(tǒng)出現(xiàn)故障時(shí),人也可以自如的開(kāi)進(jìn)門(mén)的狀況。系統(tǒng)基本流程如下:51單片機(jī)51單片機(jī)紅外傳感器電機(jī)開(kāi)門(mén)來(lái)人關(guān)門(mén)無(wú)人開(kāi)始有夾物紅外對(duì)管無(wú)夾物直接關(guān)門(mén)結(jié)束手動(dòng)按按鈕人流量(多)2實(shí)驗(yàn)內(nèi)容2.1提要本實(shí)驗(yàn)利用CAN模塊檢測(cè)光電開(kāi)關(guān)的信號(hào)及步進(jìn)電機(jī)的起、停和方向控制,通過(guò)實(shí)驗(yàn)平臺(tái)上的步進(jìn)電機(jī)模擬電動(dòng)門(mén),光電開(kāi)關(guān)信號(hào)來(lái)模擬實(shí)現(xiàn)人的進(jìn)出。利用組態(tài)軟件編寫(xiě)一上位機(jī)軟件,實(shí)現(xiàn)對(duì)光電開(kāi)關(guān)的檢測(cè)及電機(jī)的控制.2.2概念自動(dòng)門(mén)根據(jù)使用的場(chǎng)合及功能的不同可分為自動(dòng)平移門(mén)、自動(dòng)平開(kāi)門(mén)、自動(dòng)旋轉(zhuǎn)門(mén)、自動(dòng)圓弧門(mén)、自動(dòng)折疊門(mén)等,其中自動(dòng)平移門(mén)使用得最廣泛,我們通常所說(shuō)的自動(dòng)門(mén)、感應(yīng)門(mén)就是指自動(dòng)平移門(mén).2.3意義自動(dòng)平移門(mén)最常見(jiàn)的結(jié)構(gòu)形式是自動(dòng)門(mén)機(jī)械驅(qū)動(dòng)裝置和門(mén)內(nèi)外兩側(cè)紅外線,當(dāng)人走近自動(dòng)門(mén)時(shí),紅外線感應(yīng)到人的存在,給控制器一個(gè)信號(hào),控制器通過(guò)驅(qū)動(dòng)裝置將門(mén)打開(kāi).當(dāng)人通過(guò)門(mén)之后,再將門(mén)關(guān)閉。由于自動(dòng)門(mén)在通電后可以實(shí)現(xiàn)無(wú)人看管,同時(shí)又可節(jié)約空調(diào)能源、防風(fēng)、防塵、降低噪音,提高了建筑的檔次。2.4原理圖系統(tǒng)的整體原理圖3系統(tǒng)硬件設(shè)計(jì)3.1CAN介紹CAN系統(tǒng):基于CAN協(xié)議的CAN總線分布式數(shù)據(jù)采集網(wǎng)絡(luò),主要用于實(shí)現(xiàn)CAN總線應(yīng)用中的通信控制和數(shù)據(jù)采集方案。CAN協(xié)議是一種基于連接的CAN應(yīng)用層協(xié)議,是整個(gè)CAN系統(tǒng)的基礎(chǔ)與核心。制定CAN協(xié)議的思路源于為中國(guó)中小型CAN應(yīng)用網(wǎng)絡(luò)提供一種簡(jiǎn)單、可靠、穩(wěn)定的應(yīng)用層協(xié)議。在充分汲取了DeviceNet協(xié)議和CANopen協(xié)議之精萃的基礎(chǔ)上,優(yōu)先保障通信數(shù)據(jù)的可靠性與實(shí)時(shí)性,以相對(duì)簡(jiǎn)單的方式進(jìn)行數(shù)據(jù)通信,從而有效降低了硬件實(shí)現(xiàn)成本,這就是CAN協(xié)議的巨大優(yōu)勢(shì).3.2硬件組成結(jié)構(gòu)系統(tǒng)組成如圖1所示,系統(tǒng)的控制臺(tái)由PC機(jī)和CAN總線適配卡等組成;CAN節(jié)點(diǎn)主要由單片機(jī)、CAN控制器和CAN收發(fā)器組成。該實(shí)驗(yàn)主要利用iCAN4050模塊控制傳動(dòng)系統(tǒng)的運(yùn)動(dòng)方向及起、??刂啤#椋肁N4050模塊功能:CAN—4050DI/DO功能模塊用于采集開(kāi)關(guān)量輸入信號(hào),并提供開(kāi)關(guān)量輸出信號(hào).CAN-4050DI/DO功能模塊具有8路開(kāi)關(guān)量輸入通道和8路開(kāi)關(guān)量輸出通道。CAN-4050DI/DO功能采用CAN總線通訊接口,符合CAN2.0B協(xié)議規(guī)范。模塊在工作時(shí),將輸入的電壓型開(kāi)關(guān)量信號(hào)或者無(wú)源觸點(diǎn)信號(hào)經(jīng)過(guò)調(diào)理以后,送入單片機(jī)進(jìn)行處理,通過(guò)CAN總線通訊將輸入的開(kāi)關(guān)量信號(hào)狀態(tài)傳送到網(wǎng)絡(luò)中的主控設(shè)備,并且主控設(shè)備通過(guò)CAN總線將輸出的開(kāi)關(guān)量狀態(tài)傳送到模塊。CAN-4050DI/DO功能模塊采用表面安裝工藝,大大提高了系統(tǒng)在惡劣環(huán)境中使用的可靠性.CAN-4050DI/DO功能模塊的底座上配有導(dǎo)軌架,可以直接安裝在標(biāo)準(zhǔn)的DIN導(dǎo)軌上,用戶也可以采用其它的簡(jiǎn)便的安裝方式。參數(shù):電源具有極性反接保護(hù)功能模塊電源:單電源供電,供電電壓為+10V~+30VDCCAN控制器:PHILIPSSJA1000CAN收發(fā)器:PHILIPSPCA82C251通訊協(xié)議:符合CAN協(xié)議規(guī)范V2.0B版工作環(huán)境溫度:-20℃~+85℃

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論