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