2011年2月13日 星期日

Arduino 筆記 – 透過 Serial 通訊控制 LED

從前一篇「Serial Library 介紹」中,我們已經知道可以用 Serial.read() 讀取 Serial Port 的資料,而且我們也知道了讀取 Serial Port 的一般寫法,也就是 --- 使用 Serial.available() 來檢查 Serial port 是否有資料進來,然後再使用 Serial.read() 把資料讀取出來放到變數中供後續的運用,像這樣:

接著,來做個簡單的練習,練習使用 Arduino 的 Serial 通訊。

實驗目的

練習使用 Serial 通訊。透過 Serial 通訊控制 5 顆 LED,根據 Serial 輸入進來的字元 (字元 1 到 5)決定不同顆 LED 的開關,字元 1 打開第 1 顆 LED,字元 2 打開第 2 顆 LED,以此類推。

材料
  • 麵包板 x 1
  • Arduino 主板 x 1
  • LED x 5
  • 220 ohm 電阻 x 5
  • 單心線 x N
接線
  • 將 5 顆 LED 分別接到 pin 2 到 pin 6 這 5 支接腳 。LED 的接法為: 長腳(陽極)接到 pin 腳,短腳(陰極)串接一顆 220 ohm 電阻接到 GND

image

電路圖

2011-02-13 16h30_00

程式碼

程式版本一(switchCase.pde),:

程式的邏輯很簡單,在利用 Serial.available() 檢查 Serial Port 發現有資料可供讀取時,就用 Serial.read() 把資料讀取進來放到 inByte 變數中,然後再判斷 inByte 根據收到的字元決定該打開哪一顆 LED,假如輸入的字元是 1 到 5 以外的字元,程式就會把所有 LED 都關掉。這邊判斷字元與打開不同顆 LED 的方法是利用 Switch Case 結構:

因為輸入的字元跟 LED 接腳的對應關係是有規則可循的,字元 1 至 5 對應到 pin 2 至 pin 6,因此,當收到 1 到 5 之中的一個字元時,只要用簡單的數學就可以算出對應的接腳:

所以,我們可以像底下程式版本二(SerialLED.pde)這樣把程式簡化:

然而,不管是寫程式的初學者或經驗老道的高手,我都建議你使用 Switch Case 的寫法,因為使用 Switch Case 程式看起來比較井然有序,比較容易理解。程式效能確實是要考慮的一件事沒錯,不過它並不是全部。

後記

在跑這支程式的時候,用 Serial Monitor 不是很方便,因為用 Serial Monitor 時,在輸入資料後,你得按下 Enter 鍵或是【Send】按鈕,資料才會真正從電腦端送到 Arduino:

image ▲ Serial Monitor

也就是說,如果你要打開第一顆 LED,你得輸入 1 接著按下 Enter 鍵或是【Send】按鈕,然後第一顆 LED 才會打開,要打開其它 LED,也是一樣都要做兩次動作,不是很方便。所以,我建議你使用超級終端機或是 Tera Term 來跑這支程式:

 image

動動腦
  • 這個範例把 5 顆 LED 接在 pin 2 到 pin 6,其實 pin 0 和 pin 1 也是 Digital I/O,這兩支接腳也可以接 LED,這個範例卻跳過不使用這兩支接腳,你知道為什麼嗎?
  • 把 LED 從 5 顆擴充到 7 顆,然後參考「Lab6 控制蜂鳴器發聲」為這支程式加上一顆蜂鳴器,接著修改程式的功能,讓它除了根據輸入進來的字元 (字元 1 到 7)決定不同顆 LED 的開關外,同時也讓蜂鳴器發出中音 Do(523Hz), Re (587Hz), Mi(659Hz), Fa(698Hz), So(784Hz), La(880Hz) 到 Si(988Hz) 這七個不同音階的聲音,讓程式同時具備聲光的效果。
延伸閱讀

2 意見:

阿簡 提到...

一直有在看您的文章,覺得這一系列Arduino筆記實在太棒了,感謝您的熱情分享。

coopermaa 提到...

謝謝您的讚賞。

我之前也有到你的網誌拜訪,看過你寫的 Arduino 文章,你寫的也很棒,而且照片拍的真好。我總覺得自己拍的照片品質很差,看來得找時間下功夫學攝影了,不過有時候我也懷疑是不是我那台傻瓜型數位相機的能力不夠的關係。

你的網誌好有料啊!