arduino初學者_第1頁
arduino初學者_第2頁
arduino初學者_第3頁
arduino初學者_第4頁
arduino初學者_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Arduino的數(shù)字I/O被分成兩個部分,其中每個部分都包含有6個可用的I/O管腳,即管腳2到管腳7和管腳8到管腳13。除了管腳13上接了一個1K的電阻之外,其他各個管腳都直接連接到ATmega上。我們可以利用一個6位的數(shù)字跑馬燈,來對Arduino數(shù)字I/O的輸出功能進行驗證,以下是相應的原理圖: 電路中在每個I/O管腳上加的那個1K電阻被稱為限流電阻,由于發(fā)光二極管在電路中沒有等效電阻值,使用限流電阻可以使元件上通過的電流不至于過大,能夠起到保護的作用。該工程對應的代碼為:int BASE = 2;int NUM = 6

2、;int index = 0; void setup()  for (int i = BASE; i < BASE + NUM; i +)     pinMode(i, OUTPUT);   void loop()  for (int i = BASE;

3、 i < BASE + NUM; i +)     digitalWrite(i, LOW);    digitalWrite(BASE + index, HIGH);  index = (index + 1) % NUM;  delay(100);下載并運行該工程,連接在Arduino數(shù)字I

4、/O管腳2到管腳7上的發(fā)光二極管會依次點亮0.1秒,然后再熄滅:這個實驗可以用來驗證數(shù)字I/O輸出的正確性。Arduino上一共有十二個數(shù)字I/O管腳,我們可以用同樣的辦法驗證其他六個管腳的正確性,而這只需要對上述工程的第一行做相應的修改就可以了:int BASE = 8;Arduino教程二: 數(shù)字輸入 在數(shù)字電路中開關(switch)是一種基本的輸入形式,它的作用是保持電路的連接或者斷開。Arduino從數(shù)字I/O管腳上只能讀出高電平(5V)或者低電平(0V),因此我們首先面臨到的一個問題就是如何將開關的開/斷狀態(tài)轉變成Arduino能夠讀

5、取的高/低電平。解決的辦法是通過上/下拉電阻,按照電路的不同通常又可以分為正邏輯(Positive Logic)和負邏輯(Inverted Logic)兩種。在正邏輯電路中,開關一端接電源,另一端則通過一個10K的下拉電阻接地,輸入信號從開關和電阻間引出。當開關斷開的時候,輸入信號被電阻“拉”向地,形成低電平(0V);當開關接通的時候,輸入信號直接與電源相連,形成高電平。對于經(jīng)常用到的按壓式開關來講,就是按下為高,抬起為低。 在負邏輯電路中,開關一端接地,另一端則通過一個10K的上拉電阻接電源,輸入信號同樣也是從開關和電阻間引出。當開關斷開時,輸入信號被電阻“拉”

6、向電源,形成高電平(5V);當開關接通的時候,輸入信號直接與地相連,形成低電平。對于經(jīng)常用到的按壓式開關來講,就是按下為低,抬起為高。 為了驗證Arduino數(shù)字I/O的輸入功能,我們可以將開關接在Arduino的任意一個數(shù)字I/O管腳上(13除外),并通過讀取它的接通或者斷開狀態(tài),來控制其它數(shù)字I/O管腳的高低。本實驗采用的原理圖如下所示,其中開關接在數(shù)字I/O的7號管腳上,被控的發(fā)光二極管接在數(shù)字I/O的13號管腳上:Arduino教程三: 模擬輸入Arduino的優(yōu)勢在于對數(shù)字信號的識別和處理,但我們所生活的真實世界并不是數(shù)字(digital)化的,簡單到只要用0和1

7、就能夠表示所有的現(xiàn)象。例如溫度這一我們已經(jīng)司空見慣的概念,它只能在一個范圍之內連續(xù)變化,而不可能發(fā)生像從0到1這樣的瞬時跳變,類似這樣的物理量被人們稱為是模擬(analog)的。Arduino是無法理解這些模擬量的,它們必須在經(jīng)過模數(shù)轉換后變成數(shù)字量后,才能被Arduino進一步處理。像溫度這樣的數(shù)據(jù)必須先被轉換成微處理器能夠處理的形式(比如電壓),才能被Arduino處理,這一任務通常由各類傳感器(sensor)來完成的。例如,電路中的溫度傳感器能夠將溫度值轉換成0V到5V間的某個電壓,比如0.3V、3.27V、4.99V等。由于傳感器表達的是模擬信號,它不會像數(shù)字信號那樣只有簡單的高電平和

8、低電平,而有可能是在這兩者之間的任何一個數(shù)值。至于到底有多少可能的值則取決于模數(shù)轉換的精度,精度越高能夠得到的值就會越多。Arduino所采用的ATmega8微處理器一其有6個模數(shù)轉換器(ADC,Analog to Digital Converter),每一個模數(shù)轉換器的精度都是10bit,也就是說能夠讀取1024(210 = 1024)個狀態(tài)。在Arduino的每一個模擬輸入管腳上,電壓的變化范疇是從0V到5V,因此Arduino能夠感知到的最小電壓變化是4.8毫伏(5/1024 = 4.8mV)。電位計(potentio

9、meter)是一種最簡單的模擬輸入設備,它實際上就是一個可變電阻箱,通過控制滑塊所在的位置我們可以得到不同的電壓值,而輸入信號正是從滑塊所在的位置接入到電路中的。                                                              &#

