
學習目標 : 認識faya串列全彩LED模組的功能及使用方式
學習時間 : 60min
示範模組 : (1) faya brickNano
(2) faya串列全彩LED模組x2~6
工具 : (1) 樂高底板(相容)
====================功能介紹====================
faya串列全彩LED模組上,直直的排列了8顆全彩LED(WS2812),我們把每顆LED當作1個像素(Pixel),該像素擁有2^8 x 2^8 x 2^8 = 16,777,216 種顏色的變化。
模組的外觀如下,8顆LED的電源、地、訊號線皆已串聯,控制此模組時,只需將Din端的VCC、GND、Din接到Arduino,就可以透過程式用一條訊號線控制模組上的8顆LED了,必要時還可以用Dout埠將訊號串接到下一模組的Din埠,增加LED的控制數量,我們在範例中會介紹。

<Adafruit_NeoPixel>所使用的指令如下 [下載點]
- #include <Adafruit_NeoPixel.h>
使用Adarfuit_NeoPixel函示庫時,務必指示此函式
- Adafruit_NeoPixel 物件名稱 = Adafruit_NeoPixel(NUMPIXELS, Neo_Pin, NEO_GRB + NEO_KHZ800);
物件名稱 : 可自行命名
NUMPIXELS : 串接的LED數量
Neo_Pin : 控制腳位
(例) 當我們用Arduino的第二隻腳控制類別名稱為"faya_colorSticker"的串列全彩LED模組上的8顆LED模組時,宣告的程式如下:
Adafruit_NeoPixel faya_colorSticker = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);
- 類別名稱.begin();
(例) faya_colorSticker.begin();
- 類別名稱.setBrightness(brightness);
brightness : 設定每個LED像素的最亮值(0~255),255最亮
(例) faya_colorSticker.setBrightness(50);
- 類別名稱.setPixelColor(n,r,g,b);
n : 選擇第n+1顆LED的顏色,編號從0開始,因此填入0時代表控制第1顆LED
r : 該像素紅色成份的亮度 (0~255)
g : 該像素綠色成份的亮度 (0~255)
b : 該像素藍色成份的亮度 (0~255)
(例) faya_colorSticker.setPixelColor(7,255,255,0);
代表點亮了第8顆LED呈最亮的黃色狀態 (紅+綠=黃)
註: 每個像素的最大亮值會由setBrightness先決定,再由setPixelColor裡的參數決定最終亮度,例如當setBrightness(50)時,每個像素的亮度已經被限制在50的最大亮度,此時如果再下指令setPixelColor(7,128,0,0); 第8顆LED燈會呈現亮度25的紅色 50x(125/255) = 25
- 類別名稱.show();
- 類別名稱.clear();
====================原理知識====================
以下解釋提供給有需要知道背後原理的人:
faya串列全彩LED模組的電路圖如下,由電路圖可看出電源和地的部分已經接到每顆LED,訊號的部分,透過一進一出的方式串接,並且保留最後一個輸出埠Dout,方便串接下一個模組。
每顆LED透過一條控制線就能傳送色彩資訊,由於每顆LED(像素)含RGB三種成份,每個成份具8-bit階層,因此一個像素構成需要24-bit的資料。當傳送了72bit資料時,最初的24-bit會被內建的控制器拿來設定該顆(第一顆)LED,25~48 bit用來設定第二顆LED,49~72 bit用來設定第三顆LED燈。
那麼整個系統如何透過一條訊號線就能定義全部像素資訊呢? 原來每個WS2812內建的控制器,都具備了判斷0與1的協定,如下圖所示,當接收到的資料HIGH的時間較短,LOW的時間較長時,代表傳送的資料為0,當接收到的資料HIGH的時間較長,LOW的時間較短時,帶表傳送的資料為1,HIGH和LOW的時間長短在datasheet都有明確定義,但其實使用者是不太需要擔心的,因為我們用的第三方函示庫都已經把傳送0和1的程式把包好了,我們只要照著.setPixelColor(n,r,g,b)指令,把要控制的LED像素參數填入,系統自統會產生對應的時序,發出該有的像素顏色。
以上大概解釋了串接的WS2812 LED如何運作,有興趣的人,可以參照datasheet!
===================範例實作(1)===================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1) faya串列全彩LED模組依序顯示[紅橙黃綠青藍靛紫]8種顏色的跑馬燈效果
接線:
(1) 電源線連接
如下圖所示,我們可以用faya-母對母電源線,外加兩條單心線,從brickNano的電源座提供5V電源給模組,千萬記得紅色的電源線接到VCC,黑色的電源線接到GND。

