arduino 官網 arduino uno

Arduino 物聯網應用 - 上課教材

動畫互動網頁程式設計 > 課程內容 > 第 04 章 - 三色 LED 與可調電阻

第 04 章 - 三色 LED 與可調電阻

上次更新日期 2022/09/29

上個章節談到了 LED 燈,事實上,還有一種 LED 燈是有三種顏色訊號的,你可以進一步調配光源,產生你想要的顏色資訊。 另外,除了固定的電阻之外,其實還有一種旋鈕式的電阻,通過該電阻,我們可以控制輸入的電力資訊, 甚至可以進一步影響到不同的光源或動作~那麼,接下來就讓我們來玩一玩這有趣的小玩具!

學習目標:

  1. 了解三色 LED 硬體配置
  2. 使用 arduino 控制三色 LED 燈
  3. 增加可調電阻影響 LED 燈的展示

4.1: 認識三色 LED 燈與 arduino 調整式電力腳位

除了單一顏色的 LED 燈之外,其實還有可以控制 RGB 三原色的三色 LED 燈喔!這種燈若搭配可調整的電力輸出, 那麼,就以搭配成為多種特殊顏色的燈光了!一顆燈可以玩很久~顏色也能夠做比較多的變化!

  • arduino 數位腳位的可變動電力

在前一章我們有提到可調整電力的 arduino 腳位,那就是 D3, D5, D6, D9, D10 與 D11,在arduino nano 上面, 最靠近在一起的就是 9, 10, 11 了,因此,許多接腳設計都會使用到這三個腳位的原因就是這樣,串在一起接比較方便。

  • 三色 LED 燈

三色 LED 燈使用的就是電腦的三原色,那就是 RGB (紅綠藍)。若在加上接地線,那麼就總共有 4 個針腳了!這個三色 LED 燈可以查看一下底下的圖示, 該圖示來自 https://2blog.ilc.edu.tw/868/44309/ 網頁的圖示內容。 感謝廣大的網友們。要注意的是,最長針腳通常是用來接地使用,因此其他 RGB 三個腳位則是接在數位 arduino 針腳上面。

三色 LED 燈示意圖

基本上,三色 LED 燈的 RGB 腳位搭配到電阻器,有兩種接法,一種是使用 3 個電阻,分別接在 arduino 腳位上,再接到 LED 的 RGB 上面, 而接地則直接接在接地針腳上。另一種接法則是將接地透過電阻器,其他三個直接接到 arduino 上!這樣也是可以的。 只是,在傳統的接法上,似乎從供電處提供電阻會比較容易防止設備燒毀喔~所以,以下我們以三個電阻來進行連接!同時,因為要使用變動式電力, 因此使用 9, 10, 11 三個腳位來連接喔!

例題 4.1.1:點亮三色 LED 燈
  1. 取得所需要的物件:
    • 一個四腳三色 LED 燈
    • 三個電阻器
    • 四條一公一母杜邦線
  2. 開始連線:
    • 先將三色 LED 燈的 4 隻腳安插在不同群組的麵包板上面
    • R, G, B 相同群組上面安插電阻器,電阻器的另一腳安插到另一邊上
    • R, G, B 電阻器分別安插到 D9, D10, D11 上面(可變動電力腳位)
    • 接地的腳位直接以杜邦線連到 arduino 接地上
  3. 設計 IDE 程式:
    • 規劃三個全域變數的整數,分別是 ledr, ledg, ledb,設定為 9, 10, 11
    • 在 setup() 函數中,分別使用類似 pinMode(ledr, OUTPUT) 設定好腳位為輸出
    • 在 loop() 函數中:
      • 使用 digitalWrite(ledr, HIGH) 搭配 ledg, ledb 為 LOW 設計為紅燈
      • 延遲 1 秒
      • 使用 digitalWrite(ledg, HIGH) 搭配 ledr, ledb 為 LOW 設計為綠燈
      • 延遲 1 秒
      • 使用 digitalWrite(ledb, HIGH) 搭配 ledr, ledg 為 LOW 設計為藍燈
      • 延遲 1 秒
設計完畢後,燒錄並上傳,檔名設定為 code-3led-1 即可。

很快的,你的三色 LED 燈光就可以順利的展示出三種顏色了!每種顏色都可以延遲一秒鐘~如果你要分別展示交通號誌的紅、黃、綠燈, 黃色使用紅、綠色,藍色強度為 LOW 即可展示為黃色~

4.2: 亂數與顏色漸變

上面都是整個燈號全亮/全暗的模樣!如果需要動到不同顏色強度的搭配,就是一般我們設計網頁時候使用的色碼, 例如 #FFFF00 代表黃色等等 (RRGGBB, 共 3 位元,最小 000000, 最大 FFFFFF) 這時,就得要使用 0~255 的顏色強度, 然後,需要使用 D3, D5, D6, D9, D10, D11 這些可變電力強度的腳位,之後,不能使用 digitalWrite 了, 要使用 analogWrite 的方式來寫入強度!強度就是從 0 到 255 囉!例如:

analogWrite(ledr, 200);

我們在第二章講過亂數的處理,那就是透過 random(min,max) 的方式來處置,而輸出的數字會在 min ~ (max-1) 的範圍內。 而為了讓強度的變化較為明顯,我們可以使用 0, 51, 102, 153, 204, 255 這 6 個數值來處理顏色,這個 51 的區間, 是為了以前老舊螢幕的網頁安全色的色碼區間~實際上,可以使用 51 * random(0,6) 來取得這幾個數字喔!

