2.4 RGB LED with WS2811 driver原理RGB colorRGB LED 燈LED 陣列WS2811 LED DRIVER下載外掛libraryLED獨立控制電路圖程式碼說明預設彩虹燈電路圖程式碼說明
**三原色光模式(RGB color model),又稱RGB顏色模型或紅綠藍顏色模型,是一種加色模型,將紅(Red)、綠(Green)、藍(Blue)三原色的色光以不同的比例相加,以合成產生各種色彩光。 -- 維基百科

跟 RGB 的原理一樣,要利用 LED 重現彩色的世界,例如 OLED 電視,戶外的大型 LED 廣告牌等等,就需要用到 RGB LED 燈。
有點電子製作經驗的人都知道,LED 是一隻有極性的兩腳小元件,所以紅、綠、藍三色即有 3 顆 LED燈組成在一起。
為減少引腳,一般分為共正 ( 正極相連 ) 和共負 ( 負極相連 )。所以每顆 RGB 燈共有 4 隻 引腳,即使是貼片式的也不例外。如果要組成 60 顆燈珠的指針時鐘,每顆燈要能獨立控制,用並聯的方式就最少需要 181 條引線 (60 紅+60 綠 +60 藍 +1 共負 ),微控制器亦需要 181 隻獨立控制腳,如果是更大型的 LED 廣告牌和顯示器,引腳數目就更誇張,可以想像製作過程要花相當大的功夫。


為減少引腳,前人就想到了用掃瞄式的 LED 陣列。
LED 陣列就是將 LED 排成方陣,將每個橫行的負腳相連,再將每個直列的正腳相連,所以單色 8x8 的LED 陣列只有 16 隻引腳,而三色的 8x8 陣式只有 32隻引腳。
使用時,例如只要將 2 列 3 行供電,對應的LED(2,3) 就會亮。 如要同時再亮 LED(4,7), 理論上就給 2 列、4 列供正電源,3 行、7 行接負極即可。但問題是,如果按照這樣供電,LED(2,7) 和 LED(4,3) 也會同時亮起來。
為了使 LED 看起來能每顆獨立控制,就要用掃瞄式的顯示。方法是每一個時間點只控制一直列或一橫行的 LED 燈,只要時間點分得夠細,看起來就好像每顆燈都能獨立受控。市面上常見的 LED 顯示,例如巴士上方和旁邊的目的地顯示牌,就是用這方法顯示的。


對於 RGB 顯示來說,即使掃瞄式顯示可以大幅減少引腳數目,在大型項目來說還是很多。而且並非所有專案都適合使用陣列。
例如製作時鐘就並不適合,因所有的燈都是一直線的,如果用陣列式去佈線,燈與燈之間的引線一樣很複雜,一樣會有厚厚的電線紮。而且由於燈的位置並非方陣,在編程時就更 加困難。
所以市面上有種積體電路,專門針對 3 色 LED,每色有 256 個亮階,在控制時只需要一根訊號線就可以通訊和控制,大大減少引腳。其中一種就是ws2811。
而隨著科技的進步,積體電路能夠做到更加細少,現時已經不再需要一顆額外的 IC,因為有一種市售的 5050( 即 5mm x 5mm) 貼片式 RGB 燈珠,在小小的面積上已整合了 w2811 電路,製作成燈帶一卷一卷的出售。有些廠商例如 Adafruit 就製作成環形等特別形態出售。



打開Arduino 1.8以上的版本,開啟Library Manager(教學),搜尋FastLED,就可以找到作者為Daniel Garcia的library,按下安裝就可以。

ws2812 LED是有信號方向性的,尤其是燈帶,不要搞錯,signal要接在Din腳,+5V接正電源,如果只需要亮少量的燈,直接接Arduino 的5V也可以。
x1#include <FastLED.h>2// How many leds in your strip?3#define NUM_LEDS 104
5// For led chips WS2812 DATA_PIN (Din).6#define DATA_PIN 67// Define the array of leds8CRGB leds[NUM_LEDS];9
10void setup() {11 FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);12 // GRB ordering is typical13
14 FastLED.setBrightness(127);15}16
17void loop() {18
19 for (int i = 0; i < NUM_LEDS; i++) {20 leds[i] = CRGB(255, 0, 0);21 FastLED.show();22 delay(100);23 }24
25 for (int i = 0; i <= NUM_LEDS; i++) {26 leds[i] = CRGB(0, 255, 0);27 if (i >= 1) leds[i - 1] = CRGB(0, 0, 0);28 FastLED.show();29 delay(500);30 }31
32
33 for (int i = 0; i <= NUM_LEDS; i++) {34 leds[NUM_LEDS-i-1] = CRGB(0, 0, 255);35 leds[NUM_LEDS-i] = CRGB(0, 0, 0);36 FastLED.show();37 delay(500);38 }39}#define NUM_LEDS 10 : 定義有多少盞LED燈。
#define DATA_PIN 6 : 指定 6腳為Data(Din)腳,也可以使用其他Arduino的腳位,即使A0-A5也可以用。
FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS); : 注意是GRB而不是RGB,是刻意的,典型的WS2811和WS2812也是紅和綠相反的。
FastLED.setBrightness(127); : 用來調節LED的光亮度,數值由0至255,如果無需調節,也可以不用打這一句。
FastLED library其實有預設的彩虹燈等Palette是非常適合做觀賞燈的。

ws2812 LED是有信號方向性的,尤其是燈帶,不要搞錯,signal要接在Din腳,+5V接正電源,如果只需要亮少量的燈,直接接Arduino 的5V也可以。
xxxxxxxxxx501#include <FastLED.h>2
3#define LED_PIN 64#define NUM_LEDS 105#define BRIGHTNESS 646#define LED_TYPE WS28117#define COLOR_ORDER GRB8CRGB leds[NUM_LEDS];9
10#define UPDATES_PER_SECOND 10011
12CRGBPalette16 currentPalette;13TBlendType currentBlending;14
15extern CRGBPalette16 myRedWhiteBluePalette;16extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;17
18void setup() {19 delay( 3000 ); // power-up safety delay20 FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);21 FastLED.setBrightness( BRIGHTNESS );22 23 currentPalette = RainbowColors_p;24 //currentPalette = RainbowStripeColors_p;25 //currentPalette = CloudColors_p;26 //currentPalette = PartyColors_p;27 28 currentBlending = LINEARBLEND;29 //currentBlending = NOBLEND;30}31
32void loop() {33 34 static uint8_t startIndex = 0;35 startIndex = startIndex + 1; /* motion speed */36 37 FillLEDsFromPaletteColors( startIndex);38 39 FastLED.show();40 FastLED.delay(1000 / UPDATES_PER_SECOND);41}42
43void FillLEDsFromPaletteColors( uint8_t colorIndex) {44 uint8_t brightness = 255;45 46 for( int i = 0; i < NUM_LEDS; i++) {47 leds[i] = ColorFromPalette(currentPalette, colorIndex, brightness, currentBlending);48 colorIndex += 3;49 }50}詳細的demo,可以在file --> Example --> FastLED --> ColorPalette 中找到,但其程式有點長和複雜,我將其簡化了一下。
22行currentPalette = RainbowColors_p; : FastLED內置了幾個Palette,分別為RainbowColors_p, RainbowStripeColors_p, CloudColors_p, PartyColors_p,也可以自己定義的。