10、160;              這一實驗我們將通過改變電位計的值來控制發(fā)光二極管閃爍的頻率。電位計上一共有三個管腳,分別連接到Arduino的電源、地和模擬輸入的5號管腳上,發(fā)光二極管則連接到數(shù)字I/O的13號管腳上,原理圖如下所示:相應的代碼為:int ledPin = 13;int potPin = 5;int value = 0; void setup()   pinMode(

11、ledPin, OUTPUT); void loop()   value = analogRead(potPin);  digitalWrite(ledPin, HIGH);  delay(value);  digitalWrite(ledPin, LOW);  delay(value);在Arduino中,對模擬輸入端口不需要調用pinMode()函數(shù)將其指定為輸入或者是輸出模式,這點同數(shù)字I/O端口是有所不同的。

12、通過旋轉電位計的軸,我們能改變電位計中間那根連線同地之間的電阻量,從而也就能改變從模擬輸入的5號管腳上所讀入的模擬量的值。當電位計完全旋轉到頭時,輸入到模擬輸入管腳上的電壓為0V,用analogRead()函數(shù)讀出的值為0;當電位計完全旋轉到另一頭時,輸入到模擬I/O管腳上的電壓為5V,此時用analogRead()函數(shù)讀出的值為1023;當電位計旋轉到中間的某個位置時,輸入到模擬輸入管腳上的電壓是0V到5V之間的某個值,而用analogRead()函數(shù)讀出的則是位于0到1023之間的某個對應值。讀出的模擬量在我們的實驗中被用來確定發(fā)光二極管點亮和熄滅的時間,以反映模擬量的變化。電位計運用的是

13、分壓原理,通過旋轉到不同的位置來得到不同的電壓值。從這種意義上講,它能夠被用來對當前旋轉到的位置進行度量,因此可以被用在轉向輪等旋轉裝置中。今天發(fā)現(xiàn)PCB板上另外一個錯誤,就是將模擬輸入對應管腳號標反了,試了好久才意識到是這一問題。加上之前電源設計上的兩個小缺陷, 一共有三個需要修改的地方。如果有機會再做PCB板的話,試著將這些問題解決一下:-)  相應的代碼為:int ledPin = 13;int switchPin = 7;int value = 0; voi

14、d setup()   pinMode(ledPin, OUTPUT);  pinMode(switchPin, INPUT); void loop()   value = digitalRead(switchPin);  if (HIGH = value)     / turn LED off  

15、  digitalWrite(ledPin, LOW);   else     / turn LED on    digitalWrite(ledPin, HIGH);  由于采用的是負邏輯電路,開關按下時用digitalRead()函數(shù)讀取到的值為LOW,此時再用digitalWrite()函數(shù)將發(fā)光二極管所在的管腳置為高,點亮發(fā)光二極管。同理,當開關抬起時,發(fā)光二極管將被熄滅,這樣我

16、們就實現(xiàn)了用開關來控制發(fā)光二極管的功能。 Arduino教程四: 模擬輸出就像模擬輸入一樣,在現(xiàn)實的物理世界中我們經(jīng)常需要輸出除了0和1之外的其他數(shù)值。例如,除了想用微控制器找開或者關閉電燈之外,我們還會想控制燈光的亮度,這時就需要用到模擬輸出。由于Arduino的微控制器只能產(chǎn)生高電壓(5V)或者低電壓(0V),而不能產(chǎn)生變化的電壓,因此必須采用脈寬度調制技術(PWM,Pulse Width Modulation)來模仿模擬電壓。PWM是一種開關式穩(wěn)壓電源應用,它是借助微處理器的數(shù)字輸出來對模擬電路進行控制的一種非常用效的技術,廣泛應用在從測量、通信到

17、功率控制與變換的許多領域中。簡而言之,PWM是一種對模擬信號電平進行數(shù)字編碼的方法,它通過對半導體開關器件的導通和關斷進行控制,使輸出端得到一系列幅值相等但寬度不相等的脈沖,而這些脈沖能夠被用來代替正弦波或其它所需要的波形。在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.0

18、196V(5/255 = 0.0196)。本實驗中我們將用模擬輸出來調暗發(fā)光二極管(LED),由于正常情況下LED對電壓的變化非常敏感,因此當脈沖寬度變化時人眼會感覺到LED實際上是在不斷地熄滅和點亮,而不是逐漸變暗。解決這一問題可以采用濾波電路,它能使有用頻率信號通過而同時抑制(或大大衰減)無用頻率信號。實驗中我們采用的是低通濾波器,它的原理非常簡單,只需要一個電阻和一個電容,能夠很好地過濾掉電路中超過某一頻率的信號。   此處給出的電路并不能校平所有脈沖,它之所以被稱為“低通濾波”是因為它只允許頻率低于某個限度的脈沖通過,對于高于這個限度的

