這篇是LED顯示應用的最後一篇,來說說酷炫的三色 RGB LED,關於這種的LED控制方法與前面提到的LED ON/OFF機制大不相同,Uno的操作腳位也有一些限制,我們就來看看該如何正確的使用吧!
1. RGB LED原理
RGB LED跟一般的LED最不一樣的地方就是它是擁有4支腳的零件,每支腳分別代表R、G、B、共用,我們以SparkFun Electronics( https://www.sparkfun.com/ ) 網站上所販售的LED為例,其datasheet所提供的圖面如下:
RGB LED怎麼控制顏色?來複習學校老師教過光的三原色理論,一個顏色可以由紅色、綠色、藍色所組成,所以顏色表示方法可拆分為RGB的各個顏色比例組成,也就是說如果RGB的百分比分別都是0%,那顏色就是黑色,如RGB各比例都是100%,顯示的顏色就是白色,RGB元件就是根據這種理論來控制需要顯示的顏色。簡單的說,如果我們可以控制各個腳位輸出的電壓比例,也就可以進行顏色控制了。
至於共用腳的定義跟7段顯示器一樣,有共陽或共陰兩種,取決於購買的類型,此次我們這邊會使用共陰來進行實驗,也就是我們會透過Uno輸出電壓控制。
2. PWM 輸出
利用Arduino內建的PWM輸出功能,就可以滿足單位時間內的比例控制,這邊順便來解釋什麼是PWM。PWM全名是Pulse Width Modulation,中文為脈衝寬度調變,其實就是脈波控制啦!如何產生脈波的原理機制各家晶片都會略有不同,但實際的脈波輸出都是類似的,引用Arduino官方解釋PWM的圖來說明:(https://www.arduino.cc/en/Tutorial/PWM)
這邊我們只要記住一個專有名詞就好Duty Cycle,Duty Cycle定義為輸出ON時間與『週期時間』的百分比。
舉上圖的25% DutyCycle為例,縱軸為輸出電壓,5V為HIGH,0V為LOW,橫軸為時間,每個綠色標線為單位週期時間T,假設輸出HIGH 5V的時間為t,所以25%的Duty就是t/T=25%,其他數字也就以此類推,各位朋友這樣有比較瞭解了嗎?
順便帶個題外話,有些朋友會問說,這樣的控制技術可以用在什麼地方?最常見的就是電壓控制,如DC馬達的轉速控制、穩壓電路的控制等,也可以做電流控制喔!如LED燈具的亮度控制等。
Arduino Uno內建PWM的電壓輸出剛好可以拿來做RGB LED元件顏色比例調整,分別將RGB三隻腳設定 PWM輸出,並設定其比例就可以完成。Uno的PWM並不是每隻Pin都可以產生,只有標有『~』圖示才可以,觀察Uno控制板的文字面可以知道,編號3、5、6、9、10、11共6支腳才可以,所以這是在連接電路時須注意的。
3. Arduino PWM小知識
這邊補充一下小知識,Uno設定有6支數位腳位可以輸出PWM,可能有朋友會好奇預設的PWM週期(也就是吉米哥上節提到的T)是多少? 其實在底層韌體是透過內部的Timer設定為三組,分別為腳位編號5和6一組,編號9和10一組,編號11和3一組,編號5,6這組最重要,因為是連動到系統的delay()功能,PWM頻率為976.5Hz,另兩組(9.10.11.3)為490.1Hz,如果想要修改預設頻率是可以的,就需要動到修改Timer的Prescale的數值,後續如果需要的話,我這邊再來寫一篇細部修改的文章給大家參考。
4. 電路接法
回到本次電路的連接,這次做的實驗很簡單,只須將RGB LED的元件分別連上Uno帶有PWM輸出的Pin腳,記得要接上限流電阻與共用接地即可,Tinkercad電路完整接法如下:
小提醒:電阻可以設定為220 Ohms。
5. 程式功能
+ 原始程式碼
#define RLED 10
#define GLED 9
#define BLED 3
void setup() {
// put your setup code here, to run once:
pinMode(RLED,OUTPUT);
pinMode(GLED,OUTPUT);
pinMode(BLED,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
analogWrite(RLED,255);
analogWrite(GLED,255);
analogWrite(BLED,255);
delay(800);
analogWrite(RLED,100);
analogWrite(GLED,0);
analogWrite(BLED,0);
delay(800);
}
+ 程式講解
- 第1行-第3行:定義RGBLED跟Arduino連接的三隻腳位,分別為編號10、9、3。
- 第5行-第10行:在setup()內,設定這三隻腳為數位輸出。
- 第14行-第17行:利用analogWrite()這個函數,分別設定為R255、G255、B255的輸出,因為PWM輸出值可設定範圍為0-255,255最大,0是最小,所以,換算成百分比就是R100%、G100%、B100%,顏色為白色,並加上delay 800ms功能。
- 第19行-第22行:這邊設定R100、G0、B0為輸出顏色,換算成百分比就是R39%、G0、B0,一樣加入delay的機制。
6. 小結&懶人包
這次的Code為利用RGB LED顯示兩種不同的顏色,並加入時間延遲達到閃爍的功能,各位朋友也就可以快速利用這個範例,加入自己的應用中,並修改出所想要的顏色,最後附上懶人包連結(Arduino ino File):
下載連結 😀 ⇒ 205-RGB-LED.ino