การใช้งาน NeoPixel Matrix 8×8 WS2812 64 RGB LED บน esp32

1. WS2812 คืออะไร

NeoPixel Matrix 8×8 WS2812 64 RGB LED คือแผง LED ขนาด 8×8 ที่ประกอบด้วย 64 พิกเซล (RGB) ซึ่งสามารถควบคุมแสงสีได้ในแต่ละพิกเซล ตัวอุปกรณ์นี้ใช้เทคโนโลยี WS2812B ซึ่งเป็น LED ชนิด Addressable หมายความว่าแต่ละพิกเซลสามารถควบคุมได้อย่างอิสระ (การตั้งค่าสีของแต่ละพิกเซลในแผง LED สามารถแตกต่างกันได้ตามที่ต้องการ).

  • RGB หมายถึง สีแดง, สีเขียว, และ สีน้ำเงิน ซึ่งสามารถผสมผสานกันเพื่อสร้างสีอื่นๆ ได้ตามต้องการ
  • WS2812B เป็นไอซีที่ใช้ควบคุม LED โดยการส่งข้อมูลผ่านสัญญาณ Serial (1 สาย).

2. มีคุณสมบัติอย่างไร

  • ขนาด: 8×8 พิกเซล (รวม 64 พิกเซล)
  • สีที่แสดง: แต่ละพิกเซลสามารถแสดงสีได้ 256 ระดับ (แดง, เขียว, น้ำเงิน) ทำให้มีการผสมสีได้มากถึง 16,777,216 สี
  • การควบคุม: ใช้การส่งข้อมูลแบบ Serial โดยเชื่อมต่อผ่าน 3 สาย ได้แก่ VCC, GND, และ DIN (Data In)
  • แรงดันไฟฟ้า: โดยปกติจะใช้งานที่ 5V สำหรับการจ่ายไฟให้กับ LED ทั้งหมด
  • การใช้งานง่าย: ใช้ไลบรารี Adafruit NeoPixel หรือ FastLED สำหรับการควบคุมอย่างง่าย
  • การขับเคลื่อนหลายชุด: สามารถเชื่อมต่อ NeoPixel หลายตัวเข้าด้วยกัน โดยต่อ DIN ของชุดถัดไปกับ DOUT ของชุดก่อนหน้า

3. รองรับการเชื่อมต่ออย่างไร

  • การจ่ายไฟ: 5V (แรงดันไฟฟ้าที่ใช้จ่ายให้กับ LED Matrix ทั้งหมด), ควรใช้แหล่งจ่ายไฟที่มีความจุเพียงพอ เช่น 5V 2A หรือสูงกว่า เพื่อรองรับการใช้งานพร้อมกันของพิกเซลทั้งหมด
  • พินที่ใช้: การเชื่อมต่อ DIN ของ NeoPixel กับพิน GPIO ของ ESP32 (หรือไมโครคอนโทรลเลอร์อื่น ๆ) ที่รองรับการส่งข้อมูล Serial
  • บอร์ดที่รองรับ:
    • Arduino Uno, Mega, Leonardo สามารถใช้ได้
    • ESP32 สามารถใช้พิน GPIO ที่กำหนดในโค้ดได้

4. ตัวอย่างรายละเอียดการเชื่อมต่อสายไฟ และสายสัญญาณกับ ESP32

การเชื่อมต่อระหว่าง NeoPixel Matrix 8×8 กับ ESP32 จะเชื่อมต่อดังนี้:

  • VCC ของ NeoPixel5V ของ ESP32
  • GND ของ NeoPixelGND ของ ESP32
  • DIN ของ NeoPixelGPIO 5 ของ ESP32 (หรือพินอื่น ๆ ที่รองรับในโค้ด)

5. Source Code การใช้งานเบื้องต้น

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>

#define PIN            5  // กำหนดพินที่เชื่อมต่อกับ DIN ของ WS2812B

// สร้างอ็อบเจ็กต์ NeoPixel สำหรับควบคุม LED 64 ดวง (8x8)
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN,
  NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);

void setup() {
  matrix.begin();  // เริ่มต้นการใช้งาน LED Matrix
  matrix.setTextWrap(false);  // ปิดการตัดข้อความ
  matrix.setTextColor(matrix.Color(255, 255, 255)); // กำหนดสีข้อความ (ขาว)
}

void loop() {
  matrix.fillScreen(matrix.Color(255, 0, 0));  // สีแดง
  matrix.show();  // แสดงผลบน LED Matrix
  delay(1000);    // หน่วงเวลา 1 วินาที

  matrix.fillScreen(matrix.Color(0, 0, 255));  // สีน้ำเงิน
  matrix.show();  // แสดงผลบน LED Matrix
  delay(1000);    // หน่วงเวลา 1 วินาที

  matrix.fillScreen(matrix.Color(0, 255, 0));  // สีเขียว
  matrix.show();  // แสดงผลบน LED Matrix
  delay(1000);    // หน่วงเวลา 1 วินาที
}

6. URL ที่เป็นข้อความ สำหรับ Download Library

เพื่อใช้ Adafruit NeoPixel ไลบรารีในการควบคุม NeoPixel LED คุณสามารถดาวน์โหลดได้จาก Arduino Library Manager:

  • ไปที่ Arduino IDESketchInclude LibraryManage Libraries.
  • ค้นหาชื่อ “Adafruit NeoPixel” และคลิก Install.

หรือสามารถดาวน์โหลดจากที่นี่: Adafruit NeoPixel Library GitHub

7. คำแนะนำ และข้อควรระวังสำหรับ Project นี้

คำแนะนำ:

  1. ไฟเลี้ยง: ใช้แหล่งจ่ายไฟ 5V ที่มีความจุพอสมควร (2A หรือมากกว่า) เนื่องจากการขับเคลื่อน 64 พิกเซล (โดยเฉพาะเมื่อ LED เปิดเต็มที่).
  2. การเชื่อมต่อ: อย่าลืมเชื่อมต่อ GND ของ ESP32 และ NeoPixel เข้าด้วยกัน เพื่อให้การทำงานของวงจรเสถียร.
  3. พินที่ใช้: หากต้องการใช้พินอื่น ๆ แทน GPIO 5 ให้ปรับในโค้ด Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN, ...) โดยกำหนดพินที่คุณต้องการใช้.

ข้อควรระวัง:

  1. แรงดันไฟฟ้า: ตรวจสอบให้แน่ใจว่า NeoPixel ใช้ 5V และไม่ใช่ 3.3V, เพราะ ESP32 ทำงานที่ 3.3V แต่ NeoPixel ต้องการ 5V. ใช้แหล่งจ่ายไฟภายนอกที่สามารถจ่ายไฟได้เพียงพอ.
  2. สัญญาณระดับแรงดัน: หากใช้งาน ESP32 ที่ทำงานที่ 3.3V ควรใช้ตัวขยายสัญญาณหรือ Level Shifter เพื่อเพิ่มระดับสัญญาณ DIN ให้เป็น 5V สำหรับการสื่อสารกับ WS2812B.
  3. การจัดการไฟฟ้า: ควรจัดการเรื่องไฟฟ้าอย่างรอบคอบ เช่น การใช้ capacitor ขนาด 100uF เพื่อช่วยลดการกระชากของกระแสไฟที่เกิดจากการเปลี่ยนแปลงของการเปิดปิดไฟใน LED

ตัวอย่าง 1: กำหนดไฟสีรุ้ง

การเชื่อมต่อ:

  • VCC ของ WS2812B5V ของ ESP32
  • GND ของ WS2812BGND ของ ESP32
  • DIN ของ WS2812B ตัวที่ 1GPIO 5 ของ ESP32
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>

#define PIN1           5  // กำหนดพินที่เชื่อมต่อกับ DIN ของ WS2812B ตัวที่ 1

// สร้างอ็อบเจ็กต์ NeoPixel สำหรับควบคุม 64 ดวง (8x8) ของ WS2812B ตัวที่ 1
Adafruit_NeoMatrix matrix1 = Adafruit_NeoMatrix(8, 8, PIN1,
  NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);

// กำหนดค่าสีสำหรับแต่ละ column
uint32_t color1 = matrix1.Color(148, 0, 211);   // ม่วง
uint32_t color2 = matrix1.Color(0, 0, 255);     // น้ำเงิน
uint32_t color3 = matrix1.Color(0, 255, 255);   // ฟ้า
uint32_t color4 = matrix1.Color(0, 255, 0);     // เขียว
uint32_t color5 = matrix1.Color(255, 255, 0);   // เหลือง
uint32_t color6 = matrix1.Color(255, 127, 0);   // ส้ม
uint32_t color7 = matrix1.Color(255, 0, 0);     // แดง
uint32_t color8 = matrix1.Color(255, 255, 255); // ขาว

void setup() {
  matrix1.begin();  // เริ่มต้นการใช้งาน LED Matrix ตัวที่ 1
}