19、脈沖則被平衡為偽模擬電壓,濾波的頻率范圍由電阻器和電容器的比值決定。實驗中采用的電路原理如下: 相應的代碼為:int potPin = 0;int ledPin = 11; byte bright_table =   30,  30,  30,  40,  50,  60,  70,  80,  90,

20、60;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

21、, 100,  90,  80,  70,  60,  50,  40,  30,  30,  30 int MAX = 50;int count = 0;int val = 0; void setup()   pinMode(ledPin, OUT

22、PUT); void loop()   analogWrite(ledPin, bright_tablecount);  count +;  if (count > MAX)     count = 0;     val = analogRead(potPin);  val =

23、60;val /4;  delay(val);該工程調用analogWrite()函數(shù)在數(shù)字I/O端口的11號管腳上模仿模擬輸出,每產(chǎn)生一次輸出后都設置了相應的延時,而延時的長度由模擬輸入端口0號管腳上的電位器來決定。通過調整電位器的位置,我們可以觀察到發(fā)光二極管逐漸變亮后再逐漸變暗的效果。Arduino教程五: 串口輸出在許多實際應用場合中我們會要求在Arduino和其它設備之間實現(xiàn)相互通信,而最常見通常也是最簡單的辦法就是使用串行通信。在串行通信中,兩個設備之間一個接一個地來回發(fā)送數(shù)字脈沖,它們之間必須嚴格遵循相應的協(xié)議以保證通信的正確性。在PC機上

24、上最常見的串行通信協(xié)議是RS-232串行協(xié)議,而在各種微控制器(單片機)上采用的則是TTL串行協(xié)議。由于這兩者的電平有很大的不同,因此在實現(xiàn)PC機和微控制器的通信時,必須進行相應的轉換。完成RS-232電平和TTL電平之間的轉換一般采用專用芯片,如MAX232等,但在Arduino上是用相應的電平轉換電路來完成的。根據(jù)Arduino的原理圖我們不難看出,ATmega的RX和TX引腳一方面直接接到了數(shù)字I/O端口的0號和1號管腳, 另一方面又通過電平轉換電路接到了串口的母頭上。因此,當我們需要用Arduino與PC機通信時,可以用串口線將兩者連接起來;當我們需要用Arduino與微控制

25、器(如另一塊Arduino)通信時,則可以用數(shù)字I/O端口的0號和1號管腳。串行通信的難點在于參數(shù)的設置,如波特率、數(shù)據(jù)位、停止位等,在Arduino語言可以使用Serial.begin()函數(shù)來簡化這一任務。為了實現(xiàn)數(shù)據(jù)的發(fā)送,Arduino則提供了Serial.print()和Serial.println()兩個函數(shù),它們的區(qū)別在于后者會在請求發(fā)送的數(shù)據(jù)后面加上換行符,以提高輸出結果的可讀性。在這一實驗中沒有用到額外的電路, 我們只需要用串口線將Arduino和PC機連起來就可以了,相應的代碼為:void setup()   Serial.

26、begin(9600); void loop()   Serial.println("Hello World!");  delay(1000);在將工程下載到Arduino模塊中之后,在Arduino集成開發(fā)環(huán)境的工具欄中單擊“Serial Monitor”控制,打開串口監(jiān)視器:接著將波特率設置為9600,即保持與工程中的設置相一致:如果一切正常,此時我們就可以在Arduino集成開發(fā)環(huán)境的Console窗口中看到串口上輸出的數(shù)據(jù)了:為了檢查串口上是否有數(shù)據(jù)發(fā)送,一個比較簡單的辦法是在

27、數(shù)字I/O端口的1號管腳(TX)和5V電源之間接一個發(fā)光二極管,如下面的原理圖所示:這樣一旦Arduino在通過串口向PC機發(fā)送數(shù)據(jù)時,相應的發(fā)光二極管就會閃爍,實際應用中這是一個非常方便的調試手段;-)Arduino教程六: 串口輸入串行通信是在實現(xiàn)在PC機與微控制器進行交互的最簡單的辦法。之前的PC機上一般都配有標準的RS-232或者RS-422接口來實現(xiàn)串行通信,但現(xiàn)在這種情況已經(jīng)發(fā)生了一些改變,大家更傾向于使用USB這樣一種更快速但同時也更加復雜的方式來實現(xiàn)串行通信。盡管在有些計算機上現(xiàn)在已經(jīng)找不到RS-232或者RS-422接口了,但我們仍可以通過USB/串口或者PCMCI

28、A/串口這樣的轉換器,在這些設備上得到傳統(tǒng)的串口。通過串口連接的Arduino在交互式設計中能夠為PC機提供一種全新的交互方式,比如用PC機控制一些之前看來非常復雜的事情,像聲音和視頻等。很多場合中都要求Arduino能夠通過串口接收來自于PC機的命令,并完成相應的功能,這可以通過Arduino語言中提供的Serial.read()函數(shù)來實現(xiàn)。在這一實驗中我們同樣不需要任何額外的電路,而只需要用串口線將Arduino和PC機連起來就可以了,相應的Arduino工程代碼為:int ledPin = 13;int val;  void&#

29、160;setup()   pinMode(ledPin, OUTPUT);  Serial.begin(9600);  void loop()   val = Serial.read();  if (-1 != val)     if ('H' = val)    

