WS2812 RGB LED是具有內建驅動晶片功能的LED, 亦是使用5050 LED封裝加入驅動晶片, 驅動方式採串列進出, 因此可獨立控制串接LEDs的每一顆LED.
每個一R/G/B顏色可獨立控制,且每一個顏色可調整0~255階調,因此每一個顏色需用到8bit控制,每一顆LED需用到24bit控制.
VDD電壓為6.0V~7.0V, 但實際操作使用5V可正常驅動.
操作時序
1個Colck週期的0或1的正負周期有規範
由於是採串列控制,因此每個LED需使用24bit控制,整串LED的data傳送完再執行Rest code.
另外,這個LED晶片具有保持功能, 當電源未斷電的狀態下, 如果沒有提供輸入訊號, LED燈會保持在最後控制當下.
所以在控制時,有時需做清除的動作,才不會殘留上一次操作的顏色.
1.硬體操作
控制板:Arduino UNO
材料: WS2812 LED
2.I/O規劃與Library
(1) 1個輸出控制腳位,作為控制LED。
(2) Arduino example: light_ws2812
3.程式
light_ws2812 example Blinky
#include WS2812 LED(1); // 1 LED cRGB value; void setup() { LED.setOutput(9); // Digital Pin 9 } void loop() { value.b = 255; value.g = 0; value.r = 0; // 設定RGB顏色 0-255 LED.set_crgb_at(0, value); // 設定第1顆LED的RGB顏色,這個範例只能控制第1顆. LED.sync(); // 輸出資料至LED delay(500); // Wait 500 ms value.b = 0; value.g = 0; value.r = 255; // RGB Value -> Red LED.set_crgb_at(0, value); // Set value at LED found at index 0 LED.sync(); // Sends the value to the LED delay(500); // Wait 500 ms }
light_ws2812 example fade_rgb
#include #define outputPin 7 // Digital output pin (default: 7) 設定輸出至LED燈串的腳位 #define LEDCount 9 // Number of LEDs to drive (default: 9) LED控制數量 WS2812 LED(LEDCount); cRGB value; byte intensity; byte sign; void setup() { LED.setOutput(outputPin); // Digital Pin 7 //這裡是設定RGB排列方式 //LED.setColorOrderRGB(); // Uncomment for RGB color order //LED.setColorOrderBRG(); // Uncomment for BRG color order //LED.setColorOrderGRB(); // Uncomment for GRB color order (Default; will be used if none other is defined.) intensity = 0; //階調 sign = 1; } //0-255階調變化 void loop() { int i = 0; if (sign) { intensity++; if (intensity == 255) sign = 0; } else { intensity--; if (intensity == 0) sign = 1; } //3顆LED分別顯示R/G/B依此循環整串LED while (i < LEDCount){ if ((i % 3) == 0) { // First LED, and every third after that value.b = 0; value.g = 0; value.r = intensity; // RGB Value -> Red Only LED.set_crgb_at(i, value); // Set value at LED found at index 0 } else if ((i % 3) == 1) { // Second LED, and every third after that value.b = 0; value.g = intensity; value.r = 0; // RGB Value -> Green Only LED.set_crgb_at(i, value); // Set value at LED found at index 0 } else { // Third LED, and every third after that value.b = intensity; value.g = 0; value.r = 0; // RGB Value -> Blue Only LED.set_crgb_at(i, value); // Set value at LED found at index 0 } i++; } LED.sync(); // Sends the data to the LEDs delay(10); // Wait (ms) }
=主程式簡化=
void loop() { int i = 0; if (sign) { intensity++; if (intensity == 255) sign = 0; } else { intensity--; if (intensity == 0) sign = 1; } //3顆LED分別顯示R/G/B依此循環整串LED while (i < LEDCount){ value.r = intensity*((i%3)%2); value.b = intensity*(((i+1)%3)%2); value.g = intensity*(((i+2)%3)%2); LED.set_crgb_at(i, value); i++; } LED.sync(); // Sends the data to the LEDs delay(10); // Wait (ms) }
時序分析
從時序規則來看, 上升緣為觸發條件.
0 code的正週期較窄(0.35us)負週期較寬(0.8us).
1 code的正週期較寬(0.7us)負週期較寬(0.6us).
設R=170(0b10101010) G=0 B=0
設R=0 G=170(0b10101010) B=0
析設R=0 G=0 B=170(0b10101010)
因此這組LED採GRB控制順序
Uncomment for GRB color order (Default; will be used if none other is defined.)
Bit 1 正880ns 負430ns (1.31us)
Bit 0 正320ns 負1000ns (1.32us)
留言列表