作者:楊繼志 郭敬 摘要:Arduino是一款電子互動(dòng)產(chǎn)品開(kāi)發(fā)的軟硬件平臺,有時(shí)也叫做“電子積木”。介紹了其主要的特點(diǎn),指出Arduino將在我國的電子互動(dòng)產(chǎn)品設計中發(fā)揮越來(lái)越重要的作用。之后詳細介紹了Arduino的硬件和軟件組成,并通過(guò)實(shí)例說(shuō)明了基于A(yíng)rduino的互動(dòng)產(chǎn)品創(chuàng )新設計的基本過(guò)程,使讀者可以初步掌握采用Arduino進(jìn)行設計的基本技能。 引言 Arduino是一系列基于單片機的人機互動(dòng)產(chǎn)品開(kāi)發(fā)平臺,由于其具有高度的模塊化特點(diǎn),有時(shí)也叫它“電子積木”。它的硬件平臺是開(kāi)放的,任何人都可以在A(yíng)rduino官方網(wǎng)站上下載最新的PCB設計進(jìn)行復制。Arduino的硬件平臺包括基于AVR單片機的主控制電路板,以及大量的各式輸入/輸出電子模塊。輸入/輸出模塊包括開(kāi)關(guān)輸入模塊、溫度壓力傳感器輸入模塊、超聲測距傳感器輸入模塊、各類(lèi)顯示輸出模塊、電機控制模塊等,甚至還有以太網(wǎng)接入模塊。由于A(yíng)rduino具有豐富易用的模塊,已經(jīng)在各類(lèi)機電創(chuàng )新設計比賽中得到廣泛應用。在軟件方面,Arduino有一個(gè)屬于自己的基于Eclipse的IDE軟件開(kāi)發(fā)環(huán)境,開(kāi)發(fā)語(yǔ)言采用類(lèi)C++語(yǔ)言的高級語(yǔ)言,容易被使用者掌握。有大量的庫文件可以通過(guò)互聯(lián)網(wǎng)下載免費獲得,大大簡(jiǎn)化了程序開(kāi)發(fā)工作。由于A(yíng)rduino豐富的外圍模塊、容易掌握的開(kāi)發(fā)語(yǔ)言和環(huán)境,大量的庫支持,使得基于A(yíng)rduino的電子互動(dòng)產(chǎn)品設計越來(lái)越多。從Arduino誕生的2005年到2011年,已有超過(guò)15萬(wàn)塊的Arduino模板售出[1]。本文介紹了Arduino的硬件、軟件,并給出了采用Arduino開(kāi)發(fā)互動(dòng)產(chǎn)品的實(shí)例,使初學(xué)者對它有一個(gè)基本的認識。 1 Arduino硬件 1.1 Arduino主控板 Arduino的主控板采用AVR單片機,最新的版本是UNO,與之前的版本不同,它不再使用FTDI USB串行驅動(dòng)芯片,而是把Atmega8U2編程為一個(gè)USB設備。相對于它的前幾代,這帶來(lái)了許多好處。首先是價(jià)格降低了,更重要的是這使得Arduino在PC端可以顯示為一個(gè)USB設備,就像是一個(gè)鼠標或游戲操作手柄,這開(kāi)辟了Arduino的新用途[1]?傊,Arduino的主控板就是一個(gè)單片機控制板,在這一點(diǎn)上與其他單片機控制板并無(wú)本質(zhì)的區別,但是由于其擁有豐富的系列產(chǎn)品、大量的開(kāi)源軟件,讓Arduino得到了更為廣泛的應用和支持。 1.2 Arduino輸出模塊 市場(chǎng)上已經(jīng)出現了圍繞Arduino Duemilanove開(kāi)發(fā)的很多輸出模塊:有視覺(jué)輸出的,如LED燈控制、LCD控制、觸摸屏控制等;有聲音輸出的,如蜂鳴器和揚聲器模塊;還有物理系統的控制模塊,如各類(lèi)直流小馬達、步進(jìn)電機、機器人舵機等。另外,還可以利用AVR單片機的PWM輸出口進(jìn)行D/A轉換。這些模塊大大拓展了Arduino作為一個(gè)單片機平臺的用途。其中基于LN298設計的直流馬達控制模塊在各類(lèi)機器人項目中采用得很多,這種模塊能夠同時(shí)控制兩路直流馬達,與ArduinoDuemilanove之間的連接也十分簡(jiǎn)便。輸出單元的模塊化使搭建基于A(yíng)rduino系統的應用項目很方便。 1.3 Arduino輸入模塊 最一般的輸入如各類(lèi)按鈕、位置行程開(kāi)關(guān)等都有相應的模塊可以購買(mǎi)。其他諸如超聲測距、壓力傳感器、溫度傳感器、傾角傳感器等也有相應的模塊可以直接應用。還有記錄數據和通信用的模塊、如SD卡模塊,以太網(wǎng)接入模塊等,這讓Arduino不僅僅作為一個(gè)控制終端使用,還可以進(jìn)行數據的存儲和簡(jiǎn)單處理,以及與外界系統通信等,可見(jiàn)其輸入模塊資源豐富。從輸入的信號來(lái)看,可以分為數字量的信號輸入(如以上的開(kāi)關(guān)模塊等),模擬量的信號輸入(如溫度、壓力傳感器模塊),通過(guò)總線(xiàn)網(wǎng)絡(luò )方式的數據輸入(如采用各類(lèi)通信協(xié)議的傳感器模塊等)。 2 Arduino軟件 2.1 Arduino編程語(yǔ)言 Arduino編程語(yǔ)言是建立在C/C++語(yǔ)言基礎上的。Arduino語(yǔ)言把AVR單片機(微控制器)相關(guān)的一些參數設置都參數化了,不用開(kāi)發(fā)者去了解其底層,對AVR單片機了解不多的用戶(hù)也可以容易地開(kāi)發(fā)基于A(yíng)VR的項目。需要注意的是,Arduino的語(yǔ)言與C語(yǔ)言運行機制還是有一些區別的,特別是在項目程序中必須包括setup和loop兩個(gè)函數。setup函數在系統上電或復位后運行一次,因此一般用戶(hù)在其中做一些初始化工作,如設定串口通信的波特率等,一些一次性的工作也可以放在這個(gè)函數中運行,如下文中的寫(xiě)SD卡文件的例子程序。Loop函數是Arduino軟件項目的主體,系統上電并且運行完成setup函數后,就進(jìn)入loop函數,并且該函數是一個(gè)無(wú)限循環(huán)的過(guò)程,這一點(diǎn)需要開(kāi)發(fā)者特別注意,這與C語(yǔ)言的void main(){}是有很大區別的。loop函數相當于下面這樣一個(gè)無(wú)限循環(huán)過(guò)程: while(1){ 用戶(hù)程序 } 在系統setup執行之后,總是進(jìn)入這個(gè)函數,開(kāi)發(fā)者需要把自己的程序放在這個(gè)函數內運行。 2.2 Arduino開(kāi)發(fā)環(huán)境 Arduino的開(kāi)發(fā)環(huán)境很簡(jiǎn)潔,用戶(hù)可以在其官方網(wǎng)站上免費下載使用,IDE如圖1所示?梢钥吹,在一個(gè)簡(jiǎn)單的菜單和工具條下,就是IDE的編程窗口和一個(gè)串行通信監視窗口。其中工具條包含了保存打開(kāi)文件、向Arduino板下載程序等主要功能,與一般的Windows軟件并無(wú)不同。在編程窗口下是一個(gè)串口監視器窗口。因為Arduino開(kāi)發(fā)板沒(méi)有專(zhuān)門(mén)的顯示平臺,在許多程序的調試過(guò)程中需要Arduino傳輸給上位機一些信息以便于開(kāi)發(fā)者判斷程序的運行狀況,或者得到程序的運行結果。這些結果可以通過(guò)串口監視器顯示,開(kāi)發(fā)者也可以通過(guò)該窗口向Arduino板發(fā)送一些信息,極大地方便了項目的開(kāi)發(fā)。 ![]() 圖1 Arduino的IDE 3 Arduino平臺開(kāi)發(fā)實(shí)例 3.1 用Arduino讀寫(xiě)SD卡 SD卡體積小,價(jià)格便宜,因此在許多工業(yè)數據記錄和家用電子產(chǎn)品中有越來(lái)越多的應用。Arduino可以通過(guò)SPI接口與之通信,進(jìn)行諸如建立文件、刪除文件、向文件中添加內容、修改文件等操作,這樣采用Arduino配合SD卡可以開(kāi)發(fā)數據記錄設備。 Arduino與SD卡的簡(jiǎn)單連接,只需要6只電阻和1張SD卡,通過(guò)軟件模擬的方式實(shí)現SPI接口,Arduino與SD卡連接電路如圖2所示。 ![]() 圖2 Arduino與SD卡連接電路 由于SD卡的操作電壓為3.3 V,而Arduino的邏輯電壓為5 V,因此需要用起分壓作用的電阻(本文采用了Josh Adams書(shū)中的驗證性電路),在實(shí)際的應用中最好采用分壓模塊以保證卡和Arduino板的安全。之后在網(wǎng)址http://code.google.com/p/sdfatlib/下載Bill Greiman開(kāi)發(fā)的SdFat.h和SdFatUtil.h頭文件和庫文件,并安裝到Arduino安裝目錄中的庫文件夾中就可以使用了。簡(jiǎn)化程序如下: #include #include Sd2Card card; SdVolume volume; SdFile root,file; void writeString(SdFile& f,char * str){ Uint8_t n; for(n=0;,str[n];n++) F.write((uint8_t*) str,n) } void setup(){ card.init(SPI_HALF_SPEED); root.openRoot(&volume); File.open(&root,"testfile.txt",0_CREAT|0_EXCL|0_WRITE); File.timestamp(2,2011,11,11,25.12.34.56); writeString(file,"something you want "); File.cose(); } void loop(){ } 將該程序下載到Arduino主控板內即可向SD卡內建立一個(gè)新的文件,并寫(xiě)入"something you want "字符,當然也可以根據需要寫(xiě)入想要記錄的信息。 程序的開(kāi)頭包含了兩個(gè)頭文件:SdFat.h和SdFatUtil.h。這兩個(gè)頭文件定義了一些操作SD卡必需的類(lèi)。之后建立4個(gè)有關(guān)操作SD卡的對象。然后自定義了一個(gè)向SD卡內寫(xiě)一個(gè)字符串的函數,這個(gè)函數需要一個(gè)文件的引用和一個(gè)字符串作為參數。setup函數是Arduino軟件項目中必須有的,做一些運行的初始化工作。這個(gè)實(shí)例程序由于只是完成簡(jiǎn)單的寫(xiě)文件操作,因此對文件的寫(xiě)操作在這個(gè)函數中完成。函數依次完成了設定SD卡的通信模式為SPI模式、打開(kāi)卡的根目錄、建立文件名為testfile.txt的文本文件、給文件添加時(shí)間信息、向文件內寫(xiě)入文件內容、關(guān)閉文件。從以上的過(guò)程中看,采用Arduino操作SD卡上的文件與采用C語(yǔ)言操作PC上的文件十分相似,這也是Arduino易用性的體現,再一次驗證了采用Arduino開(kāi)發(fā)電子互動(dòng)產(chǎn)品的方便性。 結語(yǔ) Arduino是一個(gè)開(kāi)放的單片機開(kāi)發(fā)人機互動(dòng)產(chǎn)品的軟硬件平臺,由于它有豐富的軟硬件資源而且易于使用,得到了廣泛的應用,特別是在電子競賽、電子藝術(shù)品開(kāi)發(fā)等方面。因此,有必要研究它的應用,拓展其應用范圍。 參考文獻 [1] Josh Adams.Beginning Arduino[M].[S.l.]:Apress,2010. [2] Massimo Banzi.Getting Started with Arduino[M]. [S.l.]:Make, 2008. 楊繼志(高級工程師),主要研究領(lǐng)域為工業(yè)自動(dòng)化控制。 作者:楊繼志 郭敬 來(lái)源:《單片機與嵌入式系統應用》 |