30、60;  digitalWrite(ledPin, HIGH);      delay(500);      digitalWrite(ledPin, LOW);      把工程下載到Arduino模塊中之后,在Arduino集成開發(fā)環(huán)境中打開串口監(jiān)視器并將波特率設置為9600,然后向Arduino模塊發(fā)送字符H,如下圖所示: 該工程運行起來之后會不斷調用Seria

31、l.read()函數(shù)從串口獲得數(shù)據(jù)。Arduino語言提供的這個函數(shù)是不阻塞的,也就是說不論串口上是否真的有數(shù)據(jù)到達,該函數(shù)都會立即返回。Serial.read()函數(shù)每次只讀取一個字節(jié)的數(shù)據(jù),當串口上有數(shù)據(jù)到達的時候,該函數(shù)的返回值為到達的數(shù)據(jù)中第一個字符的ASCII碼;當串口上沒有數(shù)據(jù)到達的時候,該函數(shù)的返回值則為-1。Arduino語言的參考手冊中沒有對Serial.read()函數(shù)做過多的說明,我的一個疑問是如果PC機一次發(fā)送的數(shù)據(jù)太多,Arduino是否提供相應的串口緩存功能來保證數(shù)據(jù)不會丟失?Arduino語言中提供的另外一個函數(shù)Serial.available()或許能夠幫助我們

32、用實驗來進行驗證:int ledPin = 13;int val;  void setup()   pinMode(ledPin, OUTPUT);  Serial.begin(9600);  void loop()   val = Serial.read();  if (-1 != val)    

