機器人綜合項目實踐教程 課件 第3、4章 ArduinoC語言編程開發(fā)環(huán)境;Arduino平臺機器人實戰(zhàn)_第1頁
機器人綜合項目實踐教程 課件 第3、4章 ArduinoC語言編程開發(fā)環(huán)境;Arduino平臺機器人實戰(zhàn)_第2頁
機器人綜合項目實踐教程 課件 第3、4章 ArduinoC語言編程開發(fā)環(huán)境;Arduino平臺機器人實戰(zhàn)_第3頁
機器人綜合項目實踐教程 課件 第3、4章 ArduinoC語言編程開發(fā)環(huán)境;Arduino平臺機器人實戰(zhàn)_第4頁
機器人綜合項目實踐教程 課件 第3、4章 ArduinoC語言編程開發(fā)環(huán)境;Arduino平臺機器人實戰(zhàn)_第5頁
已閱讀5頁,還剩129頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第三章Arduino/C語言編程開發(fā)環(huán)境3.1

Arduino/C語言基礎(chǔ)3.2Arduino平臺體系結(jié)構(gòu)3.3

Arduino/C語言的特點3.4

Arduino基礎(chǔ)應(yīng)用實戰(zhàn)

3.1

Arduino/C語言基礎(chǔ)

3.1.1

Arduino/C語言概述

Arduino平臺是一個能夠用來感應(yīng)和控制現(xiàn)實物理世界的計算平臺,由一個基于單片機、開放源碼的硬件平臺和開發(fā)環(huán)境組成。圖3.1所示為北京信息科技大學(xué)舉辦的Arduino平臺輪式機器人競速競賽中學(xué)生備賽場景的照片。圖3.1

Arduino機器人競速競賽學(xué)生備賽場景

在C語言編程中,為了定義變量、表達語句功能和對一些文件進行預(yù)處理,還必須用到一些具有特殊意義的字符,這就是關(guān)鍵字。關(guān)鍵字已被編譯系統(tǒng)本身使用,所以用戶編寫程序時不能夠使用這些關(guān)鍵字來作為標識符。Arduino平臺語言是建立在C/C++基礎(chǔ)上的,其關(guān)鍵字和主要符號有以下幾類:

(1)?類型說明符類。

(2)?語句定義符類。

(3)?預(yù)處理命令符類。

(4)?其他符號類。

3.1.2

ArduinoIDE

Arduino集成開發(fā)環(huán)境(ArduinoIDE)由工具欄、狀態(tài)窗口以及串口監(jiān)視器窗口共三部分組成,包含了一個用于寫代碼的文本編輯器、一個消息區(qū)、一個文本控制臺以及一個帶有常用功能按鈕和文本菜單的工具欄。以Windows為例,其他操作系統(tǒng)上的軟件安裝都是如此,Arduino開源的IDE可以免費下載得到,其driver目錄內(nèi)有控制板usb芯片驅(qū)動程序。

安裝ArduinoIDE的基本步驟如下:

第一步:打開Arduino官網(wǎng)地址arudino.cc,點擊圖中畫圈的地方;

第二步:在右側(cè)藍色方框內(nèi)選擇與自己電腦操作系統(tǒng)對應(yīng)的安裝包,Arduino軟件(IDE)1.0版本之后保存文件的擴展名是.ino。

3.2

Arduino平臺體系結(jié)構(gòu)

Arduino機器人套件是一套由近百個基本“積木”單元組合而成的套件包;這些“積木”包括傳感器單元、執(zhí)行器單元、控制器單元、通用機構(gòu)零件等。Arduino平臺體系結(jié)構(gòu)主要包含兩部分:硬件部分是可以用來做電路連接的Arduino電路板,可以搭載其他外部組件,如電機、燈泡、攝像頭、蜂鳴器等配件完成硬件機器的組裝;另外一部分則是ArduinoIDE,是計算機中的程序開發(fā)環(huán)境,采用該IDE進行程序編寫進而實現(xiàn)控制Arduino硬件部分。如圖3.2所示為四種類型應(yīng)用較廣泛的Arduino平臺控制板。

如圖3.2(a)中的ArduinoYUN是以ArduinoLeonardo(ATmega32U4)為基礎(chǔ)、內(nèi)嵌獨立的AtherosAR9331晶片無線路由處理器,組成了一個具有Wifi功能的微控制器,也是Arduino家族中首個WiFi系的成員,將嵌入式Linux裝置、Arduino和WiFi傳輸器以及其他拓展板全部整合到一個開發(fā)板上。而圖3.2(b)中ArduinoDUE采用32bitCortex-M3架構(gòu),時鐘頻率為84?MHz,替代了之前的8?bit16?MHz的ATmega328微控處理器,同時涵蓋了一個USB2.0接口,能夠連接鼠標、鍵盤、攝像頭等USB產(chǎn)品。

如圖3.2(c)是ArduinoMEGA,是基于ATmega2560的Arduino開發(fā)板。它有54個數(shù)字輸入/輸出引腳(其中15個可用于PWM輸出)、16個模擬輸入引腳,4個UART接口,一個16MHz的晶體振蕩器,一個USB接口,一個DC接口,一個ICSP接口,一個復(fù)位按鈕。它包含了微控制器所需的一切,用戶只用簡單地把它連接到計算機的USB接口,或者使用AC-DC適配器,或者用電池,就可以驅(qū)動它。圖3.2(d)是ArduinoUNO,相較于ArduinoMEGA它提供了更少的I/O口。圖3.2四種常用型號Arduino開發(fā)板

圖3.2(d)所示為ArduinoUNO開發(fā)板,采用了標準的兩排插槽設(shè)計,上排插槽有16個端口,16個端口功能描述如表3.1所示。在編寫的測試程序里,需將訪問的數(shù)字信號端口進行定義。為了訪問這些端口,可以直接將連接線插入對應(yīng)的插槽。更方便的方式是使用跳線,這樣實驗完成后拆除起來也很容易。如表3.1中AREF端口是Referencevoltagefortheanaloginputs,模擬輸入的基準電壓,使用analogReference()命令調(diào)用。

圖3.2(d)的ArduinoUNO控制板的下排插槽有13個端口,13個端口功能描述如表3.2所示,其中Vin端口是inputvoltage的縮寫,表示有外部電源時的輸入端口。

