조도센서를 사용하여 광량 측정하기

[컴퓨터월드] 아두이노는 이탈리어로 ‘친한 친구’라는 뜻을 가진 대표적인 오픈소스 하드웨어다. 딱딱하고 접근하기 힘들었던 임베디드 분야를 누구나 쉽게 접근할 수 있도록 만든 미니 기판이라 할 수 있다. 이번 강좌에 사용하는 아두이노 오렌지보드는 한국형 아두이노라 할 수 있다.

아두이노의 보급은 오픈소스 하드웨어의 확산을 불러일으켰고 메이커 문화의 확산에도 큰 기여를 했다. 최근에는 인텔, 마이크로소프트 등 대형 기업들도 이런 오픈소스 하드웨어 시장에 뛰어들기 시작했다. 그 만큼 오픈소스 하드웨어 시장의 잠재력이 커졌다는 얘기이다.


조도센서란 무엇인가?

조도센서(Photo Resistor)는 주변의 밝기를 측정하는 센서다. 조도센서는 다른 이름으로는 광도전셀이라고 불리기도 하며 황화카드뮴(CdS)을 소자로 사용한 경우 CdS 센서라고 한다. 광에너지(빛)를 받으면 내부에 움직이는 전자가 발생하여 전도율이 변하는 광전효과를 가지는 소자를 사용한다. 어두운 곳에서는 절연체와 같이 저항이 높아지며 가시광선이 닿으면 도체와 같이 저항이 낮아지는 성질을 가진다.

CdS센서는 작고 저렴하기 때문에 가장 보편적으로 사용되고 있는데 어두워지면 자동으로 켜지는 가로등, 자동차의 헤드라이트, 밝기에 따라 변하는 핸드폰 화면 액정 등 실생활에서도 쉽게 찾아 볼 수 있다.

▲ CdS센서


조도센서 사용방법

조도센서는 극성은 없으나 빛의 양에 따라 전도율이 변한다. 빛의 양이 많아질수록 전도율이 높아져 저항이 낮아진다. 그러나 전도율이 밝기에 비례하여 선형적으로 증가하는 것이 아니기 때문에 정확한 Lux 값을 구하기보다는 밝고 어두운 정도만을 판별하기에 적합하다.

이 예제에서 사용된 조도센서(CdS)는 옥외주차장, 휴식중의 극장 객석 정도의 빛의 양(10 Lux) 에서 약 10KΩ의 저항을 가지며, 아무런 빛이 없는 암실에서 약 200KΩ의 저항을 가진다.

조도센서도 일종의 저항이나, 빛의 양이 매우 많은 경우, 저항이 매우 작아져 과전류가 흐를수 있다. 그리고 조도센서의 저항 값에 따른 전압을 신호로 입력받기 위해서 10K 저항을 달아준다. 이 예제에서는 풀업 저항을 사용한다. 풀업 저항 사용 시, 조도센서의 저항값에 따라 전압 분배가 일어나며, 빛의 양이 많을수록 (밝을수록) 측정되는 전압의 크기는 작아진다.

▲ 풀업 저항

필요한 부품 목록
오렌지보드로 광량을 측정해보기 위한 준비물은 아래와 같다.

 

▲ 필요한 부품 목록


하드웨어 연결하기


1. 오렌지보드의 5V핀을 브레드보드의 +버스에 연결한다.
2. 오렌지보드의 GND핀을 브레드보드의 -버스에 연결한다.
3. 조도센서를 그림과 같이 세로로 꽂는다.
4. 10K 저항을 조도센서의 상단 단자에 연결한다.
5. LED를 애노드(긴 단자)가 아래쪽으로 향하게 하여 꽂는다.
6. LED의 애노드에 330Ω 저항을 연결한다.
7. 조도센서의 하단 단자를 -버스에 연결한다.
8. 10K 저항의 반대편 단자를 +버스에 연결한다.
9. 조도센서의 상단 단자를 오렌지보드 A1번핀에 연결한다.
10. LED 애노드와 연결된 저항의 반대 쪽을 오렌지보드 A0번핀에 연결한다.
11. LED의 캐소드 (짧은 단자)를 -버스에 연결한다.

 
 
 


소스코드


/*
제목 : 조도센서로 어두워지면 LED 켜기
내용 : 조도센서를 손으로 가려 어둡게 만들면 LED가 켜지도록 해봅시다.
*/
// 조도센서는 빛의 밝기에 대하여 전기저인 성질로 변환시켜주는 센서입니다.
// 조도센서를 아날로그 A1핀으로 설정합니다.
int cds = A1;
// LED를 A0핀으로 설정합니다.
int led = A0;
// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
// 조도센서의 동작 상태를 확인하기 위하여 시리얼 통신을 설정합니다. (전송속도 9600bps)
// 메뉴 Tool -> Serial Monitor 클릭
Serial.begin(9600);
// LED 핀을 OUTPUT으로 설정합니다.
pinMode(led, OUTPUT);
}
// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행됩니다.