33、; if ('H' = val)       digitalWrite(ledPin, HIGH);      delay(500);      digitalWrite(ledPin, LOW);        Serial.print("Available: 

34、");      Serial.println(Serial.available(), DEC);             函數(shù)Serial.available()的功能是返回串口緩沖區(qū)中當前剩余的字符個數(shù),按照Arduino提供的該函數(shù)的說明,串口緩沖區(qū)中最多能緩沖128個字節(jié)。我們可以一次給Arduino模塊發(fā)送多個字符,來驗證這一功能: 在這一實驗中,每當Arduino成功收到一個字符H,連接在數(shù)字I

35、/O端口管腳13上的發(fā)光二極管就會閃爍一次:Arduino教程七: XBee無線通信借助XBee擴展板我們可以很方便地將XBee模塊連接到Arduino上,XBee模塊的工作原理也非常簡單,它與Arduino之間其實就是通過串行接口(即Tx和Rx引腳)進行通信。對于簡單的點對點通信來講,只需要通過串行接口向XBee模塊寫數(shù)據(jù)就可以實現(xiàn)數(shù)據(jù)的發(fā)送;當XBee模塊通過無線通道接收到數(shù)據(jù)時,通過讀串行接口可以很方便地獲得這些數(shù)據(jù)。原理弄清楚之后,其實我們可以將XBee模塊看成是Arduino的串口,通過相應的串口操作函數(shù)來實現(xiàn)數(shù)據(jù)的接收和發(fā)送。首先請按照Arduino XBee模

36、塊使用手冊中的說明配置好你的兩個XBee模塊,然后將相應的跳線連接到XBEE一端: 這里我們使用一個最簡單的工程來進行相應的實驗:int ledPin = 13;int val; void setup()   pinMode(ledPin, OUTPUT);  Serial.begin(9600); void loop()   / send data to another

37、60;XBee module  Serial.print('A');  delay(1000);   / receive data from another XBee module  val = Serial.read();  if (-1 != val)     if ('A'

38、; = val)       digitalWrite(ledPin, HIGH);      delay(500);      digitalWrite(ledPin, LOW);      delay(500);      該工程首先通過Seri

39、al.print()函數(shù)向XBee模塊發(fā)送一個字母A,該字母會被XBee模塊通過無線網(wǎng)絡發(fā)送出去,并被另外一個XBee模塊接收到。緊接著再通過Serial.read()函數(shù)從XBee模塊讀取從無線網(wǎng)絡接收到的數(shù)據(jù),如果是字母A的話,則點亮相應的發(fā)光二極管。將該工程編譯并分別下載到兩個Arduino模塊中,注意下載的時候不要連接XBee擴展板,這是因為XBee模塊會占用串口,從而導致下載無法正確完成。下載完成后將XBee擴展板連接到Arduino上,并分別給兩者上電。這兩個Arduino模塊都會向對方發(fā)送字母A,然后從對方接收字母A,并對點亮數(shù)字I/O管腳13上連接的發(fā)光二極管。你可以試著將兩個

40、模塊放在房間里的不同位置,來對XBee模塊的傳輸性能進行測試。 Arduino電機驅動擴展板除了使用傳感器對各種外部物理量進行感知之外,能夠對實際物體的運動進行相應的控制也是互動設計中不可或缺的一部分。在所有這類動力裝置中,電機顯然是最常見、最基本、最便宜的解決方案了,常用的電機的種類有很多種,如直流電機,步進電機,伺服電機,減速電機等,并且每一種電機的控制方法都有所不同。如果你是一個電子高手,控制普通的直流電機用幾個三極管就行了,否則話像L293這樣的芯片將是一個更好的選擇。L293芯片的核心是兩個H-橋,所有的H-橋芯片都具有如下一些引腳:· 邏輯輸入

41、0;· 邏輯電壓 · 電源電壓 · 電源輸出 · 地 其中邏輯電壓引腳采用與微控制器相同的電壓和電流,電源電壓采用與運行電機所需要的電壓和電流。邏輯輸入引腳連接到用來向H-橋輸出控制信號的微控制器上的引腳,而電源輸出引腳則連接到電機上。這么專業(yè)的術語翻譯到Arduino上可以這樣來理解。首先,我們需要兩套電源,一套用來給Arduino供電,一套用來給電機供電。其次,我們需要用到Arduino的數(shù)字I/O管腳來控制L293,并把電機接到L293上接受控制。說到這里,正好解釋一下

42、Arduino的供電系統(tǒng),通常Arduino有三種供電方式:· USB供電 · 電池供電 · 變壓器供電 后兩者在Arduino上統(tǒng)稱為外部供電。供電方式的選擇是通過Arduino上的電源選擇跳線來實現(xiàn)的,當把跳線接到“USB”一端時,采用的是USB供電方式,這時整個Arduino及其附屬電路上的電源都由PC的USB接口提供,此時電流一般比較小,只能驅動功率比較小的電路,如LED等。當把跳線接到“EXT”一端時,采用的是外部供電方式,這時一般能夠驅動比較大的設備,如電機等。Arduino內部一套電源轉換電

43、路,可以用來將外部供電時的電壓(6-12V)轉換成內部所需要的5V電壓,使用L293控制電機正是需要這兩套電源。下面這個就是基于L293D芯片的Arduino專用電機驅動擴展板,它能夠用來驅動兩個直流電機。使用該擴展板來驅動直流電機非常簡單,只需要將擴展板插到Arduino上,同時將直流電機連接到擴展板上的motors引腳上就可以了。正如上面所提到的,此時應該采用Arduino的外部供電方式,并使用變壓器或者電源為Arduino提供電力。這里我選用的是9V變壓器和9V的直流電機:電機擴展板上motors引腳的上面兩針是用來接電機1的,下面兩針是用來接電機2的。電路連接好之后,剩下的工作就是如何

44、用程序進行控制了。使用這一擴展板我們能夠控制直流電機的轉動方向和轉動速度,其中對轉動方向的控制是通過Arduino上的數(shù)字I/O引腳12和13來實現(xiàn)的,對轉速的控制則是通過數(shù)字I/O引腳9和10來實現(xiàn)的。如果要控制直流電機1,我們需要向引腳9輸出相應的PWM信號來控制電機的速度,同時設置引腳12和13的高低電壓來控制電機的方向。如果要控制直流電機2,則需要向引腳10輸出相應的PWM信號來控制電機的速度,此時也是通過設置引腳12和13 的高低電壓來控制電機的方向的。電機擴展板上帶有S1和S2兩個按鈕,分別對應于Arduino數(shù)字I/O的7號和6號管腳 ,并且在按下時為低電平。

45、因此我們可以像下面的程序這樣利用S1來控制電機1的正反轉:int switchPin = 7;  / switch pinint dir1Pin = 12;   / direction 1int dir2Pin = 13;   / direction 2int speedPin = 9;   / s

46、pped pin void setup()   pinMode(switchPin, INPUT);  pinMode(dir1Pin, OUTPUT);  pinMode(dir2Pin, OUTPUT);  pinMode(speedPin, OUTPUT); void loop()   / switch is pressed  if

47、 (digitalRead(switchPin) = LOW)     / set spped    analogWrite(speedPin, 250);    / set direction    digitalWrite(dir1Pin, LOW);    digitalWrite(dir2P

48、in, HIGH);   else     analogWrite(speedPin, 100);    digitalWrite(dir1Pin, HIGH);    digitalWrite(dir2Pin, LOW);  在將上述程序下載到Arduino上并運行起來之后,我們就可以通過按S1鍵,來改變電機的旋轉速度和方向了:)P.S. 在調試這一電機擴展板的奇遇

49、是,在將其插入到Arduino Diecimila的貼片版本上時,發(fā)現(xiàn)MC33269異常熱,并且電機偶爾才能工作。進一步設計發(fā)現(xiàn)如果把整個擴展板很好地插入到Arduino上時,5V和Gnd之間居然是短路的。一開始并沒有發(fā)現(xiàn)問題在哪,后來才發(fā)現(xiàn)擴展板上的電容C9與USB接頭的外殼短路了!將其錫去掉一下,并抬高擴展板時問題得到解決。實際使用時請檢查下圖電容下面的引腳是否與USB接口的外殼短路了,特別是對于貼片版本來講,最好在通電前用萬用表檢查一下5V和Gnd之間的電阻值:) Arduino下載線使用手冊Arduino使用的是Atmel公司的AVR單片機,一般為ATmega8和A