3.3

Arduino/C語言的特點3.3.1

Arduino/C語言的結(jié)構(gòu)、函數(shù)

Arduino/C語言編寫代碼時可以調(diào)用Arduino開發(fā)環(huán)境的函數(shù)、框架、語句、變量、判斷以及高級函數(shù)、硬件庫等簡單、直觀的模塊,實現(xiàn)快速架構(gòu)生成一個解決特定問題的辦法的過程。當然,Arduino/C語言要遵守一些語法和結(jié)構(gòu)規(guī)則,這些規(guī)則繼承了C語言和其他編程語言的規(guī)則并被簡化,以便初學(xué)者使用。C語言是一種從頂部到底部執(zhí)行的結(jié)構(gòu)化編程語言,意思是代碼從頂部語句開始逐行執(zhí)行語句,直到執(zhí)行到底部的語句后結(jié)束執(zhí)行。

1.?基本函數(shù)

語句是編寫程序時最基本的單位,函數(shù)就是一組這種基本單位的集合體。Arduino/C語言中的函數(shù)由返回值、函數(shù)名、參數(shù)和函數(shù)體組成。

如程序3.1給出了標準Arduino函數(shù)的代碼架構(gòu),其調(diào)用相關(guān)函數(shù)體的語句的組成是,第一行調(diào)用庫函數(shù)或變量賦值語句,第二行調(diào)用通信函數(shù)或子函數(shù)語句,或調(diào)用函數(shù)體內(nèi)語句,第三行調(diào)用Arduino主函數(shù)。至此,完成了標準Arduino函數(shù)的代碼編寫。其內(nèi)部調(diào)用延時函數(shù)delay(1000)代表延時1000毫秒。程序3.1為標準Arduino程序函數(shù)調(diào)用架構(gòu)代碼,實現(xiàn)已連接端口器件LED燈的亮度延時變化。

1)?loop函數(shù)

loop()函數(shù)是能夠?qū)⒁唤M編程指令程序代碼進行重復(fù)運行的主體功能函數(shù)。一般地,loop()函數(shù)是在setup()函數(shù)初始化后進行調(diào)用的,即每一個ArduinoC程序都在初始化環(huán)節(jié)調(diào)用setup()函數(shù)完成之后,就可以自動調(diào)用loop()函數(shù)進入第二個環(huán)節(jié),即輸入環(huán)節(jié)。

2)?setup函數(shù)

程序3.1代碼是在程序開始時調(diào)用setup()函數(shù),用setup()函數(shù)配置每個引腳的輸入、輸出狀態(tài),以及其他只需執(zhí)行一次的動作,這樣當Arduino開始創(chuàng)建setup()時,每次上電或者被重置時調(diào)用運行一次setup()函數(shù),用它來設(shè)置引腳運行模式、初始化變量、啟動庫文件等一些初始化操作。另外補充說明一下,這里void是無類型聲明,是Arduino數(shù)據(jù)類型的一種,通常用來代表一個事件;如果控制過程比較簡單,void一般無需定義,可直接使用,代表事件的開始與事件的循環(huán);如果控制過程比較復(fù)雜,一般就要設(shè)置多個子事件,把復(fù)雜的過程進行分解,每一個子事件定義為一個void數(shù)據(jù)。

3)?pinMode()函數(shù)

Arduino常用函數(shù)有數(shù)字IO口輸入輸出模式定義函數(shù)pinMode(pin,mode),程序3.1中調(diào)用了pinMode()函數(shù),指定引腳輸出控制信號HIGH或LOW。pinMode(pin,mode)為數(shù)字IO口輸入輸出模式定義函數(shù),其中pin表示0~13;mode表示INPUT或OUTPUT,為引腳的工作狀態(tài)。一個簡單的for循環(huán)語句如for(inti=0;i<14;i++)pinMode(i,OUTPUT),能夠完成設(shè)置全部14個數(shù)字引腳為輸出模式的功能。與IO口輸入輸出定義相關(guān)的還有digitalWrite(pin,value)函數(shù)。

digitalWrite(pin,value)為數(shù)字IO口輸出電平定義函數(shù),其中pin表示0~13,value表示HIGH或LOW,比如可以使用該函數(shù)定義HIGH可以驅(qū)動LED。intdigitalRead(pin,value)為數(shù)字IO口讀輸入電平函數(shù),其中pin表示0~13,value表示HIGH或LOW,可以直接讀取數(shù)字傳感器。

4)數(shù)字量輸入輸出函數(shù)

可以使用Arduino開發(fā)板上的20個輸入和輸出(I/O)引腳,較容易地從開關(guān)或傳感器中讀取信息。每一個引腳都可以有不同的輸入輸出功能,這些模式可以在軟件中設(shè)置,包括輸入、輸出、模擬量轉(zhuǎn)數(shù)字量(ADC)和模擬量輸出模式??梢詫⑦@些Arduino常用的只有開和關(guān)兩種狀態(tài)的數(shù)字輸入輸出函數(shù)簡稱為數(shù)字量函數(shù)。

例如,如果一個數(shù)字引腳配置為INPUT,則可以用數(shù)字量函數(shù)digitalRead(pin)讀取這個引腳的狀態(tài),其調(diào)用語法的語句示例為:

if(digitalRead(pin)==HIGH)digitalWrite(pin,state);

如果讀取引腳等于HIGH狀態(tài),那么執(zhí)行這一行中的其余代碼。

5)模擬量輸入輸出函數(shù)

為了接收模擬輸入,Arduino開發(fā)板上的I/O引腳上需要連接模擬轉(zhuǎn)換器,通常叫作A/D轉(zhuǎn)換器或ADC,這樣硬件輸出引腳在板上標為A0~A5。Arduino的ADC有10位精度,意思是它可以返回一個對應(yīng)0~5V,表示0~1023的線性整數(shù)值,這就是說讀取精度為:5V/1023個單位,約等于每個單位0.049?V(4.9?mV)。然而,這里的模擬信號是一個連續(xù)信號,則ADC轉(zhuǎn)換的數(shù)值只能是函數(shù)調(diào)用讀信號時的那一瞬間的電壓值。因為Arduino是數(shù)字元件,實際上不能提供真正的模擬輸出,所以Arduino只能通過非常快地開關(guān)一個引腳來大概地輸出一個模擬信號,這個過程叫作脈寬調(diào)制(PWM)。

