การใช้บอร์ด Arduino ต่อกับเซ็นเซอร์สี TCS3200

หมวดสำหรับแบ่งบันความ รู้ต่างๆ จะมีหมวดย่อยๆ ในหมวดนี้ เช่น php, SQL, XML, CSS

Moderators: mindphp, ผู้ดูแลกระดาน

Grammanano
PHP Sr. Member
PHP Sr. Member
Posts: 60
Joined: 02/12/2019 10:16 am

การใช้บอร์ด Arduino ต่อกับเซ็นเซอร์สี TCS3200

Post by Grammanano »

เซ็นเซอร์วัดค่าสี TCS3200 เป็นเซ็นเซอร์ที่มีการแปลงแสงเป็นค่าความถี่ อ่านได้จากค่า photodiodes ที่อยู่ในชิฟของ โมดูล TCS3200 ซึ่งค่าที่อ่านมาได้จะเป็นค่าความถี่ของแสง แดง เขียว ฟ้า ยังไม่ใช่ค่า RGB แต่ปัจจุบันได้มีการเขียนโค้ดแก้สมการทางแสงมาให้พร้อมใช้งานแล้ว

การควบคุมเซ็นเซอร์ โมดูล TCS3200 นี้ ทำได้โดยควบคุมจากขา s2 และ s3 และขา OUT จะให้ออกมาเป็นสัญญาณเวฟสี่เหลี่ยม (50% duty cycle) เป็นความถี่ที่อ่านได้จากเซ็นเซอร์แสงโดยตรง สามารถขยายความเข้มของค่าที่อ่านได้ โดยควบคุมอัตราขยายที่ขา s0 และ s1

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


บทความนี้จะกล่าวถึงการใช้ Arduino Uno R3 ต่อกับเซ็นเซอร์สี TCS3200
หน้าตาเซ็นเซอร์ที่ใช้จะเป็นแบบนี้
Share Knowledge-1.png
Share Knowledge-1.png (428.01 KiB) Viewed 538 times
ต่อเซ็นเซอร์สีเข้ากับบอร์ด Arduino uno ได้ดังนี้

ขา S2 ของเซ็นเซอร์ ต่อกับ ขา 2 ของบอร์ด
ขา S3 ของเซ็นเซอร์ ต่อกับ ขา 3 ของบอร์ด
ขา out ของเซ็นเซอร์ ต่อกับ ขา 5 ของบอร์ด

หรือปรับเปลี่ยนได้ตามโค๊ดของผู้ใช้ ( ***อย่าลืมต่อ Vcc กับ Gnd )
สามารถดาวน์โหลด library สำหรับแปลงค่าแสงเป็น RGB ได้ ที่นี่

จากนั้นลองรันโค๊ดใน ArduinoIDE

Code: Select all

#include <MD_TCS230.h>
#include <FreqCount.h>

#define BLACK_CAL 0
#define WHITE_CAL 1
#define READ_VAL 2

#define S2_OUT 2
#define S3_OUT 3
#define OE_OUT 12 // LOW = ENABLED
int led = 11;	//สามารถเขียนโค๊ดทำให้เปิด-ปิดได้

MD_TCS230 CS(S2_OUT, S3_OUT, OE_OUT);

void setup()
{
pinMode(led, OUTPUT);
digitalWrite(led, 0);
Serial.begin(57600);
Serial.print(F("\n[TCS230 Calibrator Example]"));

CS.begin();
}

char getChar()
{
while (Serial.available() == 0)
;
return(toupper(Serial.read()));
}

void clearInput()
{
while (Serial.read() != -1)
;
}

uint8_t fsmReadValue(uint8_t state, uint8_t valType, uint8_t maxReads)
{
static uint8_t selChannel;
static uint8_t readCount;
static sensorData sd;

switch(state)
{
case 0: 
digitalWrite(led,0);
Serial.print(F("\n\nReading value for "));
switch(valType)
{
case BLACK_CAL: Serial.print(F("BLACK calibration")); break;
case WHITE_CAL: Serial.print(F("WHITE calibration")); break;
case READ_VAL: Serial.print(F("DATA")); break;
default: Serial.print(F("??")); break;
}

Serial.print(F("\nPress any key to start ..."));
state++;
break;

case 1: 
getChar();
clearInput();
state++;
break;

case 2: 
digitalWrite(led,1);
CS.read();
state++;
break;

case 3:
if (CS.available())
{
sensorData sd;
colorData rgb;

switch(valType)
{
case BLACK_CAL:
CS.getRaw(&sd);
CS.setDarkCal(&sd);
break;

case WHITE_CAL:
CS.getRaw(&sd);
CS.setWhiteCal(&sd);
break;

case READ_VAL:
CS.getRGB(&rgb);
Serial.print(F("\nRGB is ["));
Serial.print(rgb.value[TCS230_RGB_R]);
Serial.print(F(","));
Serial.print(rgb.value[TCS230_RGB_G]);
Serial.print(F(","));
Serial.print(rgb.value[TCS230_RGB_B]);
Serial.print(F("]"));
break;
}
state++;
digitalWrite(led,0);
}
break;

default: 
state = 0;
break;
}

return(state);
}


void loop()
{
static uint8_t runState = 0;
static uint8_t readState = 0;

switch(runState)
{
case 0: 
readState = fsmReadValue(readState, BLACK_CAL, 2);
if (readState == 0) runState++;
break;

case 1:
readState = fsmReadValue(readState, WHITE_CAL, 2);
if (readState == 0) runState++;
break;

case 2:
readState = fsmReadValue(readState, READ_VAL, 1);
break;

default:
runState = 0;
}
}

เริ่มโปรแกรมให้นำเซ็นเซอร์ไปที่สีดำ และสีขาวก่อน เพื่อให้เซ็นเซอร์ทำการ detect ค่าสี จากนั้นให้นำไปที่วัตถุที่ต้องการทราบค่าสีแล้วกด send ค่าสีที่เป็น RGB จะแสดงขึ้นมาใน Serial port



บทความที่เกี่ยวข้อง
ส่วนประกอบ Arduino UNO R3
การติดตั้ง Library บน Arduino IDE
การติดตั้งโปรแกรม และการใช้งาน ArduinoIDE
  • Similar Topics
    Replies
    Views
    Last post

Return to “Share Knowledge”

Who is online

Users browsing this forum: No registered users and 12 guests