例題 4.2.1:利用剛剛做好的線路,直接將 code-3led-1 儲存成為 code-3led-2,在 loop() 函數中
  • 以 int rr = 51 * random(0,6) 的方式猜測 R 的強度
  • 同時猜測出 gg, bb 的強度
  • 最後將三個強度輸出到 USB 序列埠之外
  • 也使用 analogWrite 修改 3 色 LED 燈的顏色!
  • 延遲改為 5 秒或 10 秒~比較好觀察顏色與色碼的對應!
  • 顏色漸變功能

要讓顏色漸變,舉例來說,讓 R 從 255 變成 0 ,同時讓 G 從 0 到 255,兩者的關係就是 G = 255 - R 這樣。 當 R 變成 0 而 G 變成 255 時,就開始 B = 255 - G,而 G 從 255 降為 0 這樣。因為不論是 R 還是 G, B 都是一個獨立的循環, 簡單寫,可以寫成三個 for 迴圈,如下所示:

rr = 255;
for ( int i=0, i<=5, i++ ) {
  gg = 51 * j ;
  rr = 255 - gg ;
  analogWrite(ledr,rr);
  analogWrite(ledg,gg);
  delay(100);
}

將上面的成果做出三次,就可以進行漸變的功能了!

例題 4.2.2:利用剛剛做好的線路,直接將 code-3led-2 儲存成為 code-3led-3,開始在 loop() 內,依據上述的說明, 設計出三個迴圈,每個迴圈內均延遲 0.1 秒,處理完畢之後燒錄上傳即可。

4.3: 使用可變電阻

可變電阻挺有趣的!請在百寶袋裡面拿出一個旋鈕狀的物品,將旋鈕尖端對著自己,三隻腳朝地下,左側的接腳是 5V 供電進入入, 右邊的接腳則是接地,中間則是 5V 在這過程當中的削減,數值預設會從 0 到 1023 之間 (2 的 10 次方)。 讓我們簡單的來測試一下讀出可變電阻中間的數值看看。另外,由於中間的腳位是由旋鈕的類比輸出結果, 所以,你必須要將針腳安插在 A0~A7 之間才行!不可以是數位輸出的 D0 ~ D13 喔~要注意!要注意!

例題 4.3.1:讀出電阻內的數值
  1. 連線方式:
    • 將可變電阻三隻腳,分別安插到不同組別的麵包板當中,並將旋鈕面對自己
    • 將 arduino 5V 針腳連接到可變電阻左側的同組麵包板上
    • 將 arduino 接地的針腳連接到可變電阻右側同組麵包板上
    • 將 arduino A1 的腳位連接到可變電阻中間同組麵包板上
  2. 設計 IDE 程式:
    • 在全域變數中,設定 pot 為可變電阻腳位,定義為整數 1
    • 在 setup() 函數中,指定 Serial.begin,同時指定 pinMode(pot,INPUT),注意,是輸入
    • 在 loop() 函數中:
      • 使用 int val = analogRead(pot) 取得數值
      • 使用 Serial.println 的方式,將數值列印到序列埠上
      • 最好有個延遲 1 秒之類的
編譯並燒錄到 arduino 上,然後打開序列埠,然後旋轉旋鈕,你會發現數值會在 0~1023 之間變化的!
  • 使用可變電阻影響 3 色 LED 燈光

另外,如果需要將可變電阻的數值轉成 LED analogWrite 可接受的數值,就是在 0~255 之間時, arduino 提供一個簡單的整數對應!那就是 map 這個函數!如果要將這個函數把 0~1024 對應 (map) 到 0~255 之間時, 這個函數的使用有點像底下這樣:

// map(變數, 取得最小, 取得最大, 輸出最小, 輸出最大)
int newvar = map(var, 0, 1023, 0, 255);

這樣,我們就可以將數據轉成 0~255 之間!也就可以讓 LED 燈直接有數值了。不過,如果要讓可變電阻輸出的資料成為 0~1 之間的浮點數呢? 可能就得要樣才行:

int val = analogRead(pot);
float vol = float(val)/1024.0;

這樣就可以將可變電阻取得的數值轉成 0~1 之間的浮點數了!

例題 4.3.2:將 code-3led-2 以及剛剛的 code-resis-1 結合,然後儲存成為 code-resis-2 的程式:
  1. 連線方式:就是將 3 色 LED 控制放上來,搭配可變電阻,兩個例題的連線放在同一個麵包板上面,但是不要互相干擾!
  2. 程式設計:
    • 設計一個自訂函數,假設名稱為 getvol(),其型態為浮點數,透過剛剛上面的轉換範例,回傳 0~1 之間的浮點數。
    • 在原本的 loop() 函數內,計算完 rr, gg, bb 之後,增加底下的功能:
      • 設計 float vol = getvol() 這樣的方式取得 0~1 之間的數據
      • 使用類似: rr = int( float(rr) * vol ); 這樣的算式,讓亮度隨可變電阻而改變
程式編譯並燒錄到 arduino 上。

當你調整旋鈕時,3 色 LED 燈的亮度就會跟著改變了!這就是一般可變電阻的處理方式喔!

4.4: 課後作業

設計名為 code-resis-3 的程式,參考底下這篇網路部落格的說明,設計一個可讓 3 色 LED 燈漸變 (code-3led-2) 閃爍速度 (delay) 在 10ms 到 200ms 之間變化的情境。

基本上,應該用到 map 這個函數,而且在調整可變電阻的旋鈕時,LED 的閃爍速度會改變才對!其他相關數值請自行調整即可。

4.5: 參考資料