如在程序3.2的模擬輸入引腳讀取功能程序代碼中,改變模擬值(PWM波)并輸出到管腳,可用于根據(jù)不同的光線亮度調(diào)節(jié)發(fā)光二極管亮度或以不同的速度驅(qū)動發(fā)動機。調(diào)用函數(shù)analogWrite()之后,該引腳將產(chǎn)生一個指定占空比的穩(wěn)定方波,直到下一次調(diào)用analogWrite()(或在同一引腳調(diào)用digitalRead()或digitalWrite())。

為了去讀取更精確的數(shù)并增加模擬量讀數(shù)的精度,調(diào)用函數(shù)analogReference(type),該函數(shù)執(zhí)行結(jié)果是選擇傳感器的最高操作電壓,能有效地增加輸入模擬數(shù)值的精度,其函數(shù)參數(shù)type指的是要使用的參考電壓形式。type參數(shù)的選項是:DEFAULT選項為默認參考值(5?V或3.3?V),INTERNAL選項是內(nèi)置參考值(1.1?V或2.56?V),EXTERNAL選項是在AREF引腳加的電壓(0或5?V)。為了從傳感器中得到精確讀數(shù),需要在編寫程序代碼開頭使用一次以下語句:

analogReference(EXTERNAL);//從傳感器得到精確讀數(shù),選擇外部連在AREF引腳上的電壓為參考電壓EXTERNAL

之后,需要使用一根跳線連接AREF引腳到標記3.3?V的輸出引腳。這樣就可以使用ArduinoUno第二個電壓調(diào)節(jié)器提供一個精確的外部模擬3.3?V參考電壓了。在analogRead()之前調(diào)用analogReference()是很重要的,否則有可能降低內(nèi)部或外部電壓,這樣也許會損壞微控制器。最后,記住不要連接AREF引腳到一個高于+5?V的電壓上,因為錯誤的連接也可能損壞微控制器。

2.?使用變量

為了便于記憶和理解,可以用更好的寫代碼的方法,即在寫代碼時使用變量(聲明變量)。

在設(shè)置一個新變量時,我們需要至少給出兩部分信息:變量的數(shù)據(jù)類型和它的名稱。這個過程為變量聲明,變量聲明的實質(zhì)是在Arduino存儲區(qū)內(nèi)開辟一個空間來存儲信息。聲明變量的方法只是在指定變量的數(shù)據(jù)類型之后給變量一個獨一無二的名稱。例如程序3.2的

前三行為進行變量聲明和賦值。

變量名稱通常的命名慣例是方便編寫大程序時保證代碼的易讀性和簡潔性,有一些基本規(guī)則需要了解:首先,函數(shù)名和變量名都只能包含字母、下劃線、數(shù)字和貨幣符號,而空格和不常用符號不允許在變量名中使用,并且變量名的第一個字符不能是數(shù)字和不顯示的字符。其次,與Arduino開發(fā)者在Arduino庫中內(nèi)建函數(shù)的命名采用的形式一樣。如常量一般全部采用大寫字母,并在多個詞之間用下畫線。最后,Arduino語言是大小寫敏感的,必須準確使用大小寫形式,包括調(diào)用Arduino/C中任何預(yù)定義變量或函數(shù)名。

聲明變量的數(shù)據(jù)類型一般有如表3.3所示的幾種數(shù)據(jù)類型。

3.3.2

Arduino/C語言的高級函數(shù)

1.中斷函數(shù)

也許有大量代碼在主函數(shù)中等待條件發(fā)生時進行中斷服務(wù),這時將通過中斷請求線輸入信號來請求處理機進行中斷服務(wù),這種中斷稱之為硬件中斷;而軟件中斷是處理機內(nèi)部識別并進行處理的中斷過程。硬件中斷一般是由中斷控制器提供中斷類型碼,處理機自動轉(zhuǎn)向中斷處理程序;軟件中斷完全由處理機內(nèi)部形成中斷處理程序的入口地址并轉(zhuǎn)向中斷處理程序,不需要外部提供信息。

2.?數(shù)學(xué)函數(shù)

表3.4列出了常用的Arduino平臺支持的數(shù)學(xué)函數(shù)。

表3.3中大部分函數(shù)都在C語言中用過。其中map()和constrain()函數(shù)通常較少在數(shù)據(jù)庫中看到,它們經(jīng)常與傳感器配合使用,可以用來保持傳感器返回的數(shù)值在程序能夠處理的特定范圍內(nèi)。

3.?庫函數(shù)

Arduino庫由兩個獨立文件組成,這兩個文件分別稱為頭文件和代碼文件,頭文件必須使用.h作為文件擴展名,用庫的名字作為文件名,頭文件定義了庫里所有函數(shù)的原型,是函數(shù)所需參數(shù)和返回值數(shù)據(jù)類型的模板,而庫中的代碼文件包含函數(shù)的實現(xiàn)代碼。在Arduino安裝目錄下,可以看到名為libraries的目錄,其中包含一些標準的庫文件。表3.5列出了在1.0.5版本的ArduinoIDE下能找到的庫文件。

為了在程序中使用庫,只需要在菜單欄中單擊Sketch菜單即可,選擇ImportLibraries,然后從列表中選擇要用的庫。在程序中包含庫的頭文件后,就可以引用庫中的所有函數(shù)了。Arduino開發(fā)者已經(jīng)為所有標準庫和函數(shù)都編寫了出色的文檔。

3.4

Arduino基礎(chǔ)應(yīng)用實戰(zhàn)3.4.1

LED燈點亮

Arduino可以用來開發(fā)交互產(chǎn)品,比如它可以讀取大量的開關(guān)和傳感器信號,并且可以控制各式各樣的電燈、電機和其他物理設(shè)備。在學(xué)習(xí)Arduino/C語言的程序語句后,我們可以著手點亮LED燈,實現(xiàn)Arduino基礎(chǔ)應(yīng)用實戰(zhàn)的安裝、連接、上傳、測試的工作流程,通過讓LED燈閃爍起來并知道是我們讓它亮起來的,從而將我們學(xué)習(xí)Arduino編程的基礎(chǔ)知識、閱讀的程序代碼轉(zhuǎn)變?yōu)樽约簩懗?、完成的工程任?wù)代碼。

