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 ของ NeoPixel → 5V ของ ESP32
- GND ของ NeoPixel → GND ของ ESP32
- DIN ของ NeoPixel → GPIO 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 IDE → Sketch → Include Library → Manage Libraries.
- ค้นหาชื่อ “Adafruit NeoPixel” และคลิก Install.
หรือสามารถดาวน์โหลดจากที่นี่: Adafruit NeoPixel Library GitHub
7. คำแนะนำ และข้อควรระวังสำหรับ Project นี้
คำแนะนำ:
- ไฟเลี้ยง: ใช้แหล่งจ่ายไฟ 5V ที่มีความจุพอสมควร (2A หรือมากกว่า) เนื่องจากการขับเคลื่อน 64 พิกเซล (โดยเฉพาะเมื่อ LED เปิดเต็มที่).
- การเชื่อมต่อ: อย่าลืมเชื่อมต่อ GND ของ ESP32 และ NeoPixel เข้าด้วยกัน เพื่อให้การทำงานของวงจรเสถียร.
- พินที่ใช้: หากต้องการใช้พินอื่น ๆ แทน GPIO 5 ให้ปรับในโค้ด
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(8, 8, PIN, ...)
โดยกำหนดพินที่คุณต้องการใช้.
ข้อควรระวัง:
- แรงดันไฟฟ้า: ตรวจสอบให้แน่ใจว่า NeoPixel ใช้ 5V และไม่ใช่ 3.3V, เพราะ ESP32 ทำงานที่ 3.3V แต่ NeoPixel ต้องการ 5V. ใช้แหล่งจ่ายไฟภายนอกที่สามารถจ่ายไฟได้เพียงพอ.
- สัญญาณระดับแรงดัน: หากใช้งาน ESP32 ที่ทำงานที่ 3.3V ควรใช้ตัวขยายสัญญาณหรือ Level Shifter เพื่อเพิ่มระดับสัญญาณ DIN ให้เป็น 5V สำหรับการสื่อสารกับ WS2812B.
- การจัดการไฟฟ้า: ควรจัดการเรื่องไฟฟ้าอย่างรอบคอบ เช่น การใช้ capacitor ขนาด 100uF เพื่อช่วยลดการกระชากของกระแสไฟที่เกิดจากการเปลี่ยนแปลงของการเปิดปิดไฟใน LED
ตัวอย่าง 1: กำหนดไฟสีรุ้ง
การเชื่อมต่อ:
- VCC ของ WS2812B → 5V ของ ESP32
- GND ของ WS2812B → GND ของ ESP32
- DIN ของ WS2812B ตัวที่ 1 → GPIO 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 ของ WS2812B → 5V ของ ESP32
- GND ของ WS2812B → GND ของ ESP32
- DIN ของ WS2812B ตัวที่ 1 → GPIO 5 ของ ESP32
- DIN ของ WS2812B ตัวที่ 2 → GPIO 18 ของ ESP32
- DIN ของ WS2812B ตัวที่ 3 → GPIO 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 วินาที
}