(2) 訊號線連接
Arduino_D2 ===> 串列全彩LED模組_Din

範例程式:
(上傳程式前請記得下載[Adafruit_NeoPixel]函示庫,解壓縮並複製整個資料夾到Arduino的Liraries資料夾)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2017/10/18 | |
// Faya-Nugget 範例程式 (Color_Sticker_1.ino) | |
// 單元: 模組介紹:faya串列全彩LED模組 | |
// 網址: https://fayalab.blogspot.com/2017/09/colorsticker.html | |
// 目標: (1) 跑馬燈依序顯示紅橙黃綠青藍靛紫8種顏色 | |
// 接線: Arduino ==> faya模組 | |
// D2 ==> 串列全彩LED_Din | |
#include <Adafruit_NeoPixel.h> | |
#define Neo_Pin 2 //串列全彩LED_Din腳位 | |
#define NUMPIXELS 8 //串列全彩LED數量 | |
Adafruit_NeoPixel faya_colorSticker = Adafruit_NeoPixel(NUMPIXELS, Neo_Pin, NEO_GRB + NEO_KHZ800); | |
void setup() | |
{ | |
faya_colorSticker.begin(); // 初始化NeoPixel函示庫 | |
faya_colorSticker.setBrightness(10); // 亮度設定 (0~255) | |
} | |
void loop() | |
{ | |
faya_colorSticker.setPixelColor(0,255,0,0); //紅 | |
delay(200); | |
faya_colorSticker.show(); | |
faya_colorSticker.setPixelColor(1,255,127,0); //橙 | |
delay(200); | |
faya_colorSticker.show(); | |
faya_colorSticker.setPixelColor(2,255,255,0); //黃 | |
delay(200); | |
faya_colorSticker.show(); | |
faya_colorSticker.setPixelColor(3,0,255,0); //綠 | |
delay(200); | |
faya_colorSticker.show(); | |
faya_colorSticker.setPixelColor(4,0,255,255); //青 | |
delay(200); | |
faya_colorSticker.show(); | |
faya_colorSticker.setPixelColor(5,0,0,255); //藍 | |
delay(200); | |
faya_colorSticker.show(); | |
faya_colorSticker.setPixelColor(6,43,0,255); //靛 | |
delay(200); | |
faya_colorSticker.show(); | |
faya_colorSticker.setPixelColor(7,87,0,255); //紫 | |
delay(200); | |
faya_colorSticker.show(); | |
delay(200); | |
faya_colorSticker.clear(); | |
} |
備註:
- L19 : setBrightness裡的參數可以從0~255,大家可以依據應用填入不同的強度值,近看時30就很亮了,強度較高時請勿用眼睛直視。
- 程式利用Arduino Loop的功能,周而復始的輪流顯示[紅橙黃綠青藍靛紫]8種顏色,顏色的RGB成分配置參考如下圖,大家可以根據自己的喜好修改。
範例結果:
===================範例實作(2)===================
目標:
(1) 利用2組faya串列全彩LED模組依序顯示16種顏色的跑馬燈效果
接線:
(1) 電源線連接
如下圖所示,brickNano和第一組模組的電源連接方式相同,第一組和第二組的電源線透過兩條單心線串聯下去,要記得VCC接到VCC,GND接到GND。

(2) 訊號線連接
如下圖所示,brickNano和第一組模組的訊號線連接方式相同 (D2=>Din),接著把第一組的Dout埠和第二組的Din埠用單心線串起來(圖中為黃色線材)。