1.點亮一個LED

(1)?任務(wù)設(shè)定:點亮一個LED。

(2)?任務(wù)要求:任意延長點亮?xí)r間。

(3)?電路硬件配置:對于我們將用到的LED,從網(wǎng)上查找資料可知,其工作電壓一般為1.5~6.0?V,工作電流一般為10~60?mA,反向擊穿電壓為5?V??刂瓢暹壿嬰娐饭╇婋妷簽??V。根據(jù)以上參數(shù)假設(shè)LED工作電壓選用1.7?V,工作電流選用15?mA,因為限流電阻=(總電壓-LED電壓)/電流,所以限流電阻選擇(5-1.7)/0.015=220(Ω)。

(4)任務(wù)解析:在點亮LED的實驗中,需要通過軟件編寫程序完成在數(shù)字電路中基本的輸入形式開關(guān)(switch)的程序控制工作,它的作用是保持電路的連接或者斷開。Arduino從數(shù)字I/O管腳上只能讀出高電平(5V)或者低電平(0V),因此我們首先面臨的一個問題就是如何將開關(guān)的開/斷狀態(tài),轉(zhuǎn)變成Arduino能夠讀取的高/低電平。解決的辦法是通過上/下拉電阻來實現(xiàn),一般電阻值在100?Ω~10000?Ω范圍都可以,但是不同數(shù)值的電阻連接到LED引腳上后對應(yīng)LED點亮的亮度不同。

通常在一個開關(guān)控制邏輯門電路中,用“1”表示開關(guān)接通狀態(tài),用“0”表示開關(guān)斷開狀態(tài),如圖3.3(a)所示,開關(guān)一端接地,另一端則通過一個10?kΩ的上拉電阻接5?V電源,輸入信號是從開關(guān)和電阻間引出。當開關(guān)斷開時,輸入信號被電阻“拉”向電源,形成高電平(5V);當開關(guān)接通的時候,輸入信號直接與地相連,形成低電平;這樣開關(guān)斷開/接通狀態(tài)分別對應(yīng)邏輯控制的高電平/低電平,簡單地稱之為負邏輯電路;反之,將圖3.3(a)中所示電阻和開關(guān)器件位置進行對調(diào),則開關(guān)控制邏輯就是當開關(guān)斷開的時候,輸入信號被電阻“拉”向地,形成低電平(0V);當開關(guān)接通的時候,輸入信號直接與電源相連,形成高電平。

這樣開關(guān)斷開/接通狀態(tài)分別對應(yīng)邏輯控制的低電平/高電平,簡單地稱之為正邏輯電路,所以對于同一個門電路,可以采用正邏輯,也可以采用負邏輯。如圖3.3(b)中所示為負邏輯開關(guān)控制電路實際效果圖。如圖3.3所示邏輯開關(guān)控制電路被控的發(fā)光LED燈接在數(shù)字I/O的D13號管腳上,為了驗證Arduino數(shù)字I/O的輸入功能,可以將開關(guān)接在Arduino的任意一個數(shù)字I/O管腳上(D13除外),并通過讀取它的接通或者斷開狀態(tài),來控制其他數(shù)字I/O管腳的高低,如圖3.3所示為電路開關(guān)接在數(shù)字I/O的D7號管腳上。圖3.3邏輯電路控制軟件的相應(yīng)代碼實現(xiàn)如程序3.4所示。圖3.3

LED燈開關(guān)邏輯電路

在程序3.4中,由于采用的是負邏輯電路,開關(guān)按下時用digitalRead()函數(shù)讀取到的值為LOW,此時再用digitalWrite()函數(shù)將發(fā)光LED燈的管腳置為高電平,點亮LED。同理,當開關(guān)抬起時,LED將被熄滅,這樣我們就實現(xiàn)了用開關(guān)來控制LED的功能。

(5)?問題討論:請大家思考按照圖3.3所示LED開關(guān)邏輯控制電路,圖中LED開關(guān)還能更換成哪些數(shù)字I/O引腳接口嗎?

(6)?實踐提示:可以先把程序3.4所示代碼復(fù)制進去,進行0~13管腳連接測試。程序?qū)懞靡院簏c擊編譯按鈕;編譯完成后會顯示出編譯后的文件大小,本次編譯的程序大小約為1066字節(jié)。然后把編譯好的程序下載到Arduino控制板上(點擊下載按鈕)。下載完成后會有提示。如程序3.4所示的代碼和電路控制最后會呈現(xiàn)閃爍著光芒的LED實驗效果。在"intledPin=13"語句中;設(shè)置了LED的數(shù)字IO引腳,ledPin僅僅是13號數(shù)字端口自定義出來的名字,變成其他名字也都可以。對于多腳IO操作的程序,為每一個引腳定義名字是有必要的,程序復(fù)雜時通過引腳名字可以方便功能識別。

2.點亮六個LED

(1)?任務(wù)設(shè)定:六個LED閃爍。

(2)?任務(wù)要求:任意延長閃爍時間。

通過上一節(jié)的學(xué)習(xí),我們知道了怎樣讓一個LED進行閃爍,下面進行六個LED的控制,編譯調(diào)試如附錄1.1、附錄1.2、附錄1.3所示程序代碼。實驗中先看硬件連接圖。按照上面圖3.3硬件連接方法接好后,再來測試LED燈閃爍控制程序。

(3)?任務(wù)解析:修改其中一段代碼下載測試,使得第一段程序是使LED燈1~6個逐個點亮,然后使6~1個燈再逐個熄滅,如此循環(huán)。第二段程序是使6個燈同時亮,然后再使6~1個燈逐個熄滅,如此循環(huán)。

(4)?問題討論:有幾種修改方案?

(5)?實踐提示:下面這段代碼是for語句循環(huán),可以實現(xiàn)j個燈點亮,然后再延遲600?ms,然后再循環(huán),形成的整體效果就是6個燈相隔600?ms逐步被點亮。

然而下面這段代碼其實是不規(guī)范的寫法,for命令表達要求一定要有{}循環(huán),如果沒有標出{},編譯時就會自動對下一句加上{}。如果代碼量很大,出問題時查找起來會非常辛苦。

