Arduino教程及簡明例程_第1頁
Arduino教程及簡明例程_第2頁
Arduino教程及簡明例程_第3頁
Arduino教程及簡明例程_第4頁
Arduino教程及簡明例程_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

PAGEPAGE27\o"ViewallpostsinArduino"Arduino,\o"Viewallpostsin教程"教程\o"CommentonArduino教程一:數(shù)字輸出"11Comments?Arduino的數(shù)字I/O被分成兩個部分,其中每個部分都包含有6個可用的I/O管腳,即管腳2到管腳7和管腳8到管腳13。除了管腳13上接了一個1K的電阻之外,其他各個管腳都直接連接到ATmega上。我們可以利用一個6位的數(shù)字跑馬燈,來對Arduino數(shù)字I/O的輸出功能進(jìn)行驗(yàn)證,以下是相應(yīng)的原理圖:電路中在每個I/O管腳上加的那個1K電阻被稱為限流電阻,由于發(fā)光二極管在電路中沒有等效電阻值,使用限流電阻可以使元件上通過的電流不至于過大,能夠起到保護(hù)的作用。該工程對應(yīng)的代碼為:intBASE=2;intNUM=6;intindex=0;voidsetup(){for(inti=BASE;i<BASE+NUM;i++){pinMode(i,OUTPUT);}}voidloop(){for(inti=BASE;i<BASE+NUM;i++){digitalWrite(i,LOW);}digitalWrite(BASE+index,HIGH);index=(index+1)%NUM;delay(100);}下載并運(yùn)行該工程,連接在Arduino數(shù)字I/O管腳2到管腳7上的發(fā)光二極管會依次點(diǎn)亮0.1秒,然后再熄滅:這個實(shí)驗(yàn)可以用來驗(yàn)證數(shù)字I/O輸出的正確性。Arduino上一共有十二個數(shù)字I/O管腳,我們可以用同樣的辦法驗(yàn)證其他六個管腳的正確性,而這只需要對上述工程的第一行做相應(yīng)的修改就可以了:intBASE=8;Sep01\o"ViewallpostsinArduino"Arduino,\o"Viewallpostsin教程"教程\o"CommentonArduino教程二:數(shù)字輸入"3Comments?