void loop() {
// 조도센서로 부터 측정된 밝기 값을 읽습니다.
// 조도센서로 부터 입력되어지는 전압의 크기 (0~5V)에 따라 0~1023 범위의 값으로 변환되어 반환합니다.
int cdsValue = analogRead(cds);
// 측정된 밝기 값를 시리얼 모니터에 출력합니다.
Serial.print("cds = ");
Serial.println(cdsValue);
// 조도센서로 부터 측정된 밝기 값이 500보다 크다면, 아래의 블록을 실행합니다.
if (cdsValue > 500) {
// LED가 연결된 핀의 로직레벨을 HIGH (5V)로 설정하여, LED가 켜지도록 합니다.
digitalWrite(led, HIGH);
// LED상태를 시리얼 모니터에 출력합니다.
Serial.println("LED ON (cds > 500)");
}
// 조도센서로 부터 측정된 밝기 값이 500보다 작면, 아래의 블록을 실행합니다.
else {
// LED가 연결된 핀의 로직레벨을 LOW (0V)로 설정하여, LED가 꺼지도록 합니다.
digitalWrite(led, LOW);
// LED상태를 시리얼 모니터에 출력합니다.
Serial.println("LED OFF (cds < 500)");
}
// 0.2초 동안 대기합니다.
delay(200);


위 코드에서는 조도센서와 LED를 같이 사용한다. 조도센서가 측정한 빛의 세기에 따라 LED를 제어하게 된다. 조도센서를 사용하는 코드는 단순하기 때문에 크게 어려운 곳이 없다. 이 소스에서 사용된 코드 대부분은 이전 회차의 다른 코드 설명에서 설명했기 때문에 이전 회차를 봤고, 따라해 본 사람이라면 쉽게 이해할 수 있을 것이다.
 

int cds = A1; //조도센서는 A1핀을 사용합니다.


조도센서의 경우에는 값이 그래프처럼 이어지는 선형 구조이기 때문에 2가지 경우로 나눠지는 디지털이 아닌 아날로그 핀(A1)을 사용한다. 아날로그 핀을 사용하기 때문에 읽어오는 값의 형태는 당연히 아날로그 데이터로 받게 된다. 따라서 디지털 데이터를 받아올 때와는 다르게 analogRead()를 통해 데이터를 조도센서로부터 읽어온다. 여기서 읽어오는 값은 정확히 말하면 빛의 밝기가 아니라 조도센서의 저항값으로 인한 전압의 크기이다. 아날로그 데이터의 경우에는 최소 0(0V)부터 1023(5V)까지의 값을 읽어오게 된다.

int cdsValue = analogRead(cds);
// 조도센서로 부터 입력되어지는 전압의 크기 (0~5V)에 따라 0~1023 범위의 값으로 변환되어 반환합니다.

읽어온 값은 조건문을 통해 값의 비교가 이루어진다. 읽어온 값이 500보다 크다면 LED에 HIGH신호를 주어 켜고 500보다 작다면 LED에 LOW신호를 주어 끄게 된다.

조도센서 값의 확인은 아두이노의 시리얼 모니터 창을 통해 확인이 가능하다.


마치며

조도센서는 아두이노를 사용할 때 간단하게 사용할 수 있는 기초적인 센서 중 하나이다. 연결하는 방법도 간단하고 가격도 싸고, 사용하기 위한 소스 코드도 간단하기 때문에 아두이노 센서 입문에 적합하다. 또한 간단한 원리를 통해 빛의 세기를 파악할 수 있기 때문에 다른 센서나 LED와 쉽게 조합하여 사용할 수도 있고, 실생활에서 사용할 수 있는 프로젝트를 제작해 볼 수도 있다.

조도센서의 기능은 비록 단순한 광량 체크지만 단순히 조도 체크기능 프로젝트뿐 아니라 응용한다면 조도센서 여러 개로 손동작을 읽을 수 있는 제스처센서로 사용해볼 수도 있고, 조도센서 여러 개로 태양을 따라다니는 솔라트래커도 만들어 볼 수 있다. 사용하는 방법에 따라 다양한 방법으로 색다르게 사용이 가능하다. 프로젝트에 대한 더 자세한 내용을 알고 싶다면 Kocoafab.cc를 방문해 보길 바란다.
 

 

 코코아팹은 한국 메이커 문화를 만들어가는 온라인 메이커포털이다. 오픈소스 하드웨어 오렌지보드의 생산과 활용법 공개 등 많은 활동을 진행하고 있다.

 

저작권자 © 아이티데일리 무단전재 및 재배포 금지