เคยอยากให้โปรเจกต์ของคุณ "มองเห็นสี" ได้เหมือนตาคนจริงๆ ไหมครับ? ปกติเซนเซอร์อ่านสีมักจะเจอปัญหาแสงรอบข้างกวน ทำให้ค่าที่อ่านได้เพี้ยนไปหมด
ในโปรเจกต์นี้ เราจะมาแก้ปัญหานั้นโดยการจับคู่เซนเซอร์สี TCS34725 เข้ากับไฟ RGB LED (SK9822) เพื่อสร้างแหล่งกำเนิดแสงที่คงที่ พร้อมกับระบบ "White-cap Calibration" (การคาลิเบรตแสงขาวทุกครั้งที่เปิดเครื่อง เหมือนกล้องวิดีโอสมัยก่อน) และที่เจ๋งที่สุดคือ เรามีแอปพลิเคชันบน Windows เพื่อดึงสีไปโชว์บนหน้าจอคอมพิวเตอร์แบบเรียลไทม์ด้วย!
VIDEO
อุปกรณ์ที่ต้องเตรียม (Supplies)
TCS34725 Colour Sensor Module: โมดูลอ่านค่าสีตัวเอกของเรา
SK9822 Intelligent RGB LED: หลอดไฟ LED สำหรับสร้างแหล่งกำเนิดแสงที่ควบคุมได้
บอร์ดไมโครคอนโทรลเลอร์ 5V: เช่น Arduino Nano, Uno หรือ Pro Mini 5V
จอ I2C 1602 LCD (ทางเลือก): เอาไว้ดูค่า RGB แบบเรียลไทม์ตอนต่อวงจร
เบรดบอร์ด (Breadboard) และ สายจัมเปอร์ (Jumper Wires)
คลิกเพื่อดูรูปภาพอุปกรณ์เพิ่มเติม (View More)
Step 1: การต่อวงจร (Fritzing Setup)
ผังการต่อวงจรนี้ออกแบบมาให้ใช้งานง่ายบนเบรดบอร์ด โดยแยกระยะสายของเซนเซอร์ TCS34725 ให้ยาวหน่อย เพื่อให้เอาไปจ่อสแกนสีวัตถุต่างๆ ได้สะดวก ส่วนหลอดไฟ SK9822 ก็ต่อแยกไว้เพื่อเป็นไฟส่องสว่างตอนสแกน ทุกอย่างใช้ไฟ 5V จากบอร์ด Arduino ควบคุมได้เลย
คลิกเพื่อดูภาพ Schematic และดาวน์โหลดไฟล์วงจร (View More)
Step 2: ภาพรวมของ Firmware (โค้ด Arduino)
โค้ดของโปรเจกต์นี้จะทำหน้าที่รับข้อมูลดิบ (Raw Data) จากเซนเซอร์ เอามาปรับสมดุลแสงขาว (White Balance) ชดเชยสีที่เพี้ยน และแปลงเป็นรหัสสี RGB ส่งผ่าน Serial Port เพื่อให้แอปบน Windows อ่านค่าได้เป๊ะๆ สามารถดาวน์โหลดโค้ดหลักได้ด้านล่างนี้เลยครับ
💻 ดาวน์โหลดโค้ด Arduino (.ino)
Step 3: ไลบรารีและการตั้งค่า (Libraries & Definitions)
ในส่วนหัวของโค้ด เราจะเรียกใช้ไลบรารี Wire.h (สำหรับ I2C), LiquidCrystal_I2C.h (สำหรับจอ LCD) และ Adafruit_TCS34725.h (สำหรับคุมเซนเซอร์) รวมถึงตั้งค่า White Balance Offset เพื่อให้สีไม่อมเหลืองหรืออมฟ้าจนเกินไป
คลิกเพื่อดูรูปและคัดลอกโค้ดส่วนที่ 1 (View More)
📋 คัดลอกโค้ด
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Adafruit_TCS34725.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define WB_OFFSET -0.20f
#define R_GAIN 1.00f
#define G_GAIN 1.00f
#define B_GAIN 1.00f
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);
Step 4: ควบคุมไฟ SK9822 LED
ไฟ SK9822 คือหัวใจสำคัญที่ทำให้สีนิ่ง! เราจะเขียนฟังก์ชันสำหรับสร้างเฟรมข้อมูล 32-bit ส่งไปคุมหลอดไฟ เพื่อสร้าง "แสงสีขาว" ที่ถูกปรับจูนมาเฉพาะตัว ทำให้การอ่านค่าสีไม่ถูกกวนจากแสงไฟในห้องครับ
คลิกเพื่อดูรูปและคัดลอกโค้ดส่วนที่ 2 (View More)
📋 คัดลอกโค้ด
void Send_SK9822_Frame(uint8_t brightness, uint8_t r, uint8_t g, uint8_t b) {
uint8_t prefix = 0b11100000 | (brightness & 0x1F);
shiftOut(LED_DI_PIN, LED_CI_PIN, MSBFIRST, prefix);
shiftOut(LED_DI_PIN, LED_CI_PIN, MSBFIRST, b);
shiftOut(LED_DI_PIN, LED_CI_PIN, MSBFIRST, g);
shiftOut(LED_DI_PIN, LED_CI_PIN, MSBFIRST, r);
}
Step 5: ฟังก์ชันประมวลผลสี (Colour Processing)
ข้อมูลดิบที่ได้จากเซนเซอร์เป็นแบบ 16-bit เราต้องนำมานอร์มัลไลซ์ (Normalize) ปรับ Gain ชดเชยแต่ละสี แล้วบีบให้เหลือ 8-bit (0-255) เพื่อให้ได้ค่า RGB ที่พร้อมนำไปใช้งานจริงบนหน้าจอครับ
คลิกเพื่อดูรูปและคัดลอกโค้ดส่วนที่ 3 (View More)
📋 คัดลอกโค้ด
float MapToRange(uint16_t value, uint16_t minVal, uint16_t maxVal) {
if (maxVal == minVal) return 0.0f;
return (float)(value - minVal) / (float)(maxVal - minVal);
}
void applyWhiteBalance(float& R, float& G, float& B) {
R += WB_OFFSET;
G += WB_OFFSET;
B += WB_OFFSET;
}
Step 6: การตั้งค่าเริ่มต้น Setup()
ในฟังก์ชัน setup() บอร์ดจะเริ่มเชื่อมต่อ Serial, เปิดหน้าจอ LCD, เช็กการเชื่อมต่อของเซนเซอร์, เปิดไฟ SK9822 และที่สำคัญที่สุดคือ "การอ่านค่าแสงสีขาวครั้งแรก" เพื่อจดจำค่าสว่างสูงสุด (Range_max) ไว้ใช้เป็นมาตรฐานในการสแกนครั้งต่อไปครับ
คลิกเพื่อดูรูปและคัดลอกโค้ดส่วนที่ 4 (View More)
📋 คัดลอกโค้ด
void setup() {
Serial.begin(115200);
Wire.begin();
lcd.init();
lcd.backlight();
if (!tcs.begin()) {
Serial.println("TCS34725 NOT FOUND");
while (1);
}
Init_SK9822();
Set_LED_RGB(LED_R_LEVEL, LED_G_LEVEL, LED_B_LEVEL);
delay(200);
tcs.getRawData(&r, &g, &b, &c);
// UpdateCalibration(r, g, b, c);
}
Step 7: ลูปการทำงานหลัก Loop()
ในลูปนี้คือการทำงานจริงๆ ของเครื่องสแกน เริ่มตั้งแต่อ่านค่า Raw > ปรับสมดุล > แปลงเป็น 8-bit > นำไปโชว์บนจอ LCD > และสร้างโค้ดสีรหัส Web Hex (เช่น #RRGGBB) เพื่อส่งไปให้คอมพิวเตอร์ประมวลผล
คลิกเพื่อดูรูปและคัดลอกโค้ดส่วนที่ 5 (View More)
📋 คัดลอกโค้ด
void loop() {
tcs.getRawData(&r, &g, &b, &c);
float Rn = MapToRange(r, Range_min, Range_max);
float Gn = MapToRange(g, Range_min, Range_max);
float Bn = MapToRange(b, Range_min, Range_max);
applyWhiteBalance(Rn, Gn, Bn);
// convertTo8bit(...);
// Send_To_Serial();
delay(150);
}
Step 8: ส่งข้อมูลออก Serial สำหรับแอป Windows
การจะให้แอปบน Windows อ่านค่าได้ถูกต้อง รูปแบบการปรินต์ข้อความผ่าน Serial ต้อง "เป๊ะ" ทุกตัวอักษร! ไม่ว่าจะเป็น RAW R: หรือ WEB: ถ้าพิมพ์ผิดไปตัวเดียว แอปจะถอดรหัสสีไม่ออกทันทีครับ
คลิกเพื่อดูรูปและคัดลอกโค้ดส่วนที่ 6 (View More)
📋 คัดลอกโค้ด
void Send_To_Serial() {
Serial.print("Range_min: "); Serial.print(Range_min);
Serial.print("\tRange_max: "); Serial.println(Range_max);
Serial.print("RAW R:"); Serial.print(r);
Serial.print(" G:"); Serial.print(g);
Serial.print(" B:"); Serial.print(b);
Serial.print(" C:"); Serial.println(c);
Serial.print("PNG32: 0x"); Serial.println(PNG32, HEX);
Serial.print("WEB: "); Serial.println(hexColor);
}
Step 9: แอป Tim's TCS34725 Colour Decoder
และแล้วก็มาถึงจิ๊กซอว์ชิ้นสุดท้าย! แอปพลิเคชันบน Windows ตัวนี้จะรับค่าจาก Arduino ผ่านสาย USB (เลือก COM Port ให้ถูก) แล้วแปลงเป็นแถบสีโชว์ขึ้นจอแบบเรียลไทม์ พร้อมโชว์รหัสสี HEX และ ARGB ให้เอาไปใช้งานต่อในงานออกแบบหรืองาน 3D Scan ได้ทันที!
(ดาวน์โหลดผ่าน Microsoft Store ปลอดภัย ไม่โดนแจ้งเตือนไวรัสแน่นอน)
อยากประกอบเครื่องสแกนสีเอาไว้ใช้เองบ้างไหม?
คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา