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

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

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

Post Reply
Grammanano
PHP Full Member
PHP Full Member
Posts: 32
Joined: 02/12/2019 10:16 am

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

Post by Grammanano » 04/12/2019 6:54 pm

เซ็นเซอร์วัดค่าสี 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 12 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

Post Reply

Return to “Share Knowledge”

Users browsing this forum: No registered users and 14 guests