이 아두이노 튜토리얼에서는 아두이노와 TCS230/TCS3200 컬러 센서를 사용해 색상을 감지하는 방법을 배웁니다. 아래 비디오를 시청하거나 작성된 튜토리얼을 읽어보세요.
TCS230/TCS3200 컬러 센서 작동 원리
TCS230은 8×8 포토다이오드 어레이로 색상 빛을 감지합니다. 전류-주파수 변환기(Current-to-Frequency Converter)로 포토다이오드 판독값을 빛 세기에 정비례하는 사각파 주파수로 변환합니다. 마지막으로 아두이노 보드로 사각파 출력을 읽어 색상 결과를 얻습니다.
센서를 자세히 보면 다양한 색상을 어떻게 감지하는지 알 수 있습니다. 포토다이오드에는 세 가지 색상 필터가 있습니다: 16개는 적색 필터, 16개는 녹색 필터, 16개는 청색 필터, 나머지 16개는 필터 없는 클리어 포토다이오드입니다.
각 16개 포토다이오드는 병렬로 연결되어 있어, 두 제어 핀 S2, S3로 어떤 그룹을 읽을지 선택합니다. 예를 들어 빨간색을 감지하려면 표에 따라 두 핀을 로우 로직 레벨로 설정해 16개 적색 필터 포토다이오드만 읽으면 됩니다.
센서에는 출력 주파수 스케일링용 제어 핀 S0, S1도 있습니다. 주파수는 100%, 20%, 2% 세 가지 프리셋 값으로 스케일링 가능. 이 기능으로 센서 출력을 다양한 주파수 카운터나 마이크로컨트롤러에 최적화할 수 있습니다.
이제 TCS230 센서를 아두이노 보드에 연결해 보겠습니다. 회로도는 다음과 같습니다.
필요한 부품은 아래 링크에서 구할 수 있습니다:
- TCS230 TCS3200 컬러 센서…….
- 아두이노 보드 ……………………………
- 브레드보드와 점퍼 와이어 ………
-
TCS230 컬러 센서 소스 코드
설명: 센서 연결 핀 정의와 주파수 읽기용 변수 정의. setup에서 네 제어 핀을 출력으로, 센서 출력을 아두이노 입력으로 설정. 여기서는 주파수 스케일링을 20%로 설정하고 시리얼 통신 시작으로 시리얼 모니터에 결과 표시.
loop에서 적색 필터 포토다이오드 읽기로 시작: S2, S3를 로우 레벨로 설정. pulseIn() 함수로 출력 주파수 읽어 "frequency" 변수에 저장. Serial.print()로 시리얼 모니터에 출력. 다른 두 색상도 제어 핀만 조정해 같은 방식으로 진행.
/* 아두이노 색상 감지 튜토리얼
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int frequency = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// 주파수 스케일링 20% 설정
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
Serial.begin(9600);
}
void loop() {
// 적색 필터 포토다이오드 읽기 설정
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
// 출력 주파수 읽기
frequency = pulseIn(sensorOut, LOW);
// 시리얼 모니터에 값 출력
Serial.print("R= "); // 이름 출력
Serial.print(frequency); // 적색 주파수 출력
Serial.print(" ");
delay(100);
// 녹색 필터 포토다이오드 읽기 설정
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
Serial.print("G= ");
Serial.print(frequency);
Serial.print(" ");
delay(100);
// 청색 필터 포토다이오드 읽기 설정
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
Serial.print("B= ");
Serial.print(frequency);
Serial.println(" ");
delay(100);
}코드 언어: Arduino (arduino)
시리얼 모니터를 실행하면 값이 나옵니다. 이 값들은 선택한 주파수 스케일링과 주변 조명에 따라 달라집니다.
센서 데이터시트의 포토다이오드 분광 감도도에 따라 각 포토다이오드 유형별 감도가 달라 세 값이 다르게 나옵니다.
그럼 센서 앞에 다른 색상을 가져갔을 때 값이 어떻게 변하는지 봅시다. 예를 들어 빨간색을 가져가면 초기 값이 제 경우 70에서 25 정도로 떨어집니다.
감지된 색상을 0~255 범위의 RGB 모델로 표현하려면 map() 함수로 판독값을 0~255로 매핑/변환합니다.
// 주파수 값을 0~255 RGB 모델로 재매핑
frequency = map(frequency, 25, 70, 255, 0);
70은 0으로, 25는 255로 매핑. 다른 두 색상도 같은 방식.
이 예제의 최종 소스 코드:
/* 아두이노 색상 감지 튜토리얼
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
int frequency = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// 주파수 스케일링 20% 설정
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
Serial.begin(9600);
}
void loop() {
// 적색 필터 포토다이오드 읽기
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
frequency = pulseIn(sensorOut, LOW);
// 주파수 값을 0~255 RGB 모델로 재매핑
frequency = map(frequency, 25, 72, 255, 0);
Serial.print("R= ");
Serial.print(frequency);
Serial.print(" ");
delay(100);
// 녹색 필터 포토다이오드 읽기
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
frequency = map(frequency, 30, 90, 255, 0);
Serial.print("G= ");
Serial.print(frequency);
Serial.print(" ");
delay(100);
// 청색 필터 포토다이오드 읽기
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
frequency = map(frequency, 25, 70, 255, 0);
Serial.print("B= ");
Serial.print(frequency);
Serial.println(" ");
delay(100);
}코드 언어: Arduino (arduino)
색상 정확도는 완벽하지 않지만 간단한 프로젝트에는 충분합니다. 다음 영상에서는 TCS230 컬러 센서로 아두이노 자동 색상 분류 기계를 만드는 방법을 다룰 예정입니다.
궁금한 점은 댓글로 남겨주시고, 제 아두이노 프로젝트 모음도 확인해 보세요.