最后,正確的寫法應(yīng)該是下面的形式。這樣規(guī)范的for命令能夠?qū)崿F(xiàn)6個燈逐個被點亮,然后再延時600?ms進入下一句,6個燈逐個點亮的速度非常快。

經(jīng)過以上分析,對比附錄1.1、附錄1.2、附錄1.3中這三種不同樣式點亮6個LED燈的程序代碼,分別進行程序編譯并下載到硬件上,觀察產(chǎn)生的不同實驗效果。

3.4.2設(shè)備通信

1.串行通信

Arduino硬件的串行通信有標準的串口、SPI、I2C三種類型,ArduinoIDE提供了使用這三種通信方式的庫。Arduino開發(fā)板與其他設(shè)備之間通信的基本模式是串口通信,為了方便起見,Arduino開發(fā)者使用了串口轉(zhuǎn)USB芯片,這里串行通信協(xié)議也就包括USB協(xié)議;可按3.1.2小節(jié)介紹的方法使用串口通信上傳源代碼到Arduino開發(fā)板,也可以打開使用的Arduino編程環(huán)境中的串口監(jiān)視器去實際地“看看”模數(shù)轉(zhuǎn)換器讀到的值。

Arduino的串口使用兩根數(shù)字接口引腳。默認情況下,所有的Arduino型號使用數(shù)字接口引腳0和1作為主串口,其中引腳0用于接收(RX),引腳1用于發(fā)送(TX)。如圖3.4所示為Arduino串口端口點亮LED的測試電路原理示意圖,這樣一旦Arduino在通過串口向PC發(fā)送數(shù)據(jù)時,相應(yīng)的發(fā)光LED就會閃爍,實際應(yīng)用中這是一個非常方便實用的測試電路。根據(jù)Arduino的原理圖我們不難看出,ATmega的RX和TX引腳一方面直接接到了數(shù)字I/O端口的0號和1號管腳,另一方面又通過電平轉(zhuǎn)換電路接到了串口的母頭上。因此,當我們需要用Arduino與PC機通信時,可以用串口線將兩者連接起來;當我們需要用Arduino與微控制器(如另一塊Arduino)通信時,則可以用數(shù)字I/O端口的0號和1號管腳。圖3.4

Arduino串口端口點亮LED燈的測試電路原理示意圖

串口在Arduino軟件中被稱為Serial,這也是程序中通過串口發(fā)送和接收數(shù)據(jù)對象的名稱(例如serial.print函數(shù))。表3.6所示為Arduino平臺的Serial庫函數(shù)介紹。

2.?串口通信測試任務(wù)

(1)?任務(wù)設(shè)定:通過串口讀取數(shù)據(jù)。

(2)?任務(wù)要求:調(diào)用表3.5中Arduino平臺Serial庫函數(shù)進行串口通信測試。

(3)?系統(tǒng)配置:可以實現(xiàn)系統(tǒng)功能的語句如程序3.5所示。

(4)?問題討論:請思考波特率能更改嗎?

(5)?實踐提示:串行通信是實現(xiàn)在PC與微控制器之間進行交互的最簡單辦法,很多場合中都要求Arduino能夠通過串口接收來自PC的命令,并完成相應(yīng)的功能,而這可以通過Arduino語言中提供的Serial.read()函數(shù)來實現(xiàn)。

串行通信的難點在于參數(shù)的設(shè)置,如波特率、數(shù)據(jù)位、停止位等,在Arduino語言中可以使用Serial.begin()函數(shù)來簡化這一任務(wù)。在本實驗中沒有額外的電路,僅需要用串口線將Arduino和PC連起來就可以了,通過把程序3.5所示工程代碼下載到Arduino模塊中,在Arduino集成開發(fā)環(huán)境中打開串口監(jiān)視器并將波特率設(shè)置為9600,然后向Arduino模塊發(fā)送字符H即可實現(xiàn)。

Arduino語言的參考手冊中沒有對serial.read()函數(shù)做過多的說明,這里存在一個疑問,就是如果PC一次發(fā)送的數(shù)據(jù)太多,Arduino是否可提供相應(yīng)的串口緩存功能來保證數(shù)據(jù)不會丟失呢?在從串口讀數(shù)據(jù)之前,Arduino語言中提供的能夠知道在串口內(nèi)是否有數(shù)據(jù)的另外一個函數(shù)為serial.available(),這個函數(shù)沒有參數(shù),直接返回在串口緩沖區(qū)中的可用的字節(jié)數(shù),如果在串口緩沖區(qū)中沒有數(shù)據(jù),則這個函數(shù)會返回0,即相當于false;如果有數(shù)據(jù)可用,則這個函數(shù)會返回一個不是0的值,這相當于true。程序3.5所示代碼為調(diào)用serial.available()發(fā)送字符的程序代碼,圖3.5為程序代碼的編譯界面。

圖3.5程序代碼的編譯界面

將程序3.5所示工程代碼編譯下載到Arduino模塊后即可看到圖3.6所示Arduino串口端口13的測試燈點亮了。在Arduino集成開發(fā)環(huán)境的工具欄中單擊“SerialMonitor”控制,打開串口監(jiān)視器;一般將波特率設(shè)置為9600?b/s,即保持與工程中的設(shè)置相一致。通常這種情況下我們就可以在Arduino集成開發(fā)環(huán)境的串口監(jiān)視器Console窗口中看到串口上輸出的數(shù)據(jù)了。為了檢查串口上是否有數(shù)據(jù)發(fā)送,一個比較簡單的辦法是在數(shù)字I/O端口的D1號管腳(TX)和5V電源之間接一個發(fā)光LED以及串聯(lián)1?kΩ限流電阻。如圖3.6所示為Arduino串口端口測試效果,圖3.6(a)為Arduino點亮LED的串口通信測試效果,圖3.6(b)圖3.6

Arduino串口端口測試效果與樣板

3.?無線通信模塊

