圖1 Arduino單片機(jī)的Proteus仿真 我的Arduino博客:http://www./zhang700309/blog/ 一、前言 Arduino是由Massimo Banzi,David Cuartielles,Tom Igoe,Gianluca Martino,David Mellis 和Nicholas Zambetti共同開(kāi)發(fā)的。據(jù)說(shuō)Auduino開(kāi)發(fā)團(tuán)隊(duì)的領(lǐng)袖Massimo Banzi 之前是意大利Ivrea 一家高科技設(shè)計(jì)學(xué)校的老師。他的學(xué)生們經(jīng)常抱怨找不到便宜好用的微控制器。2005年冬天,Massimo Banzi 跟David Cuartielles 討論了這個(gè)問(wèn)題。David Cuartielles 是一個(gè)西班牙籍芯片工程師,當(dāng)時(shí)在這所學(xué)校做訪(fǎng)問(wèn)學(xué)者。兩人決定設(shè)計(jì)自己的電路板,并引入了Banzi 的學(xué)生David Mellis 為電路板設(shè)計(jì)編程語(yǔ)言。兩天以后,David Mellis 就寫(xiě)出了程式碼。又過(guò)了三天,電路板就完工了。這塊電路板被命名為Arduino。幾乎任何人,即使不懂電腦編程,也能用Arduino 做出很酷的東西,比如對(duì)傳感器作出回應(yīng),閃爍燈光,還能控制馬達(dá)。 圖2 Arduino開(kāi)發(fā)團(tuán)隊(duì)(兩個(gè)意大利人、兩個(gè)美國(guó)人和一個(gè)西班牙人) Arduino 是一款便捷靈活、方便上手的開(kāi)源電子原型平臺(tái),包含硬件(各種型號(hào)的arduino板)和軟件(arduino IDE)。它適用于藝術(shù)家、設(shè)計(jì)師、愛(ài)好者和對(duì)于“互動(dòng)”有興趣的朋友們。 Arduino可以用來(lái)開(kāi)發(fā)交互產(chǎn)品,比如它可以讀取大量的開(kāi)關(guān)和傳感器信號(hào),并且控制各式各樣的電燈、電機(jī)和其它物理設(shè)備,Arduino也可以開(kāi)發(fā)與PC相連的外圍設(shè)備,能在運(yùn)行時(shí)與PC上的軟件(比如Flash, Processing, MaxMSP)進(jìn)行通信。 Arduino硬件電路板可以根據(jù)共享圖紙,自行焊接組裝,也可以購(gòu)買(mǎi)已經(jīng)組裝好的,軟件則可以從Arduino網(wǎng)站免費(fèi)下載使用。 Arduino 1.0最新版下載地址:http:///en/Main/Software。 圖3 Arduino軟硬件原型開(kāi)發(fā)平臺(tái) Arduino為啥這么紅,我想Arduino單片機(jī)較其他微控制器有以下5點(diǎn)優(yōu)勢(shì):1、您學(xué)習(xí)Arduino單片機(jī)可以完全不需要了解其內(nèi)部硬件結(jié)構(gòu)和寄存器設(shè)置,僅僅知道它的端口作用即可;所以不需要硬件知識(shí),只要會(huì)C語(yǔ)言,就可立即為Arduino單片機(jī)編程。2、Arduino軟件語(yǔ)言為精簡(jiǎn)指令系統(tǒng),所需掌握的指令不多,但指令的功能卻很強(qiáng)大,往往一條指令就可以完成一整套操作,而且指令的可讀性也好,屬于低門(mén)檻的語(yǔ)言,輕松上手,快速應(yīng)用。3、針對(duì)周邊I/O設(shè)備的Arduino編程,由于很多I/O設(shè)備都隨之帶有庫(kù)文件或者樣例程序,所以在自己的程序中,可以引用庫(kù)文件中的函數(shù),或復(fù)制樣例程序,然后修改下其中的參數(shù),即可迅速編寫(xiě)出大段大段的復(fù)雜程序,從而放大了您的編程能力。4、Arduino開(kāi)源硬件在創(chuàng)客界十分流行。所謂開(kāi)源產(chǎn)品定義,不僅是其軟硬件底層信息完全公開(kāi),而且還在于產(chǎn)品的應(yīng)用資訊可以從Arduino相關(guān)網(wǎng)站、博客里的大量共享資源里獲得,所以在共享資訊的輔助下,能激發(fā)出您創(chuàng)意作品的靈感,并加快您創(chuàng)作作品的效率。5、國(guó)內(nèi)在開(kāi)源硬件的制造能力非常強(qiáng),涌現(xiàn)出被意大利Arduino公司認(rèn)可的代理商,如DFRobot、Seeed Studio公司,這些公司提供了豐富的質(zhì)優(yōu)、價(jià)廉Arduino及周邊產(chǎn)品,所以在國(guó)內(nèi)學(xué)習(xí)和應(yīng)用Arduino具有得天獨(dú)厚的硬件資源優(yōu)勢(shì)。 但是如果是初學(xué)者,想先不花錢(qián)買(mǎi)硬件設(shè)備,那么是否也能體驗(yàn)下Arduino系統(tǒng)呢?通過(guò)仿真的方法是可以的,目前最流行的單片機(jī)仿真軟件當(dāng)屬Proteus了,這篇文章就介紹用Proteus軟件來(lái)仿真Arduino單片機(jī)的應(yīng)用。 Proteus軟件是初學(xué)者入門(mén)的首選軟件,它是英國(guó)Labcenter公司的一款商業(yè)版電路設(shè)計(jì)與仿真軟件。它包括ISIS、ARES等軟件模塊。ARES模塊主要用來(lái)完成PCB的設(shè)計(jì),ISIS模塊用來(lái)完成電路原理圖的布圖與仿真。Proteus的軟件仿真基于VSM技術(shù),它與其他軟件最大的不同也是最大的優(yōu)勢(shì)就在于能仿真大量的單片機(jī)芯片,比如MCS-51系列、PIC系列等等,甚至ARM處理器,以及單片機(jī)外圍I/O電路,比如鍵盤(pán)、LED、LCD等等。
二、Arduino單片機(jī)的Proteus仿真方法 Arduino單片機(jī)的Proteus仿真基本過(guò)程是:軟件在A(yíng)rduino IDE編程軟件里編寫(xiě),硬件在Proteus ISIS軟件模塊里通過(guò)繪制電氣原理圖建立。程序編寫(xiě)完后,選擇Arduino IDE編程界面菜單欄的Tools菜單項(xiàng),再選擇Board→Arduino Duemilanove w/ATmega328,也可以選擇Board→Arduino Uno,然后點(diǎn)擊編譯按鈕,生成Hex文件(二進(jìn)制機(jī)器碼文件)。有了Hex文件,接著轉(zhuǎn)到Proteus電氣原理圖,雙擊原理圖中的型號(hào)為ATMEGA328P 單片機(jī)芯片,出現(xiàn)對(duì)話(huà)框,通過(guò)文件目錄瀏覽的方法確定Hex文件存儲(chǔ)位置,并進(jìn)行一些單片機(jī)芯片工作狀態(tài)參數(shù)的設(shè)置,最后點(diǎn)擊Proteus ISIS軟件界面左下方的播放按鈕,就可以看到Arduino單片機(jī)在Proteus仿真環(huán)境中的運(yùn)行效果了。 圖4 Arduino程序的編譯 圖4中顯示的程序是一個(gè)最簡(jiǎn)單的Arduino單片機(jī)項(xiàng)目實(shí)例,任務(wù)是:連在A(yíng)rduino單片機(jī)數(shù)字端口13上的LED發(fā)光二級(jí)管,讓它不斷閃爍。要想成功仿真這個(gè)項(xiàng)目,有兩點(diǎn)要特別注意,一是Arduino程序的Hex文件生成和位置確定,二是Proteus原理圖中的Atmel328P芯片中Hex文件加載和工作參數(shù)設(shè)置。 圖5 Arduino項(xiàng)目實(shí)例LED閃爍的硬件原理圖 Arduino編譯之后,Hex文件會(huì)自動(dòng)刪除,而在Proteus仿真的Arduino單片機(jī)中,需要使用Arduino軟件產(chǎn)生的Hex文件,可是,Arduino 1.0默認(rèn)使用完Hex文件會(huì)自動(dòng)刪除的,所以取不到hex文件,為了取出hex文件,加載到Porteus中的單片機(jī)ATMEGA328P,需要修改如下: 首先要在D盤(pán)建立一個(gè)文件夾,用來(lái)專(zhuān)門(mén)放置Hex文件,文件名可以隨便取名,我命名為Arduino_Hex,然后點(diǎn)擊Arduino軟件界面菜單欄的File->preferences,打開(kāi)對(duì)話(huà)框,如圖6,把Show verbose output during的兩個(gè)參數(shù)項(xiàng)打勾,雙擊preferences.txt文件,找到文件所在位置,再雙擊,用記事本打開(kāi)文件。這時(shí)要點(diǎn)擊Arduino界面preferences對(duì)話(huà)框下方的OK按鈕,接著關(guān)掉Arduino IDE編程界面。最后,在剛才打開(kāi)的preferences文檔的最后一行編輯加入build.path=d:\Arduino_Hex,保存文檔。這樣以后您再編譯Arduino程序,就可以在d:\Arduino_Hex中,看到編譯的Hex目標(biāo)文件了。(所有圖片雙擊,都可以放大!) 圖6 Arduino的Preference參數(shù)設(shè)置 談完了Arduino程序的Hex文件生成和位置確定,再談?wù)劻硪粋€(gè)值得注意的問(wèn)題,Proteus原理圖中Atmel328P芯片的Hex文件加載和工作參數(shù)設(shè)置。 雙擊圖5中的Proteus ISIS電氣原理圖中ATMEGA328P單片機(jī),出現(xiàn)編輯對(duì)話(huà)框,點(diǎn)擊“Program File”參數(shù)項(xiàng)的“文件夾”按鈕,來(lái)確定Hex文件的位置,到d:\Arduino_Hex文件夾中可以找到當(dāng)前程序的Hex文件。上個(gè)程序的Hex文件會(huì)被新編譯的Hex文件“沖掉”,所以您每次仿真項(xiàng)目時(shí),都要編譯一次Arduino程序。 圖7 Proteus中的ATMEGA328P單片機(jī)的Hex文件加載和參數(shù)設(shè)置 確定了Hex文件,還有三個(gè)參數(shù)項(xiàng)要修訂,一是“CLKDIV8(Divide clock by 8)”參數(shù)項(xiàng)修改為“Unprogrammed”;二是“CKSEL Fuses”參數(shù)項(xiàng)修改為“(1111)Ext. Crystal 8.0-MHz”;三是Advanced Properties的Clock Frequency參數(shù)項(xiàng)設(shè)為16Mhz。最后點(diǎn)擊編輯對(duì)話(huà)框的“確定”按鈕,然后就可以仿真了。 網(wǎng)絡(luò)上有一個(gè)Arduino單片機(jī)的Proteus仿真視頻,講解的就是圖5所示LED燈閃爍的項(xiàng)目,可以看看Proteus電氣原理圖是如何建立,Arduino程序是如何編寫(xiě),以及程序編譯后是如何仿真的過(guò)程。只不過(guò)這個(gè)視頻中,Arduino程序編譯后的Hex文件,并沒(méi)有在自己指定的文件目錄里找到,而是還是用老辦法在默認(rèn)目錄里找到。
三、Arduino單片機(jī)的Proteus仿真項(xiàng)目實(shí)例 這個(gè)仿真項(xiàng)目實(shí)例的任務(wù)是:分別按下K1(正轉(zhuǎn))按鈕、K2(反轉(zhuǎn))按鈕和K3(停止)按鈕,直流電機(jī)會(huì)分別產(chǎn)生相應(yīng)的動(dòng)作,而且當(dāng)調(diào)節(jié)電位計(jì)時(shí),電機(jī)的轉(zhuǎn)速也隨之發(fā)生變化。(所有圖片雙擊,都可以放大!) 圖8 直流電機(jī)正反轉(zhuǎn)、啟停和調(diào)速仿真圖 圖8中的電氣符號(hào)用到了芯片元件、電源終端、虛擬儀器和連線(xiàn)標(biāo)號(hào),它們分別從各自的模式庫(kù)中提取出來(lái)。 圖9 仿真圖中的電氣符號(hào)的提取 仿真圖中,電源終端用到了VCC電源與接地符號(hào),虛擬儀器用到了四通道示波器和直流電壓表,連線(xiàn)標(biāo)號(hào)的作用是相同連線(xiàn)標(biāo)號(hào)的兩根線(xiàn)在電氣意義上是相連的,如圖8中的標(biāo)號(hào)A、B和PWM。至于芯片元件,仿真圖里用到了電阻、電容、CPU、晶振、直流電機(jī)、穩(wěn)壓管、L298N驅(qū)動(dòng)等等,芯片元件的提取通常有兩種方法,父、子類(lèi)別檢索方法和關(guān)鍵字查詢(xún)法。 父、子類(lèi)別檢索方法是:先選擇元件模式庫(kù),再點(diǎn)擊“P”按鈕,打開(kāi)元件查詢(xún)提取對(duì)話(huà)框,如圖10所示,例如提取的元件是單片機(jī)芯片ATMEGA328P,先在類(lèi)別里找到Microprocessor ICs,在子類(lèi)別里找到AVR Family,再在制造商里找到Atmel,然后在縮小了尋找范圍的結(jié)果中找到這個(gè)單片機(jī)芯片ATMEGA328P,找到后雙擊芯片,就可以把芯片提取到ISIS界面左側(cè)的DEVICES欄中,供原理圖繪制時(shí)隨時(shí)選用,如圖11所示。 圖10 芯片元件的父、子類(lèi)別檢索法 關(guān)鍵字查詢(xún)法是:如果事先知道要提取的元件名稱(chēng),可以在元件查詢(xún)提取對(duì)話(huà)框左上方的關(guān)鍵字輸入欄里輸入元件名稱(chēng),如搜尋motor元件,直接輸入motor,回車(chē)后,在結(jié)果中可以很容易地找到所需元件。 圖11 芯片元件的關(guān)鍵字查詢(xún)法 按照?qǐng)D8所示的直流電機(jī)控制電氣原理圖,把硬件線(xiàn)路繪制完成,剩下的事就是編寫(xiě)程序,編譯仿真了,我設(shè)計(jì)的這個(gè)仿真項(xiàng)目正好把數(shù)字量和模擬量輸入輸出都涉及到了,按鈕輸入和驅(qū)動(dòng)芯片L298N的電機(jī)轉(zhuǎn)向控制端A、B是數(shù)字量輸入輸出,電位計(jì)輸入和L298N的轉(zhuǎn)速調(diào)節(jié)控制端PWM是模擬量輸入輸出。 數(shù)字量輸入輸出的Arduino命令分別是digitalRead(數(shù)字端口號(hào))和digitalWrite(數(shù)字端口號(hào),LOW或HIGH);模擬量輸入輸出的Arduino命令是analogRead(模擬端口號(hào))和analogWrite(數(shù)字端口號(hào), 0~255)。模擬端口只有輸入模式,沒(méi)有輸出模式,Arduino模擬量輸出是以PWM信號(hào)形式從具有PWM輸出功能的數(shù)字端口輸出的。Arduino微控制器的數(shù)字端口和模擬端口與ATMEGA 328芯片引腳的對(duì)應(yīng)關(guān)系圖如下。標(biāo)有0~13標(biāo)號(hào)的引腳對(duì)應(yīng)的是數(shù)字端口,在0~13前面有符號(hào)“~”的引腳對(duì)應(yīng)的端口具有PWM輸出功能。標(biāo)有A0~A5標(biāo)號(hào)的是模擬端口。 圖12 Arduino UNO端口與Atmega328P引腳對(duì)應(yīng)圖 有了Arduino UNO端口與Atmega328P引腳對(duì)應(yīng)圖,就可以方便地利用Proteus硬件仿真圖,有針對(duì)性地編寫(xiě)Arduino程序了。由于以下程序中有詳細(xì)的注釋?zhuān)詫?duì)每行Arduino程序的作用就不再累述了。 Arduino程序:
//任務(wù):通過(guò)按鈕控制電機(jī)啟停和正反轉(zhuǎn),通過(guò)電位計(jì)調(diào)節(jié)電機(jī)轉(zhuǎn)速。 int K1=5; //把K1(正轉(zhuǎn))按鈕連在數(shù)字端口5
int K2=6; //把K2(反轉(zhuǎn))按鈕連在數(shù)字端口6
int K3=7; //把K3(停止)按鈕連在數(shù)字端口7
int potpin = 3; // 把電位計(jì)連在模擬端口3
int A=2; //數(shù)字端口2、3控制電機(jī)啟停和轉(zhuǎn)向
int B=3;
int PWMpin = 9; // 數(shù)字端口9輸出PWM信號(hào),控制電機(jī)轉(zhuǎn)速
//初始化
void setup()
{
pinMode(K1,INPUT);//把數(shù)字端口5、6、7設(shè)置輸入模式
pinMode(K2,INPUT);
pinMode(K2,INPUT);
pinMode(A,OUTPUT);//把數(shù)字端口2、3設(shè)置輸入模式
pinMode(B,OUTPUT);
}
//主程序
void loop()
{
//如果按下K1(正轉(zhuǎn))按鈕
if(digitalRead(K1)==LOW)
{
//電機(jī)正轉(zhuǎn)
digitalWrite(A,HIGH);
digitalWrite(B,LOW);
}
//如果按下K2(反轉(zhuǎn))按鈕
if(digitalRead(K2)==LOW)
{
//電機(jī)反轉(zhuǎn)
digitalWrite(A,LOW);
digitalWrite(B,HIGH);
}
//如果按下K3(停止)按鈕
if(digitalRead(K3)==LOW)
{
//電機(jī)停止
digitalWrite(A,LOW);
digitalWrite(B,LOW);
}
int sensorValue = analogRead(potpin); //讀取電位計(jì)采樣值
sensorValue = sensorValue/4; // 采樣值 0-1024 轉(zhuǎn)換為 0-255
analogWrite(PWMpin, sensorValue);//把處理后的轉(zhuǎn)換值以PWM信號(hào)形式輸出
delay(20);//延時(shí)
}
Arduino程序及Proteus仿真圖請(qǐng)下載:Arduino仿真之直流電機(jī)控制.zip
把程序編寫(xiě)完,編譯Hex文件,再把Hex文件加載到Proteus仿真圖中Arduino單片機(jī)芯片中,最后點(diǎn)擊仿真圖左下方的播放按鈕,就可以看到基于A(yíng)rduino直流電機(jī)控制項(xiàng)目的運(yùn)行效果了。
四、結(jié)束語(yǔ) 經(jīng)常有對(duì)創(chuàng)客文化感興趣的網(wǎng)友,詢(xún)問(wèn)這樣的問(wèn)題,是否可以少投入些硬件成本,而又能用Arduino單片機(jī)多多做些趣味電子項(xiàng)目。所以這篇文章就是談在資金不足的情況下,如何通過(guò)仿真的方法來(lái)實(shí)現(xiàn)我們創(chuàng)意實(shí)踐。 為啥有必要學(xué)習(xí)Arduino呢?其實(shí)許多學(xué)習(xí)者曾經(jīng)為了追趕電子科技的進(jìn)步,也花了大量的精力去一個(gè)個(gè)地學(xué)習(xí)那些微控制器和智能邏輯部件,如51、ARM,DSP和FPGA,當(dāng)初僅僅是為做一些應(yīng)用,沒(méi)想會(huì)消耗那么多的時(shí)間和金錢(qián),“陷在”了冷酷的程序和無(wú)止盡的硬件原理中,最后也只是做了些走馬燈和數(shù)碼管秒表實(shí)驗(yàn),就草草結(jié)束,而又去追新了。這樣追逐哪有什么利用微控制器做應(yīng)用的樂(lè)趣可談。好在目前秉承開(kāi)放式學(xué)習(xí)架構(gòu)的Arduino系統(tǒng)越來(lái)越流行,它可以讓所有樂(lè)于創(chuàng)作的人在短時(shí)間之內(nèi)就可以完成一個(gè)作品,并且可以透過(guò)網(wǎng)絡(luò),獲得大量共享資訊的支援。您會(huì)發(fā)現(xiàn),有了Arduino,微控制器的世界不再那么的陌生和令人敬畏,微控制器就是一個(gè)易用的工具,讓我們能夠騰出精力全力投向作品中最能體現(xiàn)個(gè)人創(chuàng)新精神的部分。
|
|
來(lái)自: zgclib > 《軟件應(yīng)用》