Arduino + TCS34725: เซ็นเซอร์ตรวจจับสีสำหรับโปรเจกต์ Maker

เคยอยากให้โปรเจกต์ของคุณ "มองเห็นสี" ได้เหมือนตาคนจริงๆ ไหมครับ? ปกติเซนเซอร์อ่านสีมักจะเจอปัญหาแสงรอบข้างกวน ทำให้ค่าที่อ่านได้เพี้ยนไปหมด

ในโปรเจกต์นี้ เราจะมาแก้ปัญหานั้นโดยการจับคู่เซนเซอร์สี TCS34725 เข้ากับไฟ RGB LED (SK9822) เพื่อสร้างแหล่งกำเนิดแสงที่คงที่ พร้อมกับระบบ "White-cap Calibration" (การคาลิเบรตแสงขาวทุกครั้งที่เปิดเครื่อง เหมือนกล้องวิดีโอสมัยก่อน) และที่เจ๋งที่สุดคือ เรามีแอปพลิเคชันบน Windows เพื่อดึงสีไปโชว์บนหน้าจอคอมพิวเตอร์แบบเรียลไทม์ด้วย!

TCS34725 Color Scanner

อุปกรณ์ที่ต้องเตรียม (Supplies)

  • TCS34725 Colour Sensor Module: โมดูลอ่านค่าสีตัวเอกของเรา
  • SK9822 Intelligent RGB LED: หลอดไฟ LED สำหรับสร้างแหล่งกำเนิดแสงที่ควบคุมได้
  • บอร์ดไมโครคอนโทรลเลอร์ 5V: เช่น Arduino Nano, Uno หรือ Pro Mini 5V
  • จอ I2C 1602 LCD (ทางเลือก): เอาไว้ดูค่า RGB แบบเรียลไทม์ตอนต่อวงจร
  • เบรดบอร์ด (Breadboard) และ สายจัมเปอร์ (Jumper Wires)
Supplies Overview
คลิกเพื่อดูรูปภาพอุปกรณ์เพิ่มเติม (View More)
Supply 1
Supply 2
Supply 3
Supply 4
Supply 5
Supply 6
Supply 7
Supply 8

Step 1: การต่อวงจร (Fritzing Setup)

ผังการต่อวงจรนี้ออกแบบมาให้ใช้งานง่ายบนเบรดบอร์ด โดยแยกระยะสายของเซนเซอร์ TCS34725 ให้ยาวหน่อย เพื่อให้เอาไปจ่อสแกนสีวัตถุต่างๆ ได้สะดวก ส่วนหลอดไฟ SK9822 ก็ต่อแยกไว้เพื่อเป็นไฟส่องสว่างตอนสแกน ทุกอย่างใช้ไฟ 5V จากบอร์ด Arduino ควบคุมได้เลย

Wiring Setup
คลิกเพื่อดูภาพ Schematic และดาวน์โหลดไฟล์วงจร (View More)

Step 2: ภาพรวมของ Firmware (โค้ด Arduino)

โค้ดของโปรเจกต์นี้จะทำหน้าที่รับข้อมูลดิบ (Raw Data) จากเซนเซอร์ เอามาปรับสมดุลแสงขาว (White Balance) ชดเชยสีที่เพี้ยน และแปลงเป็นรหัสสี RGB ส่งผ่าน Serial Port เพื่อให้แอปบน Windows อ่านค่าได้เป๊ะๆ สามารถดาวน์โหลดโค้ดหลักได้ด้านล่างนี้เลยครับ

💻 ดาวน์โหลดโค้ด Arduino (.ino) Firmware Overview

Step 3: ไลบรารีและการตั้งค่า (Libraries & Definitions)

ในส่วนหัวของโค้ด เราจะเรียกใช้ไลบรารี Wire.h (สำหรับ I2C), LiquidCrystal_I2C.h (สำหรับจอ LCD) และ Adafruit_TCS34725.h (สำหรับคุมเซนเซอร์) รวมถึงตั้งค่า White Balance Offset เพื่อให้สีไม่อมเหลืองหรืออมฟ้าจนเกินไป

คลิกเพื่อดูรูปและคัดลอกโค้ดส่วนที่ 1 (View More)
Libraries Code
#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)
LED Control Code
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)
Color Processing Code
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)
Setup Code
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)
Loop Code
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)
Serial Output Code
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 ได้ทันที!

Windows App Interface
Download from Microsoft Store

(ดาวน์โหลดผ่าน Microsoft Store ปลอดภัย ไม่โดนแจ้งเตือนไวรัสแน่นอน)


คำเตือน: เนื้อหานี้เป็นการสรุปและเรียบเรียงจากบทความต้นฉบับภาษาอังกฤษ ข้อมูลฉบับภาษาไทยอาจมีความคลาดเคลื่อนบางประการจากการตีความหรือย่อเนื้อหา

อ้างอิงและเรียบเรียงโดย: Globalbyteshop Blog

แหล่งที่มาต้นฉบับ: บทความโดย Palingenesis
- Instructables: Tim Plays With the TCS34725 Colour Sensor
- อ่านเพิ่มเติม: เอกสารต้นฉบับ (PDF)

แท็ก


Blog posts

© 2026 บริษัท โกลบอลโทรนิค อินเตอร์เทรด จํากัด, ขับเคลื่อนโดย Shopify

    • PayPal

    เข้าสู่ระบบ

    ลืมรหัสผ่านใช่ไหม?

    ยังไม่มีบัญชีใช่ไหม?
    สร้างบัญชี