如圖3.7所示為一款基于STM32的藍牙通信協(xié)議研制的NRF24L01型號無線模塊,能夠?qū)崿F(xiàn)在空曠無遮擋的情況下20~30?m的近距離無線傳輸功能。如圖3.7所示,硬件部分設(shè)計為Arduinounor3作為控制器,電源直接連接Arduino電源口供電,無線模塊可以選用低功耗、傳輸效率高的NRF24L01模塊,按照NRF24L01模塊手冊進行硬件管腳對應(yīng)連線連接測試,其中圖3.7(a)為Arduino開發(fā)板與NRF24L01模塊連接的無線發(fā)送端模塊,圖3.7(b)為Arduino開發(fā)板與NRF24L01模塊連接的無線接收端模塊。(a)?Arduino開發(fā)板與NRF24L01模塊連接的無線發(fā)送端模塊圖3.7無線模塊與Arduino的連接

按照程序3.6所示的Arduino控制程序發(fā)送端的程序代碼及程序3.7所示Arduino控制程序接受端的程序代碼的基本語句,實現(xiàn)兩個無線模塊之間的連接通信,互相無線收發(fā)字節(jié)。

3.4.3使用傳感器

1)?數(shù)字傳感器

如圖3.8所示為Arduino平臺的數(shù)字輸入溫度計,以DHT11數(shù)字溫濕度傳感器為例,它是一款含有已校準數(shù)字信號輸出的溫濕度復(fù)合傳感器,包括一個電阻式濕度元件和一個NTC測溫元件,并與一個高性能8位單片機相連接。DHT11數(shù)字溫濕度傳感器模塊為3針PH6.0封裝,其供電電壓為3~5.5V,連接到Arduino平臺電源5V及GND端口;DHT11傳感器數(shù)據(jù)輸出連接到Arduino平臺PWM管腳2,溫度范圍為0℃~50℃,誤差為±6℃;濕度范圍為60%~90%RH,誤差為±5%RH。圖3.8

Arduino平臺的數(shù)字輸入溫度計

2)?模擬傳感器

如圖3.9所示為Arduino平臺的模擬輸入溫度計,以NS公司生產(chǎn)的集成電路溫度傳感器LM35為例,它是一款輸出電壓與攝氏溫度成線性比例精度很高的模擬信號傳感器。首先,打開軟件Proteus,按照查表法進行溫度計仿真系統(tǒng)的設(shè)計,連接連線電子器件有電子電源、溫度采集傳感器LM35、ArduinoUNO開發(fā)板、顯示屏LCD、放大器、導(dǎo)線若干等。其次,用ArduinoUno單片機模擬數(shù)據(jù)輸入端口進行采集,通過A4端口輸入溫度采集電路電壓數(shù)據(jù),并由Arduino編程進行處理,把電壓值轉(zhuǎn)換為溫度值,控制溫度值輸出給顯示屏LCD進行顯示。圖3.9

Arduino平臺的模擬輸入溫度計

系統(tǒng)軟件功能可以實現(xiàn)的代碼如附錄2中Arduino平臺溫度控制模塊的程序所示,編譯代碼后下載到Arduino中,按照Arduino查表法進行溫度計中控制器hex的設(shè)置,具體操作步驟包括:

(1)?在ArduinoIDE的File(文件)>preferences(首選項)中找到preferences.txt文件。

(2)?用記事本打開preferences.txt,選擇hex文件并確定存放路徑,在最后一行加入:build.path=d:\arduino\MyHexDir(存放在d盤/arduino/MyHexDir文件夾下,也可以存放在其他盤上。)

(3)?關(guān)閉ArduinoIDE。

(4)?關(guān)閉preferences.txt,關(guān)閉時對話框顯示是否保存,選擇保存。(注意:以上操作時不要連接Arduino開發(fā)板。)

(5)?編譯生成兩個hex,一個包含Arduino引導(dǎo)程序,另一個不包含Arduino引導(dǎo)程序。

(6)?在Protues中導(dǎo)入hex文件,雙擊ArduinoUNO單片機元件,調(diào)整合適的頻率,從programfile中選取已經(jīng)建好的hex文件即可導(dǎo)入。第四章Arduino平臺機器人實戰(zhàn)4.1

Arduino機器人的硬件庫4.2

Arduino平臺循跡功能機器人實戰(zhàn)4.3

Arduino平臺視覺機器人實戰(zhàn)4.4

Arduino平臺人臉面部表情識別模仿機器人

4.1

Arduino機器人的硬件庫

4.1.1使用庫要在Arduino框架中使用庫,則需要告訴編譯器要用哪個庫和函數(shù),采用的方法是可以在框架開始處使用#include預(yù)處理指令去指定庫文件的名字。注意預(yù)處理指令語句不是用分號結(jié)束的。如程序4.1所示代碼為使用庫程序的語句代碼。

4.1.2舵機庫

前面介紹了硬件庫的調(diào)用能實現(xiàn)在LCD顯示屏上呈現(xiàn)文本。現(xiàn)在介紹如何讓物體動起來。用Arduino移動一個物體最好的辦法就是使用舵機/電機。Arduino平臺有一個專門驅(qū)動典型舵機/電機的庫,簡稱之為舵機庫。

舵機庫可以在ArduinoUNO平臺上的任何數(shù)字引腳上最多控制12個舵機,但是這個功能不可用數(shù)字引腳9和10上的PWM。舵機端口部分有三根不同顏色的輸出線。其中,紅色為電源線,其連接供電電壓范圍是+4.8?V~6?V;黑色線材是電源地線,為公共地接地線;黃色線材為舵機的控制端(也就是信號線),其邏輯信號電壓保持范圍為+3?V~5?V,而信號線與單片機信號輸出端口相連。如圖4.1所示為一個或多個舵機與Arduino單片機硬件連線示意圖,每個舵機都可以使用PWM控制波形,實現(xiàn)舵機位置的目標控制。圖4.1一個或多個舵機與Arduino單片機硬件連線示意圖圖4.1一個或多個舵機與Arduino單片機硬件連線示意圖

設(shè)計舵機組合控制方式時,應(yīng)當考慮到控制多個舵機可能需要超過100?mA的電流,以及Arduino單片機與各種硬件器件或電路連接軟件的連接配置。Arduino有多種方式可以產(chǎn)生PWM控制舵機,有通過Arduino的普通數(shù)字傳感器接口產(chǎn)生占空比不同的方波,模擬產(chǎn)生PWM信號進行舵機定位,如圖4.2(a)所示;還有直接利用Arduino自帶的Servo函數(shù)進行舵機控制的,如圖4.2(b)所示。在舵機的連接部分直接使用黏合劑固定并連接需要連接的舵機,因為SG90舵機的扭力相對較小,所以不會對連接部分產(chǎn)生非常大的扭力,不會影響舵機的運動。圖4.2舵機組合控制場景照片