50、Tmega168,這一系列的單片機都支持ISP(In System Programmability )編程,無需依賴昂貴的編程器就可以完成程序的下載。Arduino電路在設計上考慮到了ISP功能,也留出了相應的接口(ICSP),從而允許我們通過ISP下載線來完成bootloader的下載。新買來的Arduino模塊上一般都已經(jīng)預先下載好了bootloader,因此上電之后就能夠直接通過Arduino集成開發(fā)環(huán)境下載相應的Arduino程序。正常情況下我們在用Arduino時是不需要ISP下載線的,但在某些情況下可能會出現(xiàn)在Arduino集成開發(fā)環(huán)境中無法正常下載程

51、序的現(xiàn)象,這很可能是由于bootloader受損所致。解決的辦法就是重新將bootloader燒寫到ATmega芯片中,此時你就需要用到這里介紹的ISP下載線了。Arduio網(wǎng)站上給出的并口下載線電路我只成功地更新過ATmega8的bootloader,而無法為Diecimila上的ATmega168下載bootloader。此外,Arduino給出的這一下載線電路過于簡單,沒有做相應的隔離和保護, 經(jīng)常使用可能會對Atmega芯片帶來一定的損害。AVR建議使用一片74HC244來隔離并口和ATmega芯片,下面是我所使用的下載線的原理圖:以及自制的下載線:使用并口下載線的時候,我們

52、需要先到計算機的BIOS中將并口設為ECP(The extended capabilities port )模式,同時將I/O基地址設置成378:此時在Windows的設備管理器中,我們會發(fā)現(xiàn)并口已經(jīng)被標記為“ECP 打印機端口”: 用鼠標右鍵單擊后從彈出的菜單中選擇“屬性”命令打開屬性對話框,在“資源”頁面中我們會看到相應I/O基地址的設置已經(jīng)生效: 現(xiàn)在就可以用ISP下載線連接計算機并口和Arduino上的ICSP接口了,請?zhí)貏e留意連接方向:ISP下載線六口插座上標有小三角的一端應該靠近 Arduino的ICS

53、P接口上標為1的一端。雖然計算機并口能夠為下載電路提供一定的電壓,但一般我還是建議給Arduino模塊加上5V電壓(通過USB線和外接電源都可以),以保證下載過程的穩(wěn)定。硬件準備好之后,我們就可以通過相應的軟件將bootloader燒到Arduino中。支持AVR下載線的軟件比較多,如AVRDUDE和SLISP等,我們在這里使用的是PonyProg。下載并安裝好PonyProg v2.07a BETA版本,啟動PonyProg時會提示你進行相應的校準和設置工作。首先選擇“Setup”菜單中的“Calibration”命令進行校準,然后再選擇“Setup”菜單中的“Intre

54、face Setup”命令進行相應的并口設置: 根據(jù)你的Arduino模塊上的芯片類型,從“Device” 菜單中的“AVR micro”子菜單中選擇“ATmega8”或者“ATmega168”。你也可以從工具欄上的Device下拉框中進行相應的選擇:首先從“Command”菜單中選擇“Read All” 命令,從Arduino模塊上讀出ATmega中的當前數(shù)據(jù)和設置,其中最重要的是之后要設置的熔絲位。然后選擇“File”菜單中的“Open Program (FLASH) File” 命令,打開

55、“Open program (FLASH) content file”對話框。從你的Arduino安裝目錄下找出對應于的bootloader。對于Arduino 0010版本來講,我們可以在hardwarebootloaders目錄下找到atmega8和atmega168兩個目錄,分別對應ATmega8和ATmega168芯片所對應的bootloader(文件擴展名為.hex),在atmega168目錄下可以找到ATmegaBOOT_168_diecimila.hex和ATmegaBOOT_168_ng.hex兩個文件,分別對應Diecimil

56、a和NG模塊。你需要根據(jù)你的Arduino模塊的具體情況,加載相應的bootloader文件。AVR通過熔絲來控制芯片內部的一些功能,比如JTAG,時鐘的使用,掉電檢測電壓,是否允許調試等。熔絲位的配置是為Arduino下載bootloader過程中最復雜的一步,而且設置出錯很有可能導致芯片鎖死,所以一定要仔細。選擇“Command”菜單中的“Security and Configuration Bits ”命令,打開相應的熔絲設置對話框。Arduino的bootloader對熔絲位有一定的要求,主要是同外部時間設置相關的。對于串口模塊采用的ATmega

57、8來講,相應的熔絲字節(jié)要設置成0xCA(Fuse High Byte)和0xFF(Fuse Low Byte),具體每位的含義可以參見Wolf Paulus的文章。在PonyProg中對ATmega8的熔絲位設置為下圖所示:對于NG和Diecimila采用的ATmega168來講,相應的熔絲字節(jié)要設置成0xF8(Extended Fuse Byte), 0xDF(Fuse High Byte)和0xFF(Fuse Low Byte)。在PonyProg中對ATmega168的

58、熔絲位設置為下圖所示: 熔絲位設置好之后,選擇“Command”菜單中的“Write All”命令,將bootloader下載到Arduino中。下載過程中Arduino上的發(fā)光二極管L會不斷閃爍。下載完成之后,我們可以通過Arduino集成開發(fā)環(huán)境下載一個Arduino工程,來驗證新下載的bootloader是否能夠正常工作。DIY Arduino: Hello World終于要開始寫第一個Arduino程序了,就跟之前學習所有語言一樣,第一個程序自然是Hello World了。不過這次有點特殊,要讓Arduino顯示一個“Hell

