การควบคุมเซ็นเซอร์ โมดูล TCS3200 นี้ ทำได้โดยควบคุมจากขา s2 และ s3 และขา OUT จะให้ออกมาเป็นสัญญาณเวฟสี่เหลี่ยม (50% duty cycle) เป็นความถี่ที่อ่านได้จากเซ็นเซอร์แสงโดยตรง สามารถขยายความเข้มของค่าที่อ่านได้ โดยควบคุมอัตราขยายที่ขา s0 และ s1
ในขณะที่เซ็นเซอร์ทำงาน ตัว photodiode จะส่องแสงไปที่วัตถุเพื่อให้เกิดการสะท้อนกลับมา จากนั้นเซ็นเซอร์ที่อยู่ในโมดูลจะรับค่าแสงนั้นมาคำนวณและแปลงเป็น RGB
บทความนี้จะกล่าวถึงการใช้ Arduino Uno R3 ต่อกับเซ็นเซอร์สี TCS3200
หน้าตาเซ็นเซอร์ที่ใช้จะเป็นแบบนี้
ต่อเซ็นเซอร์สีเข้ากับบอร์ด 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