在數(shù)字電路中開關(guān)(switch)是一種基本的輸入形式,它的作用是保持電路的連接或者斷開。Arduino從數(shù)字I/O管腳上只能讀出高電平(5V)或者低電平(0V),因此我們首先面臨到的一個問題就是如何將開關(guān)的開/斷狀態(tài)轉(zhuǎn)變成Arduino能夠讀取的高/低電平。解決的辦法是通過上/下拉電阻,按照電路的不同通常又可以分為正邏輯(PositiveLogic)和負(fù)邏輯(InvertedLogic)兩種。在正邏輯電路中,開關(guān)一端接電源,另一端則通過一個10K的下拉電阻接地,輸入信號從開關(guān)和電阻間引出。當(dāng)開關(guān)斷開的時候,輸入信號被電阻“拉”向地,形成低電平(0V);當(dāng)開關(guān)接通的時候,輸入信號直接與電源相連,形成高電平。對于經(jīng)常用到的按壓式開關(guān)來講,就是按下為高,抬起為低。在負(fù)邏輯電路中,開關(guān)一端接地,另一端則通過一個10K的上拉電阻接電源,輸入信號同樣也是從開關(guān)和電阻間引出。當(dāng)開關(guān)斷開時,輸入信號被電阻“拉”向電源,形成高電平(5V);當(dāng)開關(guān)接通的時候,輸入信號直接與地相連,形成低電平。對于經(jīng)常用到的按壓式開關(guān)來講,就是按下為低,抬起為高。為了驗(yàn)證Arduino數(shù)字I/O的輸入功能,我們可以將開關(guān)接在Arduino的任意一個數(shù)字I/O管腳上(13除外),并通過讀取它的接通或者斷開狀態(tài),來控制其它數(shù)字I/O管腳的高低。本實(shí)驗(yàn)采用的原理圖如下所示,其中開關(guān)接在數(shù)字I/O的7號管腳上,被控的發(fā)光二極管接在數(shù)字I/O的13號管腳上:\o"ViewallpostsinArduino"Arduino,\o"Viewallpostsin教程"教程\o"CommentonArduino教程三:模擬輸入"5Comments?Arduino的優(yōu)勢在于對數(shù)字信號的識別和處理,但我們所生活的真實(shí)世界并不是數(shù)字(digital)化的,簡單到只要用0和1就能夠表示所有的現(xiàn)象。例如溫度這一我們已經(jīng)司空見慣的概念,它只能在一個范圍之內(nèi)連續(xù)變化,而不可能發(fā)生像從0到1這樣的瞬時跳變,類似這樣的物理量被人們稱為是模擬(analog)的。Arduino是無法理解這些模擬量的,它們必須在經(jīng)過模數(shù)轉(zhuǎn)換后變成數(shù)字量后,才能被Arduino進(jìn)一步處理。像溫度這樣的數(shù)據(jù)必須先被轉(zhuǎn)換成微處理器能夠處理的形式(比如電壓),才能被Arduino處理,這一任務(wù)通常由各類傳感器(sensor)來完成的。例如,電路中的溫度傳感器能夠?qū)囟戎缔D(zhuǎn)換成0V到5V間的某個電壓,比如0.3V、3.27V、4.99V等。由于傳感器表達(dá)的是模擬信號,它不會像數(shù)字信號那樣只有簡單的高電平和低電平,而有可能是在這兩者之間的任何一個數(shù)值。至于到底有多少可能的值則取決于模數(shù)轉(zhuǎn)換的精度,精度越高能夠得到的值就會越多。Arduino所采用的ATmega8微處理器一其有6個模數(shù)轉(zhuǎn)換器(ADC,AnalogtoDigitalConverter),每一個模數(shù)轉(zhuǎn)換器的精度都是10bit,也就是說能夠讀取1024(2^10=1024)個狀態(tài)。在Arduino的每一個模擬輸入管腳上,電壓的變化范疇是從0V到5V,因此Arduino能夠感知到的最小電壓變化是4.8毫伏(5/1024=4.8mV)。電位計(jì)(potentiometer)是一種最簡單的模擬輸入設(shè)備,它實(shí)際上就是一個可變電阻箱,通過控制滑塊所在的位置我們可以得到不同的電壓值,而輸入信號正是從滑塊所在的位置接入到電路中的。這一實(shí)驗(yàn)我們將通過改變電位計(jì)的值來控制發(fā)光二極管閃爍的頻率。電位計(jì)上一共有三個管腳,分別連接到Arduino的電源、地和模擬輸入的5號管腳上,發(fā)光二極管則連接到數(shù)字I/O的13號管腳上,原理圖如下所示:相應(yīng)的代碼為:intledPin=13;intpotPin=5;intvalue=0;voidsetup(){pinMode(ledPin,OUTPUT);}voidloop(){value=analogRead(potPin);digitalWrite(ledPin,HIGH);delay(value);digitalWrite(ledPin,LOW);delay(value);}在Arduino中,對模擬輸入端口不需要調(diào)用pinMode()函數(shù)將其指定為輸入或者是輸出模式,這點(diǎn)同數(shù)字I/O端口是有所不同的。通過旋轉(zhuǎn)電位計(jì)的軸,我們能改變電位計(jì)中間那根連線同地之間的電阻量,從而也就能改變從模擬輸入的5號管腳上所讀入的模擬量的值。當(dāng)電位計(jì)完全旋轉(zhuǎn)到頭時,輸入到模擬輸入管腳上的電壓為0V,用analogRead()函數(shù)讀出的值為0;當(dāng)電位計(jì)完全旋轉(zhuǎn)到另一頭時,輸入到模擬I/O管腳上的電壓為5V,此時用analogRead()函數(shù)讀出的值為1023;當(dāng)電位計(jì)旋轉(zhuǎn)到中間的某個位置時,輸入到模擬輸入管腳上的電壓是0V到5V之間的某個值,而用analogRead()函數(shù)讀出的則是位于0到1023之間的某個對應(yīng)值。讀出的模擬量在我們的實(shí)驗(yàn)中被用來確定發(fā)光二極管點(diǎn)亮和熄滅的時間,以反映模擬量的變化。電位計(jì)運(yùn)用的是分壓原理,通過旋轉(zhuǎn)到不同的位置來得到不同的電壓值。從這種意義上講,它能夠被用來對當(dāng)前旋轉(zhuǎn)到的位置進(jìn)行度量,因此可以被用在轉(zhuǎn)向輪等旋轉(zhuǎn)裝置中。今天發(fā)現(xiàn)PCB板上另外一個錯誤,就是將模擬輸入對應(yīng)管腳號標(biāo)反了,試了好久才意識到是這一問題。加上之前電源設(shè)計(jì)上的兩個小缺陷,一共有三個需要修改的地方。如果有機(jī)會再做PCB板的話,試著將這些問題解決一下:-)相應(yīng)的代碼為:intledPin=13;intswitchPin=7;intvalue=0;voidsetup(){pinMode(ledPin,OUTPUT);pinMode(switchPin,INPUT);}voidloop(){value=digitalRead(switchPin);if(HIGH==value){//turnLEDoffdigitalWrite(ledPin,LOW);}else{//turnLEDondigitalWrite(ledPin,HIGH);}}由于采用的是負(fù)邏輯電路,開關(guān)按下時用digitalRead()函數(shù)讀取到的值為LOW,此時再用digitalWrite()函數(shù)將發(fā)光二極管所在的管腳置為高,點(diǎn)亮發(fā)光二極管。同理,當(dāng)開關(guān)抬起時,發(fā)光二極管將被熄滅,這樣我們就實(shí)現(xiàn)了用開關(guān)來控制發(fā)光二極管的功能。\o"ViewallpostsinArduino"Arduino,\o"Viewallpostsin教程"教程\o"CommentonArduino教程四:模擬輸出"2Comments?就像模擬輸入一樣,在現(xiàn)實(shí)的物理世界中我們經(jīng)常需要輸出除了0和1之外的其他數(shù)值。例如,除了想用微控制器找開或者關(guān)閉電燈之外,我們還會想控制燈光的亮度,這時就需要用到模擬輸出。由于Arduino的微控制器只能產(chǎn)生高電壓(5V)或者低電壓(0V),而不能產(chǎn)生變化的電壓,因此必須采用脈寬度調(diào)制技術(shù)(PWM,PulseWidthModulation)來模仿模擬電壓。PWM是一種開關(guān)式穩(wěn)壓電源應(yīng)用,它是借助微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常用效的技術(shù),廣泛應(yīng)用在從測量、通信到功率控制與變換的許多領(lǐng)域中。簡而言之,PWM是一種對模擬信號電平進(jìn)行數(shù)字編碼的方法,它通過對半導(dǎo)體開關(guān)器件的導(dǎo)通和關(guān)斷進(jìn)行控制,使輸出端得到一系列幅值相等但寬度不相等的脈沖,而這些脈沖能夠被用來代替正弦波或其它所需要的波形。在Arduino數(shù)字I/O管腳9、10和11上,我們可以通過analogWrite()函數(shù)來產(chǎn)生模擬輸出。該函數(shù)有兩個參數(shù),其中第一個參數(shù)是要產(chǎn)生模擬信號的引腳(9、10或者11);第二個參數(shù)是用于產(chǎn)生模擬信號的脈沖寬度,取值范圍是0到255。脈沖寬度的值取0可以產(chǎn)生0V的模擬電壓,取255則可以產(chǎn)生5V的模擬電壓。不難看出,脈沖寬度的取值變化1,產(chǎn)生的模擬電壓將變化0.0196V(5/255=0.0196)。本實(shí)驗(yàn)中我們將用模擬輸出來調(diào)暗發(fā)光二極管(LED),由于正常情況下LED對電壓的變化非常敏感,因此當(dāng)脈沖寬度變化時人眼會感覺到LED實(shí)際上是在不斷地熄滅和點(diǎn)亮,而不是逐漸變暗。解決這一問題可以采用濾波電路,它能使有用頻率信號通過而同時抑制(或大大衰減)無用頻率信號。實(shí)驗(yàn)中我們采用的是低通濾波器,它的原理非常簡單,只需要一個電阻和一個電容,能夠很好地過濾掉電路中超過某一頻率的信號。此處給出的電路并不能校平所有脈沖,它之所以被稱為“低通濾波”是因?yàn)樗辉试S頻率低于某個限度的脈沖通過,對于高于這個限度的脈沖則被平衡為偽模擬電壓,濾波的頻率范圍由電阻器和電容器的比值決定。實(shí)驗(yàn)中采用的電路原理如下:相應(yīng)的代碼為:intpotPin=0;intledPin=11;bytebright_table[]={30,30,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180,190,200,210,220,230,240,250,250,240,230,220,210,200,190,180,170,160,150,140,130,120,110,100,90,80,70,60,50,40,30,30,30};intMAX=50;intcount=0;intval=0;voidsetup(){pinMode(ledPin,OUTPUT);}voidloop(){analogWrite(ledPin,bright_table[count]);count++;if(count>MAX){count=0;}val=analogRead(potPin);val=val/4;delay(val);}該工程調(diào)用analogWrite()函數(shù)在數(shù)字I/O端口的11號管腳上模仿模擬輸出,每產(chǎn)生一次輸出后都設(shè)置了相應(yīng)的延時,而延時的長度由模擬輸入端口0號管腳上的電位器來決定。通過調(diào)整電位器的位置,我們可以觀察到發(fā)光二極管逐漸變亮后再逐漸變暗的效果。\o"ViewallpostsinArduino"Arduino,\o"Viewallpostsin教程"教程\o"CommentonArduino教程五:串口輸出"NoComments?在許多實(shí)際應(yīng)用場合中我們會要求在Arduino和其它設(shè)備之間實(shí)現(xiàn)相互通信,而最常見通常也是最簡單的辦法就是使用串行通信。在串行通信中,兩個設(shè)備之間一個接一個地來回發(fā)送數(shù)字脈沖,它們之間必須嚴(yán)格遵循相應(yīng)的協(xié)議以保證通信的正確性。在PC機(jī)上上最常見的串行通信協(xié)議是RS-232串行協(xié)議,而在各種微控制器(單片機(jī))上采用的則是TTL串行協(xié)議。由于這兩者的電平有很大的不同,因此在實(shí)現(xiàn)PC機(jī)和微控制器的通信時,必須進(jìn)行相應(yīng)的轉(zhuǎn)換。完成RS-232電平和TTL電平之間的轉(zhuǎn)換一般采用專用芯片,如MAX232等,但在Arduino上是用相應(yīng)的電平轉(zhuǎn)換電路來完成的。根據(jù)Arduino的原理圖我們不難看出,ATmega的RX和TX引腳一方面直接接到了數(shù)字I/O端口的0號和1號管腳,另一方面又通過電平轉(zhuǎn)換電路接到了串口的母頭上。因此,當(dāng)我們需要用Arduino與PC機(jī)通信時,可以用串口線將兩者連接起來;當(dāng)我們需要用Arduino與微控制器(如另一塊Arduino)通信時,則可以用數(shù)字I/O端口的0號和1號管腳。串行通信的難點(diǎn)在于參數(shù)的設(shè)置,如波特率、數(shù)據(jù)位、停止位等,在Arduino語言可以使用Serial.begin()函數(shù)來簡化這一任務(wù)。為了實(shí)現(xiàn)數(shù)據(jù)的發(fā)送,Arduino則提供了Serial.print()和Serial.println()兩個函數(shù),它們的區(qū)別在于后者會在請求發(fā)送的數(shù)據(jù)后面加上換行符,以提高輸出結(jié)果的可讀性。在這一實(shí)驗(yàn)中沒有用到額外的電路,我們只需要用串口線將Arduino和PC機(jī)連起來就可以了,相應(yīng)的代碼為:voidsetup(){Serial.begin(9600);}voidloop(){Serial.println("HelloWorld!");delay(1000);}在將工程下載到Arduino模塊中之后,在Arduino集成開發(fā)環(huán)境的工具欄中單擊“SerialMonitor”控制,打開串口監(jiān)視器:接著將波特率設(shè)置為9600,即保持與工程中的設(shè)置相一致:如果一切正常,此時我們就可以在Arduino集成開發(fā)環(huán)境的Console窗口中看到串口上輸出的數(shù)據(jù)了:為了檢查串口上是否有數(shù)據(jù)發(fā)送,一個比較簡單的辦法是在數(shù)字I/O端口的1號管腳(TX)和5V電源之間接一個發(fā)光二極管,如下面的原理圖所示:這樣一旦Arduino在通過串口向PC機(jī)發(fā)送數(shù)據(jù)時,相應(yīng)的發(fā)光二極管就會閃爍,實(shí)際應(yīng)用中這是一個非常方便的調(diào)試手段;-)\o"ViewallpostsinArduino"Arduino,\o"Viewallpostsin教程"教程\o"CommentonArduino教程六:串口輸入"1Comment?串行通信是在實(shí)現(xiàn)在PC機(jī)與微控制器進(jìn)行交互的最簡單的辦法。之前的PC機(jī)上一般都配有標(biāo)準(zhǔn)的RS-232或者RS-422接口來實(shí)現(xiàn)串行通信,但現(xiàn)在這種情況已經(jīng)發(fā)生了一些改變,大家更傾向于使用USB這樣一種更快速但同時也更加復(fù)雜的方式來實(shí)現(xiàn)串行通信。盡管在有些計(jì)算機(jī)上現(xiàn)在已經(jīng)找不到RS-232或者RS-422接口了,但我們?nèi)钥梢酝ㄟ^USB/串口或者PCMCIA/串口這樣的轉(zhuǎn)換器,在這些設(shè)備上得到傳統(tǒng)的串口。通過串口連接的Arduino在交互式設(shè)計(jì)中能夠?yàn)镻C機(jī)提供一種全新的交互方式,比如用PC機(jī)控制一些之前看來非常復(fù)雜的事情,像聲音和視頻等。很多場合中都要求Arduino能夠通過串口接收來自于PC機(jī)的命令,并完成相應(yīng)的功能,這可以通過Arduino語言中提供的Serial.read()函數(shù)來實(shí)現(xiàn)。在這一實(shí)驗(yàn)中我們同樣不需要任何額外的電路,而只需要用串口線將Arduino和PC機(jī)連起來就可以了,相應(yīng)的Arduino工程代碼為:intledPin=13;intval;voidsetup(){pinMode(ledPin,OUTPUT);Serial.begin(9600);}voidloop(){val=Serial.read();if(-1!=val){if('H'==val){digitalWrite(ledPin,HIGH);delay(500);digitalWrite(ledPin,LOW);}}}把工程下載到Arduino模塊中之后,在Arduino集成開發(fā)環(huán)境中打開串口監(jiān)視器并將波特率設(shè)置為9600,然后向Arduino模塊發(fā)送字符H,如下圖所示:該工程運(yùn)行起來之后會不斷調(diào)用Serial.read()函數(shù)從串口獲得數(shù)據(jù)。Arduino語言提供的這個函數(shù)是不阻塞的,也就是說不論串口上是否真的有數(shù)據(jù)到達(dá),該函數(shù)都會立即返回。Serial.read()函數(shù)每次只讀取一個字節(jié)的數(shù)據(jù),當(dāng)串口上有數(shù)據(jù)到達(dá)的時候,該函數(shù)的返回值為到達(dá)的數(shù)據(jù)中第一個字符的ASCII碼;當(dāng)串口上沒有數(shù)據(jù)到達(dá)的時候,該函數(shù)的返回值則為-1。Arduino語言的參考手冊中沒有對Serial.read()函數(shù)做過多的說明,我的一個疑問是如果PC機(jī)一次發(fā)送的數(shù)據(jù)太多,Arduino是否提供相應(yīng)的串口緩存功能來保證數(shù)據(jù)不會丟失?Arduino語言中提供的另外一個函數(shù)Serial.available()或許能夠幫助我們用實(shí)驗(yàn)來進(jìn)行驗(yàn)證:intledPin=13;intval;voidsetup(){pinMode(ledPin,OUTPUT);Serial.begin(9600);}voidloop(){val=Serial.read();if(-1!=val){if('H'==val){digitalWrite(ledPin,HIGH);delay(500);digitalWrite(ledPin,LOW);Serial.print("Available:");Serial.println(Serial.available(),DEC);}}}函數(shù)Serial.available()的功能是返回串口緩沖區(qū)中當(dāng)前剩余的字符個數(shù),按照Arduino提供的該函數(shù)的說明,串口緩沖區(qū)中最多能緩沖128個字節(jié)。我們可以一次給Arduino模塊發(fā)送多個字符,來驗(yàn)證這一功能:在這一實(shí)驗(yàn)中,每當(dāng)Arduino成功收到一個字符H,連接在數(shù)字I/O端口管腳13上的發(fā)光二極管就會閃爍一次:\o"ViewallpostsinArduino"Arduino,\o"Viewallpostsin教程"教程\o"CommentonArduino教程七:XBee無線通信"4Comments?借助XBee擴(kuò)展板我們可以很方便地將XBee模塊連接到Arduino上,XBee模塊的工作原理也非常簡單,它與Arduino之間其實(shí)就是通過串行接口(即Tx和Rx引腳)進(jìn)行通信。對于簡單的點(diǎn)對點(diǎn)通信來講,只需要通過串行接口向XBee模塊寫數(shù)據(jù)就可以實(shí)現(xiàn)數(shù)據(jù)的發(fā)送;當(dāng)XBee模塊通過無線通道接收到數(shù)據(jù)時,通過讀串行接口可以很方便地獲得這些數(shù)據(jù)。原理弄清楚之后,其實(shí)我們可以將XBee模塊看成是Arduino的串口,通過相應(yīng)的串口操作函數(shù)來實(shí)現(xiàn)數(shù)據(jù)的接收和發(fā)送。首先請按照\o"PermanentLinktoArduinoXBee模塊使用手冊"ArduinoXBee模塊使用手冊中的說明配置好你的兩個XBee模塊,然后將相應(yīng)的跳線連接到XBEE一端:這里我們使用一個最簡單的工程來進(jìn)行相應(yīng)的實(shí)驗(yàn):intledPin=13;intval;voidsetup(){pinMode(ledPin,OUTPUT);Serial.begin(9600);}voidloop(){//senddatatoanotherXBeemoduleSerial.print('A');delay(1000);//receivedatafromanotherXBeemoduleval=Serial.read();if(-1!=val){if('A'==val){digitalWrite(ledPin,HIGH);delay(500);digitalWrite(ledPin,LOW);delay(500);}}}該工程首先通過Serial.print()函數(shù)向XBee模塊發(fā)送一個字母A,該字母會被XBee模塊通過無線網(wǎng)絡(luò)發(fā)送出去,并被另外一個XBee模塊接收到。緊接著再通過Serial.read()函數(shù)從XBee模塊讀取從無線網(wǎng)絡(luò)接收到的數(shù)據(jù),如果是字母A的話,則點(diǎn)亮相應(yīng)的發(fā)光二極管。將該工程編譯并分別下載到兩個Arduino模塊中,注意下載的時候不要連接XBee擴(kuò)展板,這是因?yàn)閄Bee模塊會占用串口,從而導(dǎo)致下載無法正確完成。下載完成后將XBee擴(kuò)展板連接到Arduino上,并分別給兩者上電。這兩個Arduino模塊都會向?qū)Ψ桨l(fā)送字母A,然后從對方接收字母A,并對點(diǎn)亮數(shù)字I/O管腳13上連接的發(fā)光二極管。你可以試著將兩個模塊放在房間里的不同位置,來對XBee模塊的傳輸性能進(jìn)行測試。\o"ViewallpostsinArduino"Arduino,\o"Viewallpostsin基本電路"基本電路,\o"Viewallpostsin教程"教程\o"CommentonArduino電機(jī)驅(qū)動擴(kuò)展板"11Comments?除了使用傳感器對各種外部物理量進(jìn)行感知之外,能夠?qū)?shí)際物體的運(yùn)動進(jìn)行相應(yīng)的控制也是互動設(shè)計(jì)中不可或缺的一部分。在所有這類動力裝置中,電機(jī)顯然是最常見、最基本、最便宜的解決方案了,常用的電機(jī)的種類有很多種,如直流電機(jī),步進(jìn)電機(jī),伺服電機(jī),減速電機(jī)等,并且每一種電機(jī)的控制方法都有所不同。如果你是一個電子高手,控制普通的直流電機(jī)用幾個三極管就行了,否則話像L293這樣的芯片將是一個更好的選擇。L293芯片的核心是兩個H-橋,所有的H-橋芯片都具有如下一些引腳:邏輯輸入邏輯電壓電源電壓電源輸出地其中邏輯電壓引腳采用與微控制器相同的電壓和電流,電源電壓采用與運(yùn)行電機(jī)所需要的電壓和電流。邏輯輸入引腳連接到用來向H-橋輸出控制信號的微控制器上的引腳,而電源輸出引腳則連接到電機(jī)上。這么專業(yè)的術(shù)語翻譯到Arduino上可以這樣來理解。首先,我們需要兩套電源,一套用來給Arduino供電,一套用來給電機(jī)供電。其次,我們需要用到Arduino的數(shù)字I/O管腳來控制L293,并把電機(jī)接到L293上接受控制。說到這里,正好解釋一下Arduino的供電系統(tǒng),通常Arduino有三種供電方式:USB供電電池供電變壓器供電后兩者在Arduino上統(tǒng)稱為外部供電。供電方式的選擇是通過Arduino上的電源選擇跳線來實(shí)現(xiàn)的,當(dāng)把跳線接到“USB”一端時,采用的是USB供電方式,這時整個Arduino及其附屬電路上的電源都由PC的USB接口提供,此時電流一般比較小,只能驅(qū)動功率比較小的電路,如LED等。當(dāng)把跳線接到“EXT”一端時,采用的是外部供電方式,這時一般能夠驅(qū)動比較大的設(shè)備,如電機(jī)等。Arduino內(nèi)部一套電源轉(zhuǎn)換電路,可以用來將外部供電時的電壓(6-12V)轉(zhuǎn)換成內(nèi)部所需要的5V電壓,使用L293控制電機(jī)正是需要這兩套電源。下面這個就是基于L293D芯片的Arduino專用電機(jī)驅(qū)動擴(kuò)展板,它能夠用來驅(qū)動兩個直流電機(jī)。使用該擴(kuò)展板來驅(qū)動直流電機(jī)非常簡單,只需要將擴(kuò)展板插到Arduino上,同時將直流電機(jī)連接到擴(kuò)展板上的motors引腳上就可以了。正如上面所提到的,此時應(yīng)該采用Arduino的外部供電方式,并使用變壓器或者電源為Arduino提供電力。這里我選用的是9V變壓器和9V的直流電機(jī):電機(jī)擴(kuò)展板上motors引腳的上面兩針是用來接電機(jī)1的,下面兩針是用來接電機(jī)2的。電路連接好之后,剩下的工作就是如何用程序進(jìn)行控制了。使用這一擴(kuò)展板我們能夠控制直流電機(jī)的轉(zhuǎn)動方向和轉(zhuǎn)動速度,其中對轉(zhuǎn)動方向的控制是通過Arduino上的數(shù)字I/O引腳12和13來實(shí)現(xiàn)的,對轉(zhuǎn)速的控制則是通過數(shù)字I/O引腳9和10來實(shí)現(xiàn)的。如果要控制直流電機(jī)1,我們需要向引腳9輸出相應(yīng)的PWM信號來控制電機(jī)的速度,同時設(shè)置引腳12和13的高低電壓來控制電機(jī)的方向。如果要控制直流電機(jī)2,則需要向引腳10輸出相應(yīng)的PWM信號來控制電機(jī)的速度,此時也是通過設(shè)置引腳12和13的高低電壓來控制電機(jī)的方向的。電機(jī)擴(kuò)展板上帶有S1和S2兩個按鈕,分別對應(yīng)于Arduino數(shù)字I/O的7號和6號管腳,并且在按下時為低電平。因此我們可以像下面的程序這樣利用S1來控制電機(jī)1的正反轉(zhuǎn):intswitchPin=7;//switchpinintdir1Pin=12;//direction1intdir2Pin=13;//direction2intspeedPin=9;//sppedpinvoidsetup(){pinMode(switchPin,INPUT);pinMode(dir1Pin,OUTPUT);pinMode(dir2Pin,OUTPUT);pinMode(speedPin,OUTPUT);}voidloop(){//switchispressedif(digitalRead(switchPin)==LOW){//setsppedanalogWrite(speedPin,250);//setdirectiondigitalWrite(dir1Pin,LOW);digitalWrite(dir2Pin,HIGH);}else{analogWrite(speedPin,100);digitalWrite(dir1Pin,HIGH);digitalWrite(dir2Pin,LOW);}}在將上述程序下載到Arduino上并運(yùn)行起來之后,我們就可以通過按S1鍵,來改變電機(jī)的旋轉(zhuǎn)速度和方向了:)P.S.在調(diào)試這一電機(jī)擴(kuò)展板的奇遇是,在將其插入到ArduinoDiecimila的貼片版本上時,發(fā)現(xiàn)MC33269異常熱,并且電機(jī)偶爾才能工作。進(jìn)一步設(shè)計(jì)發(fā)現(xiàn)如果把整個擴(kuò)展板很好地插入到Arduino上時,5V和Gnd之間居然是短路的。一開始并沒有發(fā)現(xiàn)問題在哪,后來才發(fā)現(xiàn)擴(kuò)展板上的電容C9與USB接頭的外殼短路了!將其錫去掉一下,并抬高擴(kuò)展板時問題得到解決。實(shí)際使用時請檢查下圖電容下面的引腳是否與USB接口的外殼短路了,特別是對于貼片版本來講,最好在通電前用萬用表檢查一下5V和Gnd之間的電阻值:)\o"ViewallpostsinArduino"Arduino,\o"ViewallpostsinDIY"DIY,\o"Viewallpostsin手冊"手冊\o"CommentonArduino下載線使用手冊"3Comments?Arduino使用的是Atmel公司的AVR單片機(jī),一般為ATmega8和ATmega168,這一系列的單片機(jī)都支持ISP(InSystemProgrammability)編程,無需依賴昂貴的編程器就可以完成程序的下載。Arduino電路在設(shè)計(jì)上考慮到了ISP功能,也留出了相應(yīng)的接口(ICSP),從而允許我們通過ISP下載線來完成bootloader的下載。新買來的Arduino模塊上一般都已經(jīng)預(yù)先下載好了bootloader,因此上電之后就能夠直接通過Arduino集成開發(fā)環(huán)境下載相應(yīng)的Arduino程序。正常情況下我們在用Arduino時是不需要ISP下載線的,但在某些情況下可能會出現(xiàn)在Arduino集成開發(fā)環(huán)境中無法正常下載程序的現(xiàn)象,這很可能是由于bootloader受損所致。解決的辦法就是重新將bootloader燒寫到ATmega芯片中,此時你就需要用到這里介紹的ISP下載線了。Arduio網(wǎng)站上給出的并口下載線電路我只成功地更新過ATmega8的bootloader,而無法為Diecimila上的ATmega168下載bootloader。此外,Arduino給出的這一下載線電路過于簡單,沒有做相應(yīng)的隔離和保護(hù),經(jīng)常使用可能會對Atmega芯片帶來一定的損害。AVR建議使用一片74HC244來隔離并口和ATmega芯片,下面是我所使用的下載線的原理圖:以及自制的下載線:使用并口下載線的時候,我們需要先到計(jì)算機(jī)的BIOS中將并口設(shè)為ECP(Theextendedcapabilitiesport)模式,同時將I/O基地址設(shè)置成378:此時在Windows的設(shè)備管理器中,我們會發(fā)現(xiàn)并口已經(jīng)被標(biāo)記為“ECP打印機(jī)端口”:用鼠標(biāo)右鍵單擊后從彈出的菜單中選擇“屬性”命令打開屬性對話框,在“資源”頁面中我們會看到相應(yīng)I/O基地址的設(shè)置已經(jīng)生效:現(xiàn)在就可以用ISP下載線連接計(jì)算機(jī)并口和Arduino上的ICSP接口了,請?zhí)貏e留意連接方向:ISP下載線六口插座上標(biāo)有小三角的一端應(yīng)該靠近Arduino的ICSP接口上標(biāo)為1的一端。雖然計(jì)算機(jī)并口能夠?yàn)橄螺d電路提供一定的電壓,但一般我還是建議給Arduino模塊加上5V電壓(通過USB線和外接電源都可以),以保證下載過程的穩(wěn)定。硬件準(zhǔn)備好之后,我們就可以通過相應(yīng)的軟件將bootloader燒到Arduino中。支持AVR下載線的軟件比較多,如AVRDUDE和SLISP等,我們在這里使用的是PonyProg。下載并安裝好PonyProgv2.07aBETA版本,啟動PonyProg時會提示你進(jìn)行相應(yīng)的校準(zhǔn)和設(shè)置工作。首先選擇“Setup”菜單中的“Calibration”命令進(jìn)行校準(zhǔn),然后再選擇“Setup”菜單中的“IntrefaceSetup…”命令進(jìn)行相應(yīng)的并口設(shè)置:根據(jù)你的Arduino模塊上的芯片類型,從“Device”菜單中的“AVRmicro”子菜單中選擇“ATmega8”或者“ATmega168”。你也可以從工具欄上的Device下拉框中進(jìn)行相應(yīng)的選擇:首先從“Command”菜單中選擇“ReadAll”命令,從Arduino模塊上讀出ATmega中的當(dāng)前數(shù)據(jù)和設(shè)置,其中最重要的是之后要設(shè)置的熔絲位。然后選擇“File”菜單中的“OpenProgram(FLASH)File…”命令,打開“Openprogram(FLASH)contentfile”對話框。從你的Arduino安裝目錄下找出對應(yīng)于的bootloader。對于Arduino0010版本來講,我們可以在hardware\bootloaders目錄下找到atmega8和atmega168兩個目錄,分別對應(yīng)ATmega8和ATmega168芯片所對應(yīng)的bootloader(文件擴(kuò)展名為.hex),在atmega168目錄下可以找到ATmegaBOOT_168_diecimila.hex和ATmegaBOOT_168_ng.hex兩個文件,分別對應(yīng)Diecimila和NG模塊。你需要根據(jù)你的Arduino模塊的具體情況,加載相應(yīng)的bootloader文件。AVR通過熔絲來控制芯片內(nèi)部的一些功能,比如JTAG,時鐘的使用,掉電檢測電壓,是否允許調(diào)試等。熔絲位的配置是為Arduino下載bootloader過程中最復(fù)雜的一步,而且設(shè)置出錯很有可能導(dǎo)致芯片鎖死,所以一定要仔細(xì)。選擇“Command”菜單中的“SecurityandConfigurationBits…”命令,打開相應(yīng)的熔絲設(shè)置對話框。Arduino的bootloader對熔絲位有一定的要求,主要是同外部時間設(shè)置相關(guān)的。對于串口模塊采用的ATmega8來講,相應(yīng)的熔絲字節(jié)要設(shè)置成0xCA(FuseHighByte)和0xFF(FuseLowByte),具體每位的含義可以參見WolfPaulus的文章。在PonyProg中對ATmega8的熔絲位設(shè)置為下圖所示:對于NG和Diecimila采用的ATmega168來講,相應(yīng)的熔絲字節(jié)要設(shè)置成0xF8(ExtendedFuseByte),0xDF(FuseHighByte)和0xFF(FuseLowByte)。在PonyProg中對ATmega168的熔絲位設(shè)置為下圖所示:熔絲位設(shè)置好之后,選擇“Command”菜單中的“WriteAll”命令,將bootloader下載到Arduino中。下載過程中Arduino上的發(fā)光二極管L會不斷閃爍。下載完成之后,我們可以通過Arduino集成開發(fā)環(huán)境下載一個Arduino工程,來驗(yàn)證新下載的bootloader是否能夠正常工作。\o"ViewallpostsinArduino"Arduino,\o"ViewallpostsinDIY"DIY\o"CommentonDIYArduino:HelloWorld"NoComments?終于要開始寫第一個Arduino程序了,就跟之前學(xué)習(xí)所有語言一樣,第一個程序自然是HelloWorld了。不過這次有點(diǎn)特殊,要讓Arduino顯示一個“HelloWorld”字符串恐怕有點(diǎn)難度,這是因?yàn)锳rduino模塊上沒有提供任何可供顯示字符的設(shè)備。而這對Arduino新手來講,也就意味著程序的調(diào)試將是一個令人頭疼的問題。最簡單的辦法是在Arduino提供的數(shù)字端口(DigitalI/O)上連接發(fā)光二極管,然后通過控制發(fā)光二極管的亮滅來表明程序的當(dāng)前運(yùn)行狀態(tài),這的的確確可以算得上是最原始的調(diào)試方法。我的第一個Arduino程序正是要通過對數(shù)字I/O的13號管腳的控制,來實(shí)現(xiàn)與其相連的發(fā)光二極的亮滅。之所以要選擇13號管腳步,是因?yàn)閺脑韴D上可以看出該管腳與ATmega的引腳之間連接了一個1K的電阻,能夠起到限流的作用,以保護(hù)二極管不被燒壞。發(fā)光二極管是有正負(fù)極性的,因此必須連接正確才能夠讓其正常發(fā)光。剛買來的發(fā)光二極腿比較長的一端是正極,需要接在Arduino數(shù)字I/O的13號管腳上;腿比較短的一端是負(fù)極,需要接在GND管腳上。運(yùn)行Arduino的集成開發(fā)環(huán)境,選擇File->New菜單創(chuàng)建一個新的Arduino工程接著在Arduino集成開發(fā)環(huán)境的主窗口中輸入相應(yīng)的代碼:intledPin=13;voidsetup(){pinMode(ledPin,OUTPUT);}voidloop(){digitalWrite(ledPin,HIGH);delay(1000);digitalWrite(ledPin,LOW);delay(1000);}不難看出,一個最簡單的Arduino程序至少要實(shí)現(xiàn)兩個函數(shù):setup()和loop()。其中setup()這個函數(shù)主要用來完成相應(yīng)的初始化工作,在上面的例子中是將數(shù)字I/O的13號管腳設(shè)置為數(shù)字輸出。loop()這個函數(shù)則是Arduino程序的主函數(shù),相當(dāng)于C語言中的main()函數(shù),一個Arduino程序要完成的主要功能都在該函數(shù)中實(shí)現(xiàn),在上面的例子中是通過變換13號管腳的高低電平,并設(shè)置一秒的延時,從而使發(fā)光二極管能夠間歇性地不斷亮滅。從原理上講,用Arduino語言編寫的程序最后會被翻譯成相應(yīng)的C代碼,再用AVR-GCC編譯后下載到ATmega單片機(jī)中運(yùn)行。因此設(shè)計(jì)Arduino語言的目的就是簡化單片機(jī)編程,雖然這樣效率上會有一些損失,但卻能夠極大地促進(jìn)單片機(jī)在更廣泛領(lǐng)域內(nèi)的使用,基本上算是沿襲了PC機(jī)上軟件設(shè)計(jì)語言從匯編語言到C語言再到高級語言這一過程,因此很多技術(shù)和做法其實(shí)可以借鑒。用Arduino語言編寫的代碼需要先驗(yàn)證(Verify),以保證語法的正確性,然后再編譯生成相應(yīng)的機(jī)器碼。對Arduino代碼的驗(yàn)證可以通過Sketch->Verify/Compile菜單命令完成,也可以通過工具欄上的按鈕完成:代碼成功通過驗(yàn)證和編譯之后,就可以將其下載到Arduino模塊中了。由于昨天已經(jīng)將bootloader成功地?zé)龑懙搅薃Tmega中,因此下載Arduino應(yīng)用的任務(wù)就可以完全交由bootloader來完成了。Arduino的bootloader與集成開發(fā)環(huán)境的交互是通過串口來完成的,因此需要用串口線將Arduino與PC機(jī)的串中連接起來。我的串口線是自制的,按照Arduino的原理圖,只需要接2,3和5三根線,其中前兩根用于數(shù)據(jù)的收發(fā),最后一根是地線。串口線連接好之后,在Arduino集成開發(fā)環(huán)境的Tools->SerialPort菜單下選擇與PC相連的串口:一開始我很奇怪為什么沒有設(shè)置波特率和其它串行通信參數(shù)的地方,后來在Arduino的網(wǎng)站上才知道這些參數(shù)都保存在一個名為preferences.txt的配置文件中,該文件一般保存在類似于C:\DocumentsandSettings\Administrator\ApplicationData\Arduino這樣的目錄下。下面是我在該文件中找到的與串口通信相關(guān)的一些參數(shù):serial.stopbits=1

serial.databits=8

serial.download_rate=19200

serial.parity=N

不難看出,Arduino模塊采用的是192008N1方式來進(jìn)行串口通信的。確定了這些之后,按下Arduino模塊的復(fù)位按鈕,隨后立即執(zhí)行File->UploadtoI/OBoard菜單命令將編譯好的程序下載到Arduino模塊中。Arduino的bootloader被設(shè)計(jì)成如果在給定的時間(通常有7到8秒)內(nèi)沒有接收到任何來自集成開發(fā)環(huán)境的命令,就自動運(yùn)行之前已經(jīng)下載的程序,所以我們必須保證在正確的時間段內(nèi)給Arduino模塊發(fā)送程序下載的指令。除了通過菜單命令外,下載程序也可以通過快捷鍵Ctrl+U,或者直接點(diǎn)擊工具欄上的相應(yīng)按鈕來完成:將Arduino程序上傳到Arduino模塊中需要花一些時間,并且取決于工程的大小。當(dāng)程序上傳成功之后,可以在Arduino集成開發(fā)環(huán)境的console窗口中看到上傳后的程序大小,以及該Arduino模塊能夠接受的最大程序的大?。含F(xiàn)在再次復(fù)位Arduino模塊,會看到發(fā)光二極管立即閃了一下,表明bootloader正常工作了。接著再過一段時間,大約7到8秒,會看到發(fā)光二極管間歇性地不斷亮滅,這就表明第一個Arduino程序已經(jīng)成功地運(yùn)行起來了,CONGRATULATIONS!我在這期間遇到的唯一問題是剛開始的時候無法通過串口線下載程序,最初懷疑是串口通信的問題,后來慢慢排查發(fā)現(xiàn)Arduino模塊能夠從串口收數(shù)據(jù),但卻無法從串口發(fā)數(shù)據(jù)。仔細(xì)檢查了硬件發(fā)現(xiàn)原來我在Arduino模塊上接的是串口的公頭,自然收發(fā)的兩條線沒有同PC機(jī)完全正常地連接上,后來換成一個母頭就一切正常了。這一過程中的另一收區(qū)是仔細(xì)讀了Arduino關(guān)于串口部分的原理圖,原來這部分還是一個實(shí)用的TTL轉(zhuǎn)232的電平轉(zhuǎn)換電路,其中只用到了電阻、二極管和三極管,省去了一個MAX232芯片。至此,DIYArduino模塊的工作算是暫告一段落,剩下的是如何對各個硬件功能進(jìn)行詳細(xì)的驗(yàn)證,這可以結(jié)合實(shí)際的項(xiàng)目來完成。我計(jì)劃下一步做一些簡單的Arduino工程,大部分可能都來源于Arduino網(wǎng)站或者是網(wǎng)上收集到的資料,以驗(yàn)證我的Arduino模塊,同時也可以當(dāng)作入門的教程供大家參考。Aug26\o"ViewallpostsinArduino"Arduino,\o"ViewallpostsinDIY"DIY\o"CommentonDIYArduino:PCB和焊接"7Comments?讀了一些有關(guān)Arduino的介紹性的文章之后,才知道這么一個小東東居然在國外是大紅大紫,雖然沒有完全想清楚其中的原因,但似乎并不妨礙自己DIY它的決心。Arduino采用開放源代碼的模式,其原理圖和電路圖都可以從其網(wǎng)站免費(fèi)得到。在權(quán)衡比較了一番之后,我決定從其采用串口方式的版本開始,這一方面是因?yàn)樵硐鄬唵?,能夠降低組裝和調(diào)試的難度,另一方面則考慮到USB模擬的串口并不總是那么穩(wěn)定。決定開工之后,花了一上午的時間畫好了原理圖,基本湊和吧??奢喌诫娐穲D時可就不一樣了,封裝和走線對我這業(yè)務(wù)選手來講的確不是件容易的事情?;藘蓚€晚上的時間,最后還是決定放棄,因?yàn)锳rduino官方提供的電路圖在我看來確實(shí)比自己布的要漂亮多了,看來這一修養(yǎng)只能在隨后的日子里慢慢積累了。去做電路板時遇到一些問題,由于我問到的制造電路板的廠商基本上只認(rèn)Protel,根本不知道還有EagleCAD一說,甚至有人還將其與AutoCAD混為一談,告訴我這個軟件不是用來畫電路圖的。沒有辦法,只好回家一頓Google,將其生成Gerber文件后再將送過去。這一過程也算有點(diǎn)收獲,除了知道何為Gerber文件以及如何在EagleCAD中生成Gerber文件之外,還找到了一個用來查看Gerber文件的好工具:CAM350。電路板從送去到拿到一般需要一周多的時間,這期間的主要任務(wù)當(dāng)然是購買元器件了。一開始并沒有注意到Arduino串口版本的元件列表,以為與NG版本一樣也采用的是ATmega168,問了好些地方都沒得賣,最好只好高價比香港快遞過來,估計(jì)貴了不止一倍。最后在組裝的時候才發(fā)現(xiàn)原來串口版本采用的仍舊是ATmega8,而這在村里還算是很好買到的,這一個郁悶啊!元件都準(zhǔn)備妥當(dāng)之后,電路板也做出來了,雖然不是與Arduino官方一致的藍(lán)色,但還是挺漂亮的;-)將元件焊接到PCB板上又是一次對基本功的訓(xùn)練,好在這一版本的Arduino采用的都是分立元件,焊接上沒有遇到太大的麻煩。期間再一次深刻體會到了工具的重要性,不時幻想自己手中那把最便宜的鉻鐵啥里也能更新?lián)Q代一下,雖然他的壽命還不到短短的一個月。焊接完成之后,萬里長征估計(jì)還只完成了第一步,要讓Arduino能夠正常的運(yùn)行起來,肯定還有相當(dāng)多的調(diào)試和排錯的工作要做,而這也正是DIY的樂趣所在;-)\o"ViewallpostsinArduino"Arduino,\o"Viewallpostsin電子積木"電子積木\o"CommentonArduino電子積木專用傳感器擴(kuò)展板V4"2Comments?真沒想到,一塊傳感器擴(kuò)展板居然被我改到了第四版,而且估計(jì)還會繼續(xù)修改下去。最初的傳感器擴(kuò)展板在設(shè)計(jì)

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論