具體實現(xiàn)舵機控制例程代碼的方法有以下三種:

1)?第一種方法

第一種方法是用analogWrite(pin,val)命令,其中函數(shù)參數(shù)pin是引腳的編號,測試只能用3、5、6、9、10、11這幾條;val指的是0~655的整數(shù)值,對應(yīng)電壓從0到+5V。例如ArduinoMega168就支持0~13共14個PWM輸出。(注意:幾個引腳的編號指的是pin編號,Arduino板子會用這幾個管腳支持PWM輸出。)?程序4.2為Arduino調(diào)用analogWrite(pin,val)命令輸出脈沖寬度調(diào)制信號程序代碼。

2)第二種方法

第二種方法是手動設(shè)置實現(xiàn)Arduino平臺輸出脈沖寬度調(diào)制信號的代碼。如程序4.3所示為Arduino手動實現(xiàn)輸出脈沖寬度調(diào)制信號的程序代碼。

3)?第三種方法

第三種方法是直接利用Arduino自帶的Servo函數(shù)進行舵機的控制,如程序4.4為Arduino調(diào)用庫函數(shù)servo.h的程序代碼,代碼中展示了調(diào)用庫函數(shù)servo.h后,采用不同舵機的調(diào)用函數(shù)設(shè)置。

程序4.4中主函數(shù)loop函數(shù)體內(nèi)部調(diào)用write()函數(shù),用來實現(xiàn)控制舵機的運動。該函數(shù)參數(shù)是用角度數(shù)為單位簡單指定一個角度,舵機就會以默認速度運動到這個角度,并在每個運動之間延時;這里考慮舵機只以一個固定的速度運動,當需要減慢舵機角度變化的速度時,我們需要把大的位置變化分成一些小的運動,并在每個運動之間延時;程序4.4中的標準for循環(huán)讓舵機開始時在0°位置,每10?ms增加1°,直到舵機達到90°位置。

以上說明的Arduino平臺舵機組合控制實驗中,調(diào)試過程中需要注意解決以下三個易出故障的問題。

1)?舵機回到中間的初始化問題

2)?供電問題

3)?線材長度問題

綜上所述,舵機是一種簡單的旋轉(zhuǎn)運動電機,即一種位置(角度)伺服驅(qū)動器,適用于那些需要角度不斷變化并可以保持的系統(tǒng)。對于有些項目需用到同樣的運動位置精確控制的其他硬件,可以結(jié)合具體硬件器件數(shù)據(jù)文件,生成一個新的硬件庫實例,進行相應(yīng)函數(shù)參數(shù)設(shè)置控制。

4.2

Arduino平臺循跡功能機器人實戰(zhàn)

基于Arduino控制器平臺設(shè)計的循跡功能機器人,能沿著地面上黑色軌跡實現(xiàn)循跡功能,也能檢測跑道兩側(cè)的擋板,沿擋板行駛實現(xiàn)避障功能。Arduino循跡避障機器人基本功能是:當前方?jīng)]有障礙物的時候,兩邊紅外傳感器燈不亮,表示前方無障礙,機器人前行沿著地面黑白線的黑線循跡前進。

在機器人的制作中,在循跡模塊上,由于黑白線地板對光線的反射系數(shù)不同,因此傳感器依據(jù)接收到的反射光強弱來判斷機器人小車前進方向。本節(jié)采用TCRT5000紅外對管檢測黑線,實現(xiàn)機器人識別并能沿著地面測試區(qū)域的黑白線中黑線行走;在避障模塊設(shè)計上,采用中間一個超聲波探頭HC-SR04超聲波傳感器發(fā)射和接收超聲波,實現(xiàn)障礙物距離的測量。整個機器人組成部分有主控電路模塊、電源、紅外檢測模塊、電機及驅(qū)動模塊等。若設(shè)計為兩個或三個紅外傳感器,則其邏輯布局可參考表4.1所示的紅外傳感器控制策略組合表。

采用差速換向控制機器人左右輪,實現(xiàn)機器人的左右轉(zhuǎn)、前進后退等電機控制動作,實現(xiàn)輪式機器人循跡和避障效果。圖4.3為機器人小車循跡的程序流程設(shè)計圖,其中圖4.3(a)為兩路傳感器循跡的流程圖,圖4.3(b)為三路傳感器循跡的流程圖。圖4.3機器人小車循跡的程序流程設(shè)計圖

在實驗室搭建的循跡和避障機器人,用基于Arduino控制器開發(fā)的機器人小車能夠?qū)崿F(xiàn)發(fā)現(xiàn)并避開障礙物的功能,能夠完成在封閉橢圓形曲線或“8”字形曲線上的黑線循跡,如圖4.4所示為黑線循跡的機器人小車運行場景。圖4.4機器人小車循跡黑線路徑的運行場景

4.3

Arduino平臺視覺機器人實戰(zhàn)

1.圖像處理基本軟件方案

1)?Python

Python是一種面向?qū)ο?、解釋型程序語言,在1989年發(fā)明并且1991年發(fā)行第一個公開發(fā)行版。Python是純粹的自由軟件、源代碼和解釋器,Python遵循GPL(GeneralPublicLicense)協(xié)議。Python語法簡潔清晰,特色之一是強制用空白符(WhiteSpace)作為語句縮進。Python具有豐富和強大的庫。Python常被稱為“膠水”語言,能夠把用其他語言制作的各種模塊(尤其是C/C++)很輕松地聯(lián)結(jié)在一起。

2)?PIL(PythonImageLibrary)