59、o World”字符串恐怕有點難度,這是因為Arduino模塊上沒有提供任何可供顯示字符的設備。而這對Arduino新手來講,也就意味著程序的調試將是一個令人頭疼的問題。最簡單的辦法是在Arduino提供的數(shù)字端口(Digital I/O)上連接發(fā)光二極管,然后通過控制發(fā)光二極管的亮滅來表明程序的當前運行狀態(tài),這的的確確可以算得上是最原始的調試方法。我的第一個Arduino程序正是要通過對數(shù)字I/O的13號管腳的控制,來實現(xiàn)與其相連的發(fā)光二極的亮滅。之所以要選擇13號管腳步,是因為從原理圖上可以看出該管腳與ATmega的引腳之間連接了一個1K的電阻,能夠起到限流的作用,以保

60、護二極管不被燒壞。發(fā)光二極管是有正負極性的,因此必須連接正確才能夠讓其正常發(fā)光。剛買來的發(fā)光二極腿比較長的一端是正極,需要接在Arduino數(shù)字I/O的13號管腳上;腿比較短的一端是負極,需要接在GND管腳上。運行Arduino的集成開發(fā)環(huán)境,選擇File->New菜單創(chuàng)建一個新的Arduino工程接著在Arduino集成開發(fā)環(huán)境的主窗口中輸入相應的代碼:int ledPin = 13; void setup()  pinMode(ledPin, OUTPUT); void loop()&

61、#160; digitalWrite(ledPin, HIGH);  delay(1000);  digitalWrite(ledPin, LOW);  delay(1000);不難看出,一個最簡單的Arduino程序至少要實現(xiàn)兩個函數(shù):setup()和loop()。其中setup()這個函數(shù)主要用來完成相應的初始化工作,在上面的例子中是將數(shù)字I/O的13號管腳設置為數(shù)字輸出。loop()這個函數(shù)則是Arduino程序的主函數(shù),相當于C語言中的main()函數(shù),一個Arduino程序要完成的主要功能都在該

62、函數(shù)中實現(xiàn),在上面的例子中是通過變換13號管腳的高低電平,并設置一秒的延時,從而使發(fā)光二極管能夠間歇性地不斷亮滅。從原理上講,用Arduino語言編寫的程序最后會被翻譯成相應的C代碼,再用AVR-GCC編譯后下載到ATmega單片機中運行。因此設計Arduino語言的目的就是簡化單片機編程,雖然這樣效率上會有一些損失,但卻能夠極大地促進單片機在更廣泛領域內的使用,基本上算是沿襲了PC機上軟件設計語言從匯編語言到C語言再到高級語言這一過程,因此很多技術和做法其實可以借鑒。用Arduino語言編寫的代碼需要先驗證(Verify),以保證語法的正確性,然后再編譯生成相應的機器碼。對Arduino代碼

63、的驗證可以通過Sketch->Verify/Compile菜單命令完成,也可以通過工具欄上的按鈕完成:代碼成功通過驗證和編譯之后,就可以將其下載到Arduino模塊中了。由于昨天已經(jīng)將bootloader成功地燒寫到了ATmega中,因此下載Arduino應用的任務就可以完全交由bootloader來完成了。Arduino的bootloader與集成開發(fā)環(huán)境的交互是通過串口來完成的,因此需要用串口線將Arduino與PC機的串中連接起來。我的串口線是自制的,按照Arduino的原理圖,只需要接2,3和5三根線,其中前兩根用于數(shù)據(jù)的收發(fā),最后一根是地線。串口線連接好之后,在Arduino集

64、成開發(fā)環(huán)境的Tools->Serial Port菜單下選擇與PC相連的串口:一開始我很奇怪為什么沒有設置波特率和其它串行通信參數(shù)的地方,后來在Arduino的網(wǎng)站上才知道這些參數(shù)都保存在一個名為preferences.txt的配置文件中,該文件一般保存在類似于C:Documents and SettingsAdministratorApplication DataArduino這樣的目錄下。下面是我在該文件中找到的與串口通信相關的一些參數(shù):serial.stopbits=1serial.databits=8serial.download_rate=

65、19200serial.parity=N不難看出,Arduino模塊采用的是19200 8N1方式來進行串口通信的。確定了這些之后,按下Arduino模塊的復位按鈕,隨后立即執(zhí)行File->Upload to I/O Board菜單命令將編譯好的程序下載到Arduino模塊中。Arduino的bootloader被設計成如果在給定的時間(通常有7到8秒)內沒有接收到任何來自集成開發(fā)環(huán)境的命令,就自動運行之前已經(jīng)下載的程序,所以我們必須保證在正確的時間段內給Arduino模塊發(fā)送程序下載的指令。除了通過菜單命令外,下載程序也可以通過快捷鍵Ctrl+U

