2017年11月3日 星期五

模組介紹 : faya串列全彩LED模組


學習目標 : 認識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公司所提供的 <Adafruit_NeoPixel>函示庫用法,其介面易學易用,非常適合剛接觸的使用者,文章最後會利用另一組函示庫<FastLed>為範例,示範其強大的動態色彩控制效果。

 <Adafruit_NeoPixel>所使用的指令如下 [下載點]

  • #include <Adafruit_NeoPixel.h>
        使用Adarfuit_NeoPixel函示庫時,務必指示此函式
  •   Adafruit_NeoPixel 物件名稱 = Adafruit_NeoPixel(NUMPIXELS, Neo_Pin, NEO_GRB + NEO_KHZ800);
       此指令宣告了控制串列全彩LED的規格與參數

    物件名稱 : 可自行命名
     NUMPIXELS : 串接的LED數量
     Neo_Pin : 控制腳位
     
   (例) 當我們用Arduino的第二隻腳控制類別名稱為"faya_colorSticker"的串列全彩LED模組上的8顆LED模組時,宣告的程式如下:

     Adafruit_NeoPixel faya_colorSticker = Adafruit_NeoPixel(8, 2, NEO_GRB + NEO_KHZ800);

  •  類別名稱.begin();  
       此指令啟動Adafruit_NeoPixel函示庫功能

(例) faya_colorSticker.begin();
  •  類別名稱.setBrightness(brightness);  
       此指令設定了LED亮度 

brightness : 設定每個LED像素的最亮值(0~255),255最亮

      (例) faya_colorSticker.setBrightness(50);

  •  類別名稱.setPixelColor(n,r,g,b);  
       此指令設定了單顆LED色彩 

      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(); 
     下了此指令後,設定好的LED像素才會顯示在LED上

  •   類別名稱.clear(); 
      設定像素顏色的參數歸零,配合.show()會讓LED全滅


====================原理知識====================

以下解釋提供給有需要知道背後原理的人:

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資料夾)

備註:
- 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埠用單心線串起來(圖中為黃色線材)。


範例程式:

備註:
- 這個範例利用建表的方式,先把顏色數據建好,再透過迴圈依序讀取表格中顏色的數據,減少冗長的程式碼。

範例結果:


===================範例實作(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像素配色可參考下圖

歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================

沒有留言:

張貼留言