範例程式:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2017/10/18 | |
// Faya-Nugget 範例程式 (Color_Sticker_2.ino) | |
// 單元: 模組介紹:串列全彩LED模組 | |
// 網址: https://fayalab.blogspot.com/2017/09/colorsticker.html | |
// 目標: (1) 跑馬燈依序顯示紅橙黃綠青藍靛紫8種顏色 | |
// 接線: Arduino ==> faya模組 | |
// D2 ==> 串列全彩LED_Din | |
#include <Adafruit_NeoPixel.h> | |
#define Neo_Pin 2 //串列全彩LED_Din腳位 | |
#define NUMPIXELS 16 //串列全彩LED數量 | |
Adafruit_NeoPixel faya_colorSticker = Adafruit_NeoPixel(NUMPIXELS, Neo_Pin, NEO_GRB + NEO_KHZ800); | |
int rainbow16[16][3]={{255, 0, 0}, //紅 | |
{255, 85, 0}, //橙 | |
{255, 170, 0}, // | |
{255, 255, 0}, //黃 | |
{127, 255, 0}, // | |
{ 0, 255, 0}, //綠 | |
{ 0, 255, 85}, // | |
{ 0, 255, 170}, // | |
{ 0, 255, 255}, //青 | |
{ 0, 127, 255}, // | |
{ 0, 0, 255}, //藍 | |
{ 85, 0, 255}, //紫 | |
{170, 0, 255}, // | |
{255, 0, 255}, //洋紅 | |
{255, 0, 127}, // | |
{255, 255, 255}}; //白 | |
void setup() | |
{ | |
faya_colorSticker.begin(); // 初始化NeoPixel函示庫 | |
faya_colorSticker.setBrightness(32); // 亮度設定 (0-255) | |
} | |
void loop() | |
{ | |
show_rainbow(); | |
delay(500); | |
} | |
void show_rainbow() { | |
for(int i=0;i<=NUMPIXELS-1;i++) //輪流讀表秀出LED顏色 | |
{ | |
faya_colorSticker.setPixelColor(i, faya_colorSticker.Color(rainbow16[i][0],rainbow16[i][1],rainbow16[i][2])); | |
faya_colorSticker.show(); | |
delay(200); | |
} | |
faya_colorSticker.clear(); | |
} | |
備註:
- 這個範例利用建表的方式,先把顏色數據建好,再透過迴圈依序讀取表格中顏色的數據,減少冗長的程式碼。
範例結果:
===================範例實作(3)===================
目標:
(1) 利用6組faya串列全彩LED模組展示跑馬燈效果
(2) 透過FastLED範例程式展示
接線:
(1) 電源線連接
(2) 訊號線連接
以上皆和範例實作(2)的連接方式相同,把模組從2組延伸到6組

安裝函示庫:
請下載FastLED函示庫,解壓縮並複製整個資料夾到Arduino的Liraries資料夾
載入範例程式:
順利安裝FastLED函示庫後,在Arduino的[範例]選單裡面,會多出[FastLED]的範例,我們選擇DemoReel100這個範例程式,如下所示:
修改程式:
此程式修改兩個地方就能執行了
(1) 改第18行的腳位=> #define DATA_PIN 3 改成 #define DATA_PIN 2
(2) 改第22行的數量=> #define NUM_LEDS 64 改成 #define NUM_LEDS 48
完成後,接上USB並上傳程式,注意到模組剛接上電時,LED會呈現全亮的狀態,可以先在上方放一張紙,再插入USB,上電後才不會刺眼
備註:
- 本範例透過主程式呼叫了許多跑馬燈效果,大家可以自行取用並修改副程式,展示自已的動態效果。
- 跑馬燈效果順序為 [rainbow, rainbowWithGlitter, confetti, sinelon, juggle, bpm]
- rainbow : 彩虹燈效果
- rainbowWithGlitter : 含閃爍效果彩虹燈
- confetti : 五彩碎紙屑
- sineion : 拖曳跑馬燈
- juggle : 8顆LED一組來回波浪
- bmp : 類似彈簧的動態跑馬燈效果
範例結果:
討論:
- 本章節先介紹Adafruit公司提供的函示庫,很輕易地就能夠控制各個LED的顏色,接下來介紹功能更強大的FastLED函示庫,它內建許多動態效果的函示,除了DemoReel100這個範例,還有10多組範例程式可以下載來看看效果,只要按照範例實作(3)的方式,修改腳位和LED數量,通常就能夠成功下載到我們的faya串列全彩LED模組上了!
- RGB像素配色可參考下圖
歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
沒有留言:
張貼留言