66、,或者直接點擊工具欄上的相應按鈕來完成:將Arduino程序上傳到Arduino模塊中需要花一些時間,并且取決于工程的大小。當程序上傳成功之后,可以在Arduino集成開發(fā)環(huán)境的console窗口中看到上傳后的程序大小,以及該Arduino模塊能夠接受的最大程序的大?。含F(xiàn)在再次復位Arduino模塊,會看到發(fā)光二極管立即閃了一下,表明bootloader正常工作了。接著再過一段時間,大約7到8秒,會看到發(fā)光二極管間歇性地不斷亮滅,這就表明第一個Arduino程序已經(jīng)成功地運行起來了,CONGRATULATIONS!我在這期間遇到的唯一問題是剛開始的時候無法通過串口線下載程序,最初懷疑是串口通信

67、的問題,后來慢慢排查發(fā)現(xiàn)Arduino模塊能夠從串口收數(shù)據(jù),但卻無法從串口發(fā)數(shù)據(jù)。仔細檢查了硬件發(fā)現(xiàn)原來我在Arduino模塊上接的是串口的公頭,自然收發(fā)的兩條線沒有同PC機完全正常地連接上,后來換成一個母頭就一切正常了。這一過程中的另一收區(qū)是仔細讀了Arduino關于串口部分的原理圖,原來這部分還是一個實用的TTL轉232的電平轉換電路,其中只用到了電阻、二極管和三極管,省去了一個MAX232芯片。至此,DIY Arduino模塊的工作算是暫告一段落,剩下的是如何對各個硬件功能進行詳細的驗證,這可以結合實際的項目來完成。我計劃下一步做一些簡單的Arduino工程,大部分可能都來源于

68、Arduino網(wǎng)站或者是網(wǎng)上收集到的資料,以驗證我的Arduino模塊,同時也可以當作入門的教程供大家參考。DIY Arduino: PCB和焊接讀了一些有關Arduino的介紹性的文章之后,才知道這么一個小東東居然在國外是大紅大紫,雖然沒有完全想清楚其中的原因,但似乎并不妨礙自己DIY它的決心。Arduino采用開放源代碼的模式,其原理圖和電路圖都可以從其網(wǎng)站免費得到。在權衡比較了一番之后,我決定從其采用串口方式的版本開始,這一方面是因為原理相對簡單,能夠降低組裝和調試的難度,另一方面則考慮到USB模擬的串口并不總是那么穩(wěn)定。決定開工之后,花了一上午的時間畫好了原理圖,基

69、本湊和吧??奢喌诫娐穲D時可就不一樣了,封裝和走線對我這業(yè)務選手來講的確不是件容易的事情。花了兩個晚上的時間,最后還是決定放棄,因為Arduino官方提供的電路圖在我看來確實比自己布的要漂亮多了,看來這一修養(yǎng)只能在隨后的日子里慢慢積累了。去做電路板時遇到一些問題,由于我問到的制造電路板的廠商基本上只認Protel,根本不知道還有Eagle CAD一說,甚至有人還將其與AutoCAD混為一談,告訴我這個軟件不是用來畫電路圖的。沒有辦法,只好回家一頓Google,將其生成Gerber文件后再將送過去。這一過程也算有點收獲,除了知道何為Gerber文件以及如何在Eagle CAD中

70、生成Gerber文件之外,還找到了一個用來查看Gerber文件的好工具:CAM350。電路板從送去到拿到一般需要一周多的時間,這期間的主要任務當然是購買元器件了。一開始并沒有注意到Arduino串口版本的元件列表,以為與NG版本一樣也采用的是ATmega168,問了好些地方都沒得賣,最好只好高價比香港快遞過來,估計貴了不止一倍。最后在組裝的時候才發(fā)現(xiàn)原來串口版本采用的仍舊是ATmega8,而這在村里還算是很好買到的,這一個郁悶?。≡紲蕚渫桩斨?,電路板也做出來了,雖然不是與Arduino官方一致的藍色,但還是挺漂亮的;-)將元件焊接到PCB板上又是一次對基本功的訓練,好在這一版本的Ardu

71、ino采用的都是分立元件,焊接上沒有遇到太大的麻煩。期間再一次深刻體會到了工具的重要性,不時幻想自己手中那把最便宜的鉻鐵啥里也能更新?lián)Q代一下,雖然他的壽命還不到短短的一個月。焊接完成之后,萬里長征估計還只完成了第一步,要讓Arduino能夠正常的運行起來,肯定還有相當多的調試和排錯的工作要做,而這也正是DIY的樂趣所在;-)Arduino 電子積木 專用傳感器擴展板 V4真沒想到,一塊傳感器擴展板居然被我改到了第四版,而且估計還會繼續(xù)修改下去。最初的傳感器擴展板在設計的時候,只考慮到了如何將數(shù)字傳感器和模擬傳感器很方便地連接起來。因此在最初定義數(shù)字傳感器線序的時候,沒有更多可以參照的地方,直到后來有人提出是否可以考慮與伺服電機(舵機)的連線順序一樣,我才很認真地考慮這一問題,并且在最新的V4版本上采用,原因在于:· 可以很方便地與舵機相連 · 不容易出現(xiàn)短路的情況,在接錯錢時不會有很嚴重的后果 · 可以與模擬傳感器接口統(tǒng)一起來,保持通用 用這么多的好處,自然是忍不住在V

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論