ทดลองใช้ Neopixel Ring WS2812

ระหว่างที่นั่งเขียนตอนที่ 3.5 ของ Painlessmesh ใช่ครับตอนที่  3.5 เพราะดูแล้วถ้าข้ามไปตอนที่ 4 เลยอาจจะทำให้หลายท่านงงอยู่บ้าง ก็เลยมีตอนคั่นซะหน่อย ขยายความเกี่ยวกับ MQTT และการใช้งาน

ส่วนวันนี้ก็เป็นตอนคั่นก่อนถึงตอนที่ 3.5 อีกที เพราะว่าได้กล่องเก็บของจาก homepro มา ก็เลยเอาพวกอุปกรณ์ต่างๆที่โยนรวมๆไว้ในกระป๋องมาจัดเรียงให้เข้าที่เข้าทางเวลาใช้ะจะได้หาง่ายซะหน่อย แล้วก็ไปเจอกับ Neopixel Ring WS2812 ซึ่งซื้อมาตั้งแต่เมื่อไหร่ก็จำไม่ได้ ^_^” เลยได้ฤกษ์เอาออกมาทดสอบกัน

Library ที่ใช้งานร่วมกับ LED ตระกูล WS2812 นั้นมีหลายตัวเลย แต่ตัวที่ฮิตกันและรองรับ LED Module หลายๆตระกูลเลยก็คือ FastLED สามารถดูรายละเอียดจาก Official Site ได้ที่นี่เลยครับ (FastLED Animation Library) ส่วนใครที่ใช้งาน Arduino IDE ก็สามารถ Search ได้จากหน้า Library Manager เลยครับ

 

Install FastLED Library

เข้าไปที่เมนู Sketch–> Include Library –> Manage Libraries..

 

จากนั้นก็ Search คำว่า FastLED ก็จะเจอ Library ตัวนี้แหละครับ แล้วก็ Install ได้เลย

 

เริ่มต้นใช้งาน Neopixel ws2812

มาดูกันที่ตัวอย่างแรกของ FastLED เลยครับกับ Blink โดยสามารถเปิดจากไฟล์ตัวอย่างกันได้เลย

 

จากตัวอย่างในส่วนของ Setup นั้นจะเห็นว่า FastLED Library นี้รองรับ LED Module หลายรุ่นมากซึ่ง Neopixel ที่ผมใช้อันนี้เป็นรุ่น WS2812 ก็ใช้ตามนี้ได้เลยโดยการต่อขานั้น ขา Data In ของ Neopixel ผมต่อเข้ากับขา D1 ของ Nodemcu ซึ่งก็คือ GPIO5 แต่ในการใช้งานกับ FastLED Library นั้น D1 ก็ใส่เป็น 1 เลย และถ้าต่อกับขา D4 ก็ใส่ 4 ครับ จะแปลกๆเรื่อง pin mapping นิดนึง

ในส่วนของ ​Code ตัวอย่างแรกก็ตามนี้เลยครับ กำหนด Data_Pin และ จำนวนของ Led ในวงหรือแถบ (บางท่านอาจซื้อมาเป็นม้วน 5 เมตร ซึ่งใน spec จะระบุอยู่แล้วว่าเมตรนึงมีกี่ดวง)

#include "FastLED.h"

// How many leds in your strip?
#define NUM_LEDS 16 // neopixel ring ที่ผมใช้มีทั้งหมด 16 ดวงด้วยกัน

#define DATA_PIN 1 //ขาที่ต่อเป็น D1 เป็น GPIO5 แต่เวลาใช้งาน ให้ใช้ 1 แทน ถ้าเป็น D4 ก็ใช้ 4

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() { 
      
       FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
      
}

void loop() { 
  // Turn the LED on, then pause
  leds[0] = CRGB::Red;
  FastLED.show();
  delay(500);
  
  // Now turn the LED off, then pause
  leds[0] = CRGB::Black;
  FastLED.show();
  delay(500);
}

 

 

อย่างแรกเลยที่เจอก็คือ Code ที่ใช้สั่งไฟกระพริบเป็นสีแดง แต่ผลที่ออกมาเป็นสีเขียว นั่นก็คือเรื่องของ RGB Mapping (ในคลิปดูท่า White Balance ของ Galaxy Note5 จะเพี้ยนแฮะ จากสีเขียวถ่ายมาเป็นสีออก Cyan)

 

เราก็จะเปลี่ยนในส่วนของบรรทัดนี้กัน จาก RGB เป็น GRB คราวนี้ แดงเป็นแดง เขียวเป็นเขียวเรียบร้อย

FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);

 

การกำหนดสีของไฟ LED ผ่าน FastLED Library

ในส่วนของสีของ LED นั้นสามารถกำหนดได้ในแต่ละดวงตาม Array ของ LED ได้เลย โดยสามารถทำได้หลายแบบยกตัวอย่างเช่น

 

กำหนดตามสีของ Web/HTML Color Code

leds[i] = CRGB::HotPink;

 

กำหนดตามสีแยกกันแบบ RGB

leds[i].setRGB( 255, 68, 221);

 

กำหนดสีตาม Hex Color Code

leds[i] = 0xFF44DD;

 

ใครถนัดใช้แบบไหนในการกำหนดสีก็เลือกตามที่สะดวกและตามการใช้งานเลยครับ คราวนี้เรามาลองใช้งานทำไฟวิ่งกันหลายๆแบบดูบ้าง ตาม Code ข้างล่างนี้ครับ

#include "FastLED.h"

// How many leds in your strip?
#define NUM_LEDS 16 // neopixel ring ที่ผมใช้มีทั้งหมด 16 ดวงด้วยกัน

#define DATA_PIN 1 //ขาที่ต่อเป็น D1 เป็น GPIO5 แต่เวลาใช้งาน ให้ใช้ 1 แทน ถ้าเป็น D4 ก็ใช้ 4

// Define the array of leds
CRGBArray<NUM_LEDS> leds;

void setup() {

  FastLED.addLeds<WS2812, DATA_PIN, GRB>(leds, NUM_LEDS);

}

void loop() {
  // Turn the LED on, then pause


  for (int i = 0; i <= 15; i++)
  {
    leds[i] = CRGB::Gray;
    FastLED.show();
    delay(100);
    leds[i] = CRGB::Black;
    FastLED.show();
  }

  for (int i = 15; i >= 0; i--)
  {
    leds[i] = CRGB::Gray;
    FastLED.show();
    delay(100);
    leds[i] = CRGB::Black;
    FastLED.show();
  }

  for (int i = 0; i <= 15; i++)
  {
    leds[i] = CRGB(i,i,i); 
    FastLED.show();
    delay(100);    
  }

  for (int i = 0; i <= 32; i++)
  {
    leds = CRGB(i,0,0); 
    FastLED.show();
    delay(100);    
  }

  for (int i = 0; i <= 32; i++)
  {
    leds = CRGB(32-i,i,0); 
    FastLED.show();
    delay(100);    
  }

  for (int i = 0; i <= 32; i++)
  {
    leds = CRGB(0,32-i,i); 
    FastLED.show();
    delay(100);    
  }

}

 

ผลลัพท์ที่ได้

 

โดยสรุปก็คือ LED WS2812 ที่ใช้ one wire interface เพื่อใช้ควบคุมสีและความสว่างโดยใช้คู่กับ Nodemcu และ FastLED Library นั้นถือว่าใช้งานง่ายและสะดวกมาก จะควบคุมทีละดวง หรือจะควบคุมทั้งเส้นก็สามารถทำได้ งานนี้ใครจะนำไปใช้ทำไฟหลืบตามฝ้า หรือ Background ด้านหลังจอทีวี แล้วควบคุมผ่านมือถือโดยใช้ Blink หรือ MQTT ก็จะสะดวกมากขึ้นครับ

ตอนต่อไปก็จะเป็นตอนที่ 3.5 ของการใช้งาน MQTT กับ Painlessmesh โดยที่เราจะ Setup MQTT Server ของเราขึ้นมาเองบน Google Cloud หรือใครจะโหลด image ของ Ubuntu Server มาลงที่เครื่องตัวเองทำเป็น Virtual Machine ก็ได้ครับ หรือจะใช้งานบน Digital Ocean, Microsoft Azure ก็ไม่ผิดแต่อย่างใด แต่อยากให้เข้าใจ Concept การใช้งานก่อน เหมือนหลักการเขียนโปรแกรมแหละครับ เขียน C ได้ เขียน Pascal ได้ก็ไปเขียนโปรแกรมอื่นๆได้ ขอให้เข้าใจ Logic ก็พอ เสร็จแล้วค่อยไปดูกรอบการใช้งานใน และ syntax การใช้งานในภาษาต่างๆได้ แล้วพบกันตอนต่อไปเร็วๆนี้ สุขสันต์วันหยุดสุดสัปดาห์ครับ

Author: Joe D.S.
Just a man on earth

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.