void loop() {
  // แสดงผลสีที่กำหนดในแต่ละ column (1-7)
  fillColumn(0, color1);  // column 1: ม่วง
  fillColumn(1, color2);  // column 2: น้ำเงิน
  fillColumn(2, color3);  // column 3: ฟ้า
  fillColumn(3, color4);  // column 4: เขียว
  fillColumn(4, color5);  // column 5: เหลือง
  fillColumn(5, color6);  // column 6: ส้ม
  fillColumn(6, color7);  // column 7: แดง
  fillColumn(7, color8);  // column 8: ขาว

  // แสดงผลบน LED Matrix
  matrix1.show();
  delay(1000);  // หน่วงเวลา 1 วินาที
}

// ฟังก์ชันสำหรับการตั้งค่าสีในแต่ละ column
void fillColumn(int col, uint32_t color) {
  for (int row = 0; row < 8; row++) {
    matrix1.drawPixel(col, row, color);  // กำหนดสีให้พิกเซลในแต่ละแถวของ column
  }
}

ตัวอย่าง 2: การต่อ 3 แผง โดยแต่ละแผงแสดงสี คนละสี
ข้อควรระวัง: ให้ต่อ ws2812b แยกอิสระต่อกัน เชื่อมต่อแค่แหล่งจ่ายไฟที่ใช้งานร่วมกัน 5V โดยสาย DIN ของแต่ละแผง ให้ต่อเข้ากับ esp32 ใน pin ที่ 5,18 และ 19 ตามลำดับ

  • WS2812B ตัวที่ 1 แสดงผลเป็น สีแดง ทั้งหมด
  • WS2812B ตัวที่ 2 แสดงผลเป็น สีน้ำเงิน ทั้งหมด
  • WS2812B ตัวที่ 3 แสดงผลเป็น สีเขียว ทั้งหมด

และทำให้ ไฟกระพริบ (Blink) ทุก 2 วินาทีและวนไปเรื่อยๆ สามารถทำได้โดยใช้ฟังก์ชัน fillScreen() เพื่อให้แสดงสีที่ต้องการแล้วใช้ delay() เพื่อหน่วงเวลาและทำให้ไฟกระพริบ

การเชื่อมต่อ:

  • VCC ของ WS2812B5V ของ ESP32
  • GND ของ WS2812BGND ของ ESP32
  • DIN ของ WS2812B ตัวที่ 1GPIO 5 ของ ESP32
  • DIN ของ WS2812B ตัวที่ 2GPIO 18 ของ ESP32
  • DIN ของ WS2812B ตัวที่ 3GPIO 19 ของ ESP32
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>

#define PIN1           5  // กำหนดพินที่เชื่อมต่อกับ DIN ของ WS2812B ตัวที่ 1
#define PIN2          18  // กำหนดพินที่เชื่อมต่อกับ DIN ของ WS2812B ตัวที่ 2
#define PIN3          19  // กำหนดพินที่เชื่อมต่อกับ DIN ของ WS2812B ตัวที่ 3

// สร้างอ็อบเจ็กต์ NeoPixel สำหรับควบคุม 64 ดวง (8x8) ในแต่ละชุด
Adafruit_NeoMatrix matrix1 = Adafruit_NeoMatrix(8, 8, PIN1,
  NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);

Adafruit_NeoMatrix matrix2 = Adafruit_NeoMatrix(8, 8, PIN2,
  NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);

Adafruit_NeoMatrix matrix3 = Adafruit_NeoMatrix(8, 8, PIN3,
  NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB + NEO_KHZ800);

void setup() {
  matrix1.begin();  // เริ่มต้นการใช้งาน LED Matrix ตัวที่ 1
  matrix2.begin();  // เริ่มต้นการใช้งาน LED Matrix ตัวที่ 2
  matrix3.begin();  // เริ่มต้นการใช้งาน LED Matrix ตัวที่ 3
}

void loop() {
  // แสดงผลสีแดงทั้งหมดใน WS2812B ตัวที่ 1
  matrix1.fillScreen(matrix1.Color(255, 0, 0));  // สีแดง (RGB: 255, 0, 0)
  matrix1.show();  // แสดงผลบน LED Matrix
  delay(2000);     // หน่วงเวลา 2 วินาที

  // แสดงผลสีน้ำเงินทั้งหมดใน WS2812B ตัวที่ 2
  matrix2.fillScreen(matrix2.Color(0, 0, 255));  // สีน้ำเงิน (RGB: 0, 0, 255)
  matrix2.show();  // แสดงผลบน LED Matrix
  delay(2000);     // หน่วงเวลา 2 วินาที

  // แสดงผลสีเขียวทั้งหมดใน WS2812B ตัวที่ 3
  matrix3.fillScreen(matrix3.Color(0, 255, 0));  // สีเขียว (RGB: 0, 255, 0)
  matrix3.show();  // แสดงผลบน LED Matrix
  delay(2000);     // หน่วงเวลา 2 วินาที
}