TCS3200 컬러 감지 센서

: RFG 감도 주파수 출력 센서
TCS230 업그레이드 버전, TCS3200 칩 탑재.

S2, S3 = High / Low 로 포토다이오드 R, G, B 선택 → S0, S1 = 최대 출력 주파수 선택, 색상 판별.

이 과정 * 3번 =  R, G, B 각 값을 읽은 후 조합 =  칼라값 감지.


  • 메인칩 : TCS3200
  • 전원 공급 : 3~5V
  • 출력주파수 : 12KHz, 120KHz, 600KHz 선택
  • 조명 : 화이트 LED
  • 인터페이스 : TTL 마이컴직결 또는 주파수 카운터
  • 감도최적거리 : 10mm

회로

센서 모드 선택 S0, S1 핀 = HIGH 공급 → 제일 높은 해상도 감지 모드 (=굳이 아두이노와 연결할 필요 없음)

전원 공급 2군데 (한 곳만 공급해도 동작)

+5V & GND 연결


S2 = D12

S3 = D11

LED = D13

OUT = D5 (출력 주파수를 측정 위해)

아두이노 우노 = D5번 핀 / 아두이노 메가 = 47번 핀

VCC = V5

GND = GND


라이브러리 설치

스케치 - 라이브러리 포함하기 - 라이브러리 관리 (Ctrl + Shift+ I)

 

MD_TCS230

 

 

FreqCount

 


스케치 (영점 조절)

/* 
  TCS230 sensor calibration (TCS230 센서 영점 조정) 
 
  영점 조정 진행, 영점 조정 위한 상수 값 = 시리얼 모니터 출력 
   
*/ 
#include <MD_TCS230.h> 
#include <FreqCount.h> 
 
#define BLACK_CAL 0 
#define WHITE_CAL 1 
 
// 연결된 핀 번호들: S0_OUT <-> 8, S1_OUT <-> 9
#define  S2_OUT  12 
#define  S3_OUT  11 
#define  LED     13  // HIGH = ENABLED 
 
MD_TCS230 CS(S2_OUT, S3_OUT, /* S0_OUT, S1_OUT, */ LED); 
 
sensorData sdBlack; 
sensorData sdWhite; 
 
void setup() 
{ 
  Serial.begin(9600); 
  Serial.print(F("\n[TCS230 영점 조정 예제]")); 
 
  // 컬러 센서 초기화 
  CS.begin(); 
} 
 
char getChar() 
// 시리얼 포트 문자 받아 대문자로 바꿔 리턴
{ 
  while (Serial.available() == 0); //0이 아니면 while문 벗어남
  return (toupper(Serial.read())); //toupper = 대문자 변경
} 
 
void clearInput() 
// 시리얼 포트 데이터 읽고 삭제 
{ 
  while (Serial.read() != -1); //-1이면 while문 벗어남
} 
 
void outputHeader(void) 
// 영점 조정 값+컬러 & RGB 감지 값 = 헤더 파일 사용, 시리얼 모니터 출력 
{ 
  Serial.print(F("\n\n// 영점 조정 데이터")); 
  Serial.print(F("\nsensorData sdBlack = { ")); 
  Serial.print(sdBlack.value[0]); Serial.print(F(", ")); 
  Serial.print(sdBlack.value[1]); Serial.print(F(", ")); 
  Serial.print(sdBlack.value[2]); Serial.print(F(" };")); 
 
  Serial.print(F("\nsensorData sdWhite = { ")); 
  Serial.print(sdWhite.value[0]); Serial.print(F(", ")); 
  Serial.print(sdWhite.value[1]); Serial.print(F(", ")); 
  Serial.print(sdWhite.value[2]); Serial.print(F(" };")); 
} 
 
uint8_t fsmReadValue(uint8_t state, uint8_t valType) 
//unitx_t = 문자가 아닌 숫자 담겠다, x=bit
{ 
  static uint8_t selChannel; 
  static uint8_t readCount; 
 
  switch (state) { 
    case 0: // Prompt for the user to start 
      Serial.print(F("\n\n값을 읽는 중: ")); 
      switch (valType) { 
        case BLACK_CAL: Serial.print(F("검정색 영점 조정")); break; 
        case WHITE_CAL: Serial.print(F("하얀색 영점 조정")); break; 
        default: Serial.print(F("??")); break; 
      } 
       
      clearInput(); 
 
      Serial.print(F("\n시작하려면 어떤 키든 눌러주세요 ...")); 
      getChar(); 
      clearInput(); 
       
      state++; 
      break; 
 
    case 1: // 센서 값 읽기 시작
      CS.read(); 
      state++; 
      break; 
 
    case 2: // 값 읽어 들일 때까지 기다림
      if (CS.available()) { 
        switch (valType) { 
          case BLACK_CAL: 
            CS.getRaw(&sdBlack); 
            CS.setDarkCal(&sdBlack); 
            break; 
 
          case WHITE_CAL: 
            CS.getRaw(&sdWhite); 
            CS.setWhiteCal(&sdWhite); 
            break; 
        } 
        state++; 
      } 
      break; 
 
    default: // reset fsm 
      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); 
      if (readState == 0) runState++; 
      break; 
 
    case 1: // 하얀색 영점 조정 
      readState = fsmReadValue(readState, WHITE_CAL); 
      if (readState == 0) runState++; 
      break; 
       
    case 2: // 헤더 파일 사용위해 시리얼 모니터 출력
      outputHeader(); 
      runState++; 
      break; 
 
    default:    // 잘못되었다면 다시 시작 
      runState = 0;  
  } 
}​

시리얼 모니터 결과값

 

검정색 대고 영점 조정

그 다음 흰색을 대고 영점 조정

 

 

https://m.blog.naver.com/msyang59/220161793024

 

색 감지 센서 TCS3200 모듈을 붙이다 - 1

아두이노 보드에 컬러(색)를 감지하여 감지한 컬러에 따라 각기 다른 주파수를 갖는 파형(波形)으로 변환하...

blog.naver.com

참고사이트