第 04 章 - 三色 LED 與可調電阻
上次更新日期 2022/09/29
上個章節談到了 LED 燈,事實上,還有一種 LED 燈是有三種顏色訊號的,你可以進一步調配光源,產生你想要的顏色資訊。 另外,除了固定的電阻之外,其實還有一種旋鈕式的電阻,通過該電阻,我們可以控制輸入的電力資訊, 甚至可以進一步影響到不同的光源或動作~那麼,接下來就讓我們來玩一玩這有趣的小玩具!
學習目標:
- 了解三色 LED 硬體配置
- 使用 arduino 控制三色 LED 燈
- 增加可調電阻影響 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 燈的 RGB 腳位搭配到電阻器,有兩種接法,一種是使用 3 個電阻,分別接在 arduino 腳位上,再接到 LED 的 RGB 上面, 而接地則直接接在接地針腳上。另一種接法則是將接地透過電阻器,其他三個直接接到 arduino 上!這樣也是可以的。 只是,在傳統的接法上,似乎從供電處提供電阻會比較容易防止設備燒毀喔~所以,以下我們以三個電阻來進行連接!同時,因為要使用變動式電力, 因此使用 9, 10, 11 三個腳位來連接喔!
- 取得所需要的物件:
- 一個四腳三色 LED 燈
- 三個電阻器
- 四條一公一母杜邦線
- 開始連線:
- 先將三色 LED 燈的 4 隻腳安插在不同群組的麵包板上面
- R, G, B 相同群組上面安插電阻器,電阻器的另一腳安插到另一邊上
- R, G, B 電阻器分別安插到 D9, D10, D11 上面(可變動電力腳位)
- 接地的腳位直接以杜邦線連到 arduino 接地上
- 設計 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 秒
很快的,你的三色 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) 來取得這幾個數字喔!
- 以 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.3: 使用可變電阻
可變電阻挺有趣的!請在百寶袋裡面拿出一個旋鈕狀的物品,將旋鈕尖端對著自己,三隻腳朝地下,左側的接腳是 5V 供電進入入, 右邊的接腳則是接地,中間則是 5V 在這過程當中的削減,數值預設會從 0 到 1023 之間 (2 的 10 次方)。 讓我們簡單的來測試一下讀出可變電阻中間的數值看看。另外,由於中間的腳位是由旋鈕的類比輸出結果, 所以,你必須要將針腳安插在 A0~A7 之間才行!不可以是數位輸出的 D0 ~ D13 喔~要注意!要注意!
- 連線方式:
- 將可變電阻三隻腳,分別安插到不同組別的麵包板當中,並將旋鈕面對自己
- 將 arduino 5V 針腳連接到可變電阻左側的同組麵包板上
- 將 arduino 接地的針腳連接到可變電阻右側同組麵包板上
- 將 arduino A1 的腳位連接到可變電阻中間同組麵包板上
- 設計 IDE 程式:
- 在全域變數中,設定 pot 為可變電阻腳位,定義為整數 1
- 在 setup() 函數中,指定 Serial.begin,同時指定 pinMode(pot,INPUT),注意,是輸入
- 在 loop() 函數中:
- 使用 int val = analogRead(pot) 取得數值
- 使用 Serial.println 的方式,將數值列印到序列埠上
- 最好有個延遲 1 秒之類的
- 使用可變電阻影響 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 之間的浮點數了!
- 連線方式:就是將 3 色 LED 控制放上來,搭配可變電阻,兩個例題的連線放在同一個麵包板上面,但是不要互相干擾!
- 程式設計:
- 設計一個自訂函數,假設名稱為 getvol(),其型態為浮點數,透過剛剛上面的轉換範例,回傳 0~1 之間的浮點數。
- 在原本的 loop() 函數內,計算完 rr, gg, bb 之後,增加底下的功能:
- 設計 float vol = getvol() 這樣的方式取得 0~1 之間的數據
- 使用類似: rr = int( float(rr) * vol ); 這樣的算式,讓亮度隨可變電阻而改變
當你調整旋鈕時,3 色 LED 燈的亮度就會跟著改變了!這就是一般可變電阻的處理方式喔!
4.4: 課後作業
設計名為 code-resis-3 的程式,參考底下這篇網路部落格的說明,設計一個可讓 3 色 LED 燈漸變 (code-3led-2) 閃爍速度 (delay) 在 10ms 到 200ms 之間變化的情境。
基本上,應該用到 map 這個函數,而且在調整可變電阻的旋鈕時,LED 的閃爍速度會改變才對!其他相關數值請自行調整即可。
4.5: 參考資料
- 三色 LED 燈圖示說明:https://2blog.ilc.edu.tw/868/44309/
- 三色 LED 燈的接法與程式碼:https://sites.google.com/view/rayarduino/rgb-led
- 可變電阻說明:https://hackmd.io/@yizhewang/SkGyJJv4N