Color sensor 컬러 센서 모듈

원문 : http://www.elecfreaks.com/1666.html

1. Color sensor

컬러센서에도 여러 종류가 있지만 여기서 소개하는 컬러센서는 TCS230/TCS3200 컬러 센서입니다. ADJD-S311 컬러 센서는 링크를 참고하세요. 컬러 센서를 직접 만드는 방법도 있습니다. 링크, 링크에서 확인하세요.

Chip: TCS230
Input voltage: DC 3 ~ 5V
Output frequency voltage: 0 ~ 5V
Use bright white LED lights
can be connected directly with Microcontroller
Static detection of the measured object color
Best detection distance: 10mm
PCB size: 31.6 (mm) x24.4 (mm)

 

2. 연결 방법

Color sensor – Arduino
GND & LED – GND ,
OE – GND,
VCC – VCC,
S0 – D6,
S1 – D5,
S2 – D4,
S3 – D3,
OUT – D2

OE 핀을 GND에 연결하면 항상 이 모듈을 enable 상태로 두겠다는 의미입니다. OE 핀을 digital 핀에 연결해서 digitalWrite(OE, LOW); 해도 같은 효과가 됩니다.

 

3. 동작 방법

주의!!! 3-4 챕터에 소개된 소스코드가 제대로 동작하지 않는 분은 마지막 챕터에 있는 DFRobot 코드를 이용해서 테스트 하세요. 구동하는 원리는 같습니다.

OUT(Signal) 핀은 빛의 세기에 비례하는 square wave (50% duty cycle) 가 출력되는 핀입니다. 즉, OUT 핀으로 High 상태가 얼마나 반복되는가를 카운트 하면 해당되는 주파수를 알 수 있습니다. Red, Green, Blue 모드 상태에서 한 번씩, 총 3번 OUT 핀으로 출력되는 주파수를 체크하면 R-G-B 파장별 빛의 세기를 알 수 있습니다.

보통 아두이노에서는 UNO 기준 2개의 interrupt 핀을 제공합니다. (Digital 2번, 3번) 여기서는 OUT 핀을 D2에 연결하고 RISING 상태 (HIGH로 변경되는 상태) 에서 자동으로 callback 함수가 호출되도록해서 카운트를 합니다.

일정 시간이 지나면 count 를 종료하고 결과를 저장한 뒤, R->G->B 순서대로 모드를 전환하도록 해야 합니다. 이를 위해 16비트 하드웨어 타이머를 지원하는 라이브러리를 사용합니다.  다음 링크에서 타이머 라이브러리를 받아서 설치해야 합니다. Timer1 Library.

초기화 코드

S0, S1 핀은 OUT 핀으로 출력되는 주파수의 scale을 결정하는 핀입니다. S0-LOW, S1-HIGH 로 설정하면 2% scale로 설정됩니다. 측정 범위와 측정 능력을 micro-controller 보드에 따라 변경하기 위해 scaling을 합니다.

S2, S3 핀은 R-G-B 필터를 선택하는데 사용되는 핀입니다.

다음 코드는 White balance를 조절하는 중요한 코드입니다.

White Balancing은 시스템에게 어떤 값이 흰색이냐를 알려주는 과정입니다. 이론적으로는 RGB 가 동일한 값이면 흰색이라고 할 수 있지만 실제로는 TSC-230 모듈의 RGB 색상에 대한 sensitivity가 틀립니다. 따라서 사용전에 미리 WB를 맞춰줘야 정확한 결과를 얻을 수 있습니다.

WB 조정을 위해 고정된 시간 (여기서는 1초) 동안 RGB 색상별로 주파수를 측정합니다. 그리고 측정된 주파수 값이 0~255 사이의 색상 값으로 변환될 수 있도록 ScaleFactor 를 계산합니다.  실제 사용할 때는 측정 값에 Scale Factor를 곱해서 나온 값을 색상 값으로 사용하게 됩니다.

이상의 과정이 setup() 함수 안에서 이루어집니다. setup() 함수에서는 Timer1.attachInterrrupt(TSC_Callback) 을 실행해서 일정 시간마다 TSC_Callback() 함수를 호출하게 합니다. TSC_Callback() 함수는 RGB 색상값을 계산하고 다음 색상모드로 변경하는 역할을 합니다. setup() 함수는 attachInterrupt(0, TSC_Count, RISING) 호출을 통해 D2번 핀에 대한 인터럽트 함수를 등록합니다. D2 핀으로 들어오는 신호에서 HIGH 가 반복될 때 마다 count 가 증가하도록 합니다. RGB 모드별로 측정이 끝나면 g_array[] 배열에 색상별 주파수 값이 들어있습니다. g_SF[] 배열은 색상값을 만들기 위해 사용하는 Scale Factor 값을 저장하고 있습니다.

실제 컬러 측정은 위 코드에서와 같이 4초간 측정을 위한 대기시간을 가지면 됩니다. 4초간 대기가 끝나면 저장된 g_array[], g_SF 값을 곱해서 색상 값을 출력하면 됩니다. (혹은 1초 단위로 RGB 값을 순서대로 출력해봐도 됩니다.)

아래는 이상의 코드를 이용해서 결과를 출력한 화면입니다.