PythonImagingLibrary(PIL)是PythonWare公司提供的免費的圖像處理工具包,是Python下的圖像處理模塊,支持多種格式,并提供強大的圖形與圖像處理功能。雖然在這個軟件包上要實現(xiàn)類似Matlab中的復(fù)雜的圖像處理算法并不太適合,但是Python的快速開發(fā)能力以及面向?qū)ο蟮戎T多特點使得它非常適合用來進行原型開發(fā)。對于簡單的圖像處理或者大批量的簡單圖像處理任務(wù),Python+PIL是很好的選擇。PIL庫僅適用于簡單的圖像處理,因為圖像處理要涉及Canny邊緣檢測、霍夫變換等較為復(fù)雜的圖像處理算法,而這是PIL庫所不具備的,所以我們考慮配合使用OpenCVforPython。

3)?OpenCV

OpenCV的全稱是OpenSourceComputerVisionLibrary。OpenCV是一個基于BSD許

可(開源)發(fā)行的跨平臺計算機視覺庫,可以運行在Linux、Windows和MacOS操作系統(tǒng)上。它輕量級而且高效,即由一系列C函數(shù)和少量C++類構(gòu)成,同時提供了與Python、Ruby、Matlab等的接口,實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法。

2.圖像信息處理

1)?圖像信息傳輸?shù)耐ㄐ胚B接模塊

在Arduino平臺視覺機器人實戰(zhàn)中,首先需要設(shè)計將攝像頭采集到的圖像信息進行處理后再進行傳輸?shù)耐ㄐ胚B接模塊,這里介紹兩種方法,一種是采用藍牙無線模塊進行連接實現(xiàn),另一種是采用按鍵精靈中間件通信連接模塊進行連接實現(xiàn)。

(1)?使用藍牙無線通信模塊,具體連接測試過程是:

首先安裝Python的Pyserial庫;再使用HC-06模塊,引出接口包括VCC、GND、TXD、RXD,預(yù)留LED狀態(tài)輸出腳的狀態(tài)值,判斷藍牙是否已經(jīng)連接到單片機上。

②LED指示藍牙連接狀態(tài),閃爍表示沒有藍牙連接,常亮表示藍牙已連接并打開了端口。

測量輸入電壓范圍為3.6~6V,未配對時電流約為30?mA,配對后電流約為10?mA,輸入電壓禁止超過7?V??梢灾苯舆B接各種5?V供電單片機(51、AVR、PIC、ARM、MSP430等)。

在未建立藍牙連接時,支持通過AT指令設(shè)置波特率、名稱、配對密碼,設(shè)置的參數(shù)可以掉電保存。當藍牙連接以后,從機能與各種帶藍牙功能的電腦、藍牙主機、大部分帶藍牙的手機、Android、PDA、PSP等智能終端配對,從機之間不能配對。

(2)?使用按鍵精靈中間件通信模塊,具體連接測試過程是:通過第三方程序——按鍵精靈腳本,將Python與OpenCV處理得到的結(jié)果從txt文本中傳輸?shù)紸rduinoIDE的串口監(jiān)視器中,需要保證txt文本數(shù)據(jù)與第三方程序、腳本在同一個文件里面。程序4.5為按鍵精靈腳本程序代碼。

2)?圖像信息傳輸通信過程

下面介紹視覺機器人圖像處理配置硬件上位機環(huán)境,例如基于VS2013的OpenCV視覺庫以及Arduino單片機結(jié)合來實現(xiàn)舵機組合控制。有以下兩種解決方案。

第一種解決方案:安裝好軟件VS2013與函數(shù)庫OpenCV相匹配的版本,在VS2013界面選擇工具選項卡,選擇擴展和更新選項,彈出一個窗口,在左側(cè)選擇聯(lián)機,在網(wǎng)上搜索VS2013官方提供的可用插件,然后在右側(cè)選擇ArduinoIDEforVisualStudio下載安裝即可。安裝后運行VisualStudio,會提示指定Arduino安裝地址(如“E:\Arduino-1.8.2”);待后面常規(guī)選項設(shè)置完成以后會收到Toolchainupdatecomplete的提示,這樣配置就生效了。

第二種解決方案:利用USB-TTL轉(zhuǎn)換插頭以及Arduino單片機的端口讀取功能實現(xiàn),將USB-TTL模塊連接在電腦上,用杜邦線分別連接單片機到模塊上的電源口、輸入端RX、輸出端TX以及地線。安裝驅(qū)動利用USB串口調(diào)試器調(diào)試完畢后直接將返回值輸出到TTL模塊并經(jīng)過杜邦傳輸?shù)絾纹瑱C上。在VS上同樣有USB-TTL插件,下載好后,調(diào)用命令通過轉(zhuǎn)換模塊將返回值發(fā)送出去,通過單片機的模擬端口讀取功能在Arduino中讀取對應(yīng)端口返回值;使用條件判斷語句判斷偏移方向設(shè)置函數(shù)以改變舵機角度,實現(xiàn)攝像頭的動態(tài)跟蹤功能。

以Arduino單片機為例的攝像頭機器人小車循跡系統(tǒng)主要部分的運行過程如下:首先,攝像頭的數(shù)據(jù)端口通過無線連接計算機上位機,并將攝像頭實物安裝在Arduino平臺機器人上;在計算機里面打開整個系統(tǒng)的上位機,在上面運行攝像頭,讀取循跡圖片,進行二值化,像素點提取計算讀值,并以txt文件形式輸出;然后,依托計算機強大的計算能力完成圖像處理數(shù)據(jù)決策,并生成決策編碼數(shù)據(jù)指令;最后,利用USB-TTL模塊連接到藍牙通信模塊,將發(fā)送的編碼數(shù)據(jù)指令傳輸?shù)较挛粰C藍牙模塊接收解碼。圖4.5所示為Arduino單片機、藍牙模塊間的通信連接,從而實現(xiàn)運行舵機、電機控制程序。圖4.5

Arduino單片機、藍牙模塊間的通信連接

3)?圖像像素閾值處理過程

圖像處理是計算機視覺處理最關(guān)鍵的步驟,用以去除圖像中的無關(guān)信息及噪聲,突出所需要的信息,如綜合用到的二值化,包括像素點提取、計算、讀值。一般地,一幅圖像包括目標物體、背景及噪聲。

3.?圖像像素點矩陣化

利用Python中numpy庫和scipy庫,可以進行圖像像素點矩陣化的數(shù)據(jù)操作和科學(xué)計算。這里首先需要導(dǎo)入基于Python、PIL、OpenCVforPython等一系列的頭文件和具體圖像處理程序?qū)?/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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論