本篇來聊聊,Arduino軟體運行的架構.

使用的範例為知名的"Blink"

首先,先準備硬體.

這邊所選擇的是Arduino Nano.其他系列也是大同小異,就不再贅述.

Nano,如下圖.

Nano.jpg

Nnao的硬體架構很簡單,如上圖,那個黑色的正方形就是控制的主角,單晶片.

編號是,ATmega328, 背面還有一顆IC是USB to serial bus的IC.

剩下就是電源電路及LED電路.就這樣.

 

那什麼是USB to serial bus的IC呢?

簡單說,他就是一個電氣轉換的通訊IC.

在不同的硬體間,為了通訊.主要會採用2種方式通訊,一種是無線,一種是有線.

無線用的是微波技術.像是BlueTooth/WIFI/GSM...等.

那微波技術又是什麼!不行,再扯下去,會扯太遠,我還是另闢一篇章來探討好了.哈!

拉回來.

另一種是有線,顧名思義,就是有一條線在硬體和硬體之間,靠著電氣傳輸,來達到通訊目的.

像是USB/HDMI/EtherNet/電話線/第四台...等

每一種都有各自的電氣規格,所以不能互通.就像語言一樣,說中文不能跟英文互通,除非透過翻譯.

以USB隨身碟來說,他只能用USB來跟他通訊.因為它只有USB通訊埠.

以PC來說,你則可以用USB/HDMI/EtherNet來跟他通訊.因為它有這些通訊埠.

以Nano來說,它就是透過USB to serial bus的IC,來跟PC的USB通訊的.

那為何要用USB而不用其他方式跟PC通訊.

是因為工程師在設計產品就必須考量,市場接受度/相容性/成本/使用容易...等特性.

 

回到主角ATmega328這顆單晶片,如下圖.(此圖節錄自 ATmega328P原廠規格書)

ATmega328Pinout.jpg

總共有32隻腳.多為複合腳位.

什麼是複合腳位,以第1隻腳來說它含有PCINT19/OC2B/INT1的多重功能,但一次只能使用一種.

Blink這個程式使用的就是第17腳(PB5/SCK/PCINT5)這隻腳.如下圖(此圖是節錄自Arduino官方,Nano V2的電路圖)

 

 

Blink2.jpg

在Arduino的定義裡,這隻腳為D13.

這隻腳也已預先串接上一顆電阻及發光二極體.

當D13腳輸出高電位(5V)時,電壓經電阻限流,讓足以驅動發光二極體的電流,流過發光二極體,使其發亮.

當D13腳輸出低電位(0V)時,無電壓輸出,即無電流產生.發光二極體保持常態.

這就是D13腳的數位輸出功能.

從上圖來看,D13腳還有數位輸入,及SCK(I2C)的功能,就是所謂的複合腳.不行,再扯下去,會扯太遠,以後有機會再來介紹好了.哈!

數位輸出,就是這隻腳能輸出高電位(5V,或稱為"1")及低電位(0V,或稱為"1"),2種電位.

也可以說是位元(Bit, BitBinary digit(二進位數位)的縮寫 )不行,再扯下去,會扯太遠,以後有機會再來介紹好了.^_^|||

簡單說,就是這隻腳可以輸出高電位,也可以輸出低電位,可以輸入高電位,也可以輸入低電位.

好,就這樣.硬體結束.

 

再來是軟體

這邊使用的是Arduino IDE,不清楚的,可以參考我的另一篇章http://thirtysec.pixnet.net/blog/post/222467340.

裡面的語法是使用C語言.

打開Arduino IDE,後範例原始碼放在,"檔案\範例\01.Basics\Blink"

程式碼如下:(節錄自Arduino IDE,Blink範例)

/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the Uno and
  Leonardo, it is attached to digital pin 13. If you're unsure what
  pin the on-board LED is connected to on your Arduino model, check
  the documentation at http://www.arduino.cc

  This example code is in the public domain.

  modified 8 May 2014
  by Scott Fitzgerald
 */


// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin 13 as an output.
  pinMode(13, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}

 

拿掉不必要的註解後,如下.

void setup()

{
  pinMode(13, OUTPUT);
}

 

void loop()

{
  digitalWrite(13, HIGH);   
  delay(1000);              
  digitalWrite(13, LOW);  
  delay(1000);              
}

void setup()

{

}

void loop()

{

}

是Arduino的主框架,開啟一個空白檔案,裡面就會有這2個函數.

setup() 函數, 是在Nano上電後,第一個執行函數,但僅執行1次.

loop() 函數, 是在setup()函數執行完後,緊接直執行的函數.而且會一直重複執行,直到下電.

pinMode(13, OUTPUT); 這行是說將D13這隻腳, 設定為輸出腳.

                                      只須設定一次,所以放在setup()函數中.

digitalWrite(13, HIGH); 這行是說,D13這隻腳, 輸出高電位.

digitalWrite(13, LOW); 這行是說,D13這隻腳, 輸出低電位.

delay(1000);  這行是說延遲1000 msec(1000微秒),在執行下一行.

 

軟體的執行,就像在讀書一樣,是由上往下一行一行的執行.

所以這範例的動作就是

setup():  1. 設定D13為輸出腳.

loop():    2. 輸出高電位, 使LED亮起來.

loop():    3. 等待1秒

loop():    4.  輸出低電位, 使LED變暗.

loop():    5. 等待1秒

然後跳到2(loop()函數的第一行)重複執行.

 

創用 CC 授權條款
Arduino BlinkPeng Yi Hsing製作,以創用CC 姓名標示-非商業性-禁止改作 3.0 台灣 授權條款釋出。
arrow
arrow

    30sec 發表在 痞客邦 留言(0) 人氣()