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 10
4
5// For led chips WS2812 DATA_PIN (Din).
6#define DATA_PIN 6
7// Define the array of leds
8CRGB leds[NUM_LEDS];
9
10void setup() {
11 FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);
12 // GRB ordering is typical
13
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
也可以。
xxxxxxxxxx
501#include <FastLED.h>
2
3#define LED_PIN 6
4#define NUM_LEDS 10
5#define BRIGHTNESS 64
6#define LED_TYPE WS2811
7#define COLOR_ORDER GRB
8CRGB leds[NUM_LEDS];
9
10#define UPDATES_PER_SECOND 100
11
12CRGBPalette16 currentPalette;
13TBlendType currentBlending;
14
15extern CRGBPalette16 myRedWhiteBluePalette;
16extern const TProgmemPalette16 myRedWhiteBluePalette_p PROGMEM;
17
18void setup() {
19 delay( 3000 ); // power-up safety delay
20 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
,也可以自己定義的。