이 튜토리얼에서는 아두이노와 TCS3200 센서를 사용하여 물체의 색상을 감지하고 LCD에 표시하는 방법을 다룹니다. 이 프로젝트는 물체 색상에 따라 적절한 동작을 수행하는 로봇 팔 프로젝트의 일부로 기획되었습니다.
주요 구성 요소 블록 다이어그램
1단계: 부품 목록 (BoM)
아래 가격은 참고용입니다.
아두이노 나노 (약 $8.00)
TCS3200 컬러 센서 모듈 (약 $9.00)
I2C 1602 시리얼 LCD 모듈 (약 $8.00)
브레드보드 (약 $2.00)
점퍼 케이블
2단계: TCS3200 컬러 센서 이해하기
데이터시트에 따르면 TCS3200은 프로그래머블한 컬러 라이트-투-주파수 컨버터로, 구성 가능한 실리콘 포토다이오드와 전류-주파수 컨버터가 단일 CMOS 집적 회로에 결합되어 있습니다.
TCS3200 컬러 센서 모듈
출력은 50% 듀티 사이클의 사각파이며, 주파수는 빛 강도(조도)에 정비례합니다. 전체 스케일 출력 주파수는 두 개의 제어 입력 핀(S0, S1)을 통해 세 가지 프리셋 값 중 하나로 조정 가능합니다. 디지털 입출력은 마이크로컨트롤러나 기타 로직 회로와 직접 인터페이스할 수 있습니다.
8x8 포토다이오드 배열 구조
TCS3200 내부에는 8x8 배열로 총 64개의 포토다이오드가 있습니다:
16개: 블루 필터
16개: 그린 필터
16개: 레드 필터
16개: 필터 없음 (클리어)
핀 S2와 S3로 활성화할 포토다이오드 그룹(레드, 그린, 블루, 클리어)을 선택합니다. 각 포토다이오드 크기는 110μm x 110μm이며, 중심 간 간격은 134μm입니다.
OE(출력 인에이블) 핀은 GND(LOW)에 연결해야 합니다. 센서는 2.7~5.5V DC로 구동되며, 아두이노의 5V 출력을 사용합니다. 측면 광원을 차단하기 위해 센서에 작은 고무 링을 장착하고 핫글루로 고정하는 것이 좋습니다.
측면 광원 차단을 위한 고무 링 장착
3단계: 하드웨어 연결
TCS3200 및 I2C LCD 연결도
TCS3200 센서 연결
센서 핀
아두이노 나노 핀
S0
D4
S1
D5
S2
D6
S3
D7
OUT
D8
EN
GND
VCC
+5V
GND
GND
I2C LCD 1602 연결
LCD 핀
아두이노 나노 핀
SDA
A4
SCL
A5
아두이노 나노를 브레드보드에 장착하고, 나노의 5V 출력과 GND를 양쪽 전원 레일에 연결합니다.
4단계: 아두이노 코드
아두이노 IDE에서의 코드 모습
주파수 스케일링 설정
S0, S1 핀으로 출력 주파수 스케일링을 설정합니다. 여기서는 둘 다 HIGH(100%)로 설정합니다:
digitalWrite(s0, HIGH);
digitalWrite(s1, HIGH);
색상 성분 읽기
S2, S3 핀으로 읽을 색상(레드, 그린, 블루)을 선택합니다. 포토다이오드가 병렬로 연결되어 있어 S2, S3의 조합으로 다른 그룹을 선택할 수 있습니다:
// 레드 성분 읽기
digitalWrite(s2, LOW);
digitalWrite(s3, LOW);
red = pulseIn(outPin, LOW);
// 그린 성분 읽기
digitalWrite(s2, HIGH);
digitalWrite(s3, HIGH);
grn = pulseIn(outPin, LOW);
// 블루 성분 읽기
digitalWrite(s2, LOW);
digitalWrite(s3, HIGH);
blu = pulseIn(outPin, LOW);
실제 코드에서는 각 RGB 성분을 여러 번 읽어 평균을 내어 오차를 줄입니다.
색상 판별 로직
RGB 세 성분을 얻은 후, 미리 캘리브레이션된 임계값과 비교하여 색상을 판별합니다. 알려진 색상의 테스트 용지나 물체로 RGB 값을 측정해 두어야 합니다. 제 환경에서의 예시 코드입니다:
void getColor() {
readRGB();
if (red > 8 && red < 18 && grn > 9 && grn < 19 && blu > 8 && blu < 16)
color = "WHITE";
else if (red > 80 && red < 125 && grn > 90 && grn < 125 && blu > 80 && blu < 125)
color = "BLACK";
else if (red > 12 && red < 30 && grn > 40 && grn < 70 && blu > 33 && blu < 70)
color = "RED";
else if (red > 50 && red < 95 && grn > 35 && grn < 70 && blu > 45 && blu < 85)
color = "GREEN";
else if (red > 10 && red < 20 && grn > 10 && grn < 25 && blu > 20 && blu < 38)
color = "YELLOW";
else if (red > 65 && red < 125 && grn > 65 && grn < 115 && blu > 32 && blu < 65)
color = "BLUE";
else
color = "NO_COLOR";
}
위 코드에서는 흰색, 검은색, 빨강, 초록, 노랑, 파랑 6가지 색상을 미리 정의했습니다. 주변 광량이 줄어들면 임계값이 높아지는 경향이 있습니다.
loop() 함수에서는 1초마다 LCD에 판별된 색상을 표시합니다. 전체 코드는 GitHub에서 확인할 수 있습니다.
5단계: 결론
작동 중인 컬러 디텍터
이 프로젝트가 전자공학, 로봇공학, IoT의 흥미로운 세계로 여러분을 안내하는 데 도움이 되길 바랍니다!