1번 박스의 값이 1초 동안 White Balancing 용으로 측정된 RGB 값입니다. (Red=1126 , Green=707 and Blue =774). 이 값으로 계산한 Scale Factor 가 2번 박스안에 있는 값입니다. 이제 측정되는 값은 3번 박스의 값이 최대값이 되도록 조정될 것입니다.

초기화 이후 컬러 센서로 측정된 결과는 다음과 같습니다.

4번 값이 측정된 결과 값입니다.

 

4. 소스 코드 (스케치)

위 설명에서 사용된 코드를 손봐서 사용해도 되지만, 불필요한 부분이 많습니다. 아래 코드가 좀 더 깔끔하게 다듬어진 코드입니다. 아래 코드에서는 타이머를 사용하긴 하지만 D2 핀을 이용한 interrupt를 사용하지 않음을 주의하세요!! (대신 일정 시간동안 while 루프를 돌면서 계속 OUT 핀의 값을 읽습니다.)

그리고 기본으로 지정된 핀이 D8~D13 핀입니다. 자신의 프로젝트에 맞게 수정해서 사용하세요.

 

 

5. 좀 더 쉬운 동작코드

 

앞선 예제의 코드가 제대로 동작하지 않는다면 아래 링크의 코드를 사용해보세요.

센서값 측정하는 방식은 앞서 설명한 예제들과 같습니다. 왜인지는 모르겠지만 앞선 코드들은 제가 가진 모듈에서는 제대로 동작하질 않던데 DFRobot 코드는 제대로 동작했습니다.

이 코드는 연결방법이 조금 다릅니다. 코드 최상단에 적혀져 있는대로 연결을 다시 해주던지 코드의 핀 값을 바꿔줘야 합니다.

OE 핀이 없는 모듈의 경우는 연결하지 않아도 됩니다.

LED 핀이 있는 경우 GND 핀에 연결해야 불이 켜지는 경우도 있고, LED 핀을 디지털핀에 연결해서 digitalWrite(LED_pin, HIGH) 해줘야 LED 가 켜지는 경우도 있습니다.

 

Post Author: TORTUGA

TORTUGA
궁금하신 점은 새로 개편한 홈페이지의 QnA 게시판을 이용해주세요!!!!!!! http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=qna

6 thoughts on “Color sensor 컬러 센서 모듈

    박현철

    (2015년 5월 13일 - 5:00 오후)

    Timer1 Library를 추가하여도 에러가 이렇게 발생되는데 이유가 멀까요

    color_senser.ino: In function ‘void TSC_Count()’:
    color_senser:39: error: ‘g_count’ was not declared in this scope
    color_senser.ino: In function ‘void TSC_Callback()’:
    color_senser:44: error: ‘g_flag’ was not declared in this scope
    color_senser:52: error: ‘g_count’ was not declared in this scope
    color_senser:53: error: ‘g_array’ was not declared in this scope
    color_senser.ino: In function ‘void TSC_WB(int, int)’:
    color_senser:78: error: ‘g_count’ was not declared in this scope
    color_senser:79: error: ‘g_flag’ was not declared in this scope
    color_senser.ino: In function ‘void setup()’:
    color_senser:95: error: ‘g_array’ was not declared in this scope
    color_senser:97: error: ‘g_SF’ was not declared in this scope
    color_senser:97: error: ‘g_array’ was not declared in this scope
    color_senser.ino: In function ‘void loop()’:
    color_senser:108: error: ‘g_flag’ was not declared in this scope
    color_senser:110: error: ‘g_array’ was not declared in this scope
    color_senser:110: error: ‘g_SF’ was not declared in this scope

      박현철

      (2015년 5월 13일 - 5:16 오후)

      Librery가 재대로 설치되지 않은거 같습니다.

        TORTUGA

        TORTUGA

        (2015년 5월 19일 - 11:31 오후)

        네 라이브러리 설치 경로 등을 다시 확인해 보세요. 에러메시지는 라이브러리 인식이 안된 메시지입니다.

    김민영

    (2015년 12월 24일 - 2:38 오후)

    아두이노 메가를 사용하는데 led를 GND에 연결해야 불이들어오는데 어떻게 코드를 바꿔써야될까요ㅠㅠ

      TORTUGA

      TORTUGA

      (2016년 1월 2일 - 5:35 오후)

      일단 동작이 제대로 되지 않는다면 아래 DFRobot 코드를 이용해보세요.
      http://www.dfrobot.com/wiki/index.php/TCS3200_Color_Sensor_(SKU:SEN0101)

      LED 핀은.. 모듈에 따라 동작이 틀린것 같습니다. 제가 가진 모듈은 GND로 연결하면 불이 들어오질 않고 일반 디지털핀에 연결해서 digitalWrite(pin_number, HIGH) 해줘야 불이 들어오네요.;;

    김가원

    (2017년 10월 29일 - 7:28 오후)

    같은 공간 같은 조명에서 측정할 때마다 같은 물체에 대하여 결과 값이 다르게 나와요ㅠ100정도 씩 차이가 날 떄도 있고 이건 어디에 오류가 있는거죠??

댓글 남기기

이메일은 공개되지 않습니다.