본문 바로가기
Arduino&RasberryPi/Arduino Uno

16. Arduino - 광센서 원리 및 사용

by Rosmary 2019. 11. 13.
728x90
반응형

지난 온도 센서 시험 실패 이후로, 약간은 의기소침해져 있던 상태에서, 다른 센서를 회로에 넣어 돌려보기로 했다. 이번에 실험할 부품은 광센서로, 이름 그대로 빛의 세기에 반응하는 센서라고 보면 된다.

 

이 센서는 광전효과라고 불리는 물리 현상을 이용한다. 광전 효과에 대해 이해하려면, 물리학에서 빛이라는 녀석이 어떻게 정의되어왔는지, 그 역사를 잠깐 살펴보는 것이 좋다.

 

 

1. 빛이란 무엇인가...

 

언제까지였는지 정확히 기억이 나지 않지만, 빛이라는 녀석은 단순히 파동으로만 정의가 되던 때가 있었다. 토마스 영이라는 사람이, 매우 어두운 상자 내에, 2개의 전구를 켠 채로 넣어두고, 그 상자에 아주 작은 구멍 2개를 뚫어 빛이 어떻게 발산되는지 실험한 적이 있다(이중 슬릿 실험). 실험의 결과로, 두 구멍으로 새어나온 빛이 마치 파동이 그러하듯이 서로 간섭을 일으키는 모습이 포착되어, 빛은 파동의 성질을 가진 녀석이라고 여겨져왔다.

 

하지만, 태양으로 오는 빛이 파동의 성질만 가지고 있다면, 지구에서는 태양의 따스함을 전혀 느낄 수 없게 된다. 왜냐하면 우주는 진공 공간이라 에너지가 전달되는 매질이 없기 때문에(파도는 물을 타고, 소리는 공기를 탄다는 것을 생각해보자). 이러한 의문을 해결하기 위해 연구를 거듭한 몇몇 과학자들은, 빛이 파동의 성질은 물론, 입자의 성질을 가지고 있다고 결론 내리게 된다. 즉, 우리가 보고 있는 빛은 매우매우매우 작은 입자이며, 이 입자가 특정 진동수를 가지고 이동하면서 파동의 성질도 같이 띄게 된 것이라고 보면 된다.(야구공을 하나의 입자라고 생각한다면, 투수가 던진 야구공은 직선으로 쭈욱 날아가는 것이 아니라, 주기적으로 위아래로 진동하면서 날아간다는 것이다)

 

 

 

2. 빛의 운동 에너지와 광전효과 

 

 

그럼, 빛이 입자의 성질을 가지고 있으니, 이 입자가 이동하면서 생성되는 운동에너지도 분명 존재할 것이다. 흔히 Ek(운동에너지) = mv^2 / 2로 알려져 있는 식은, 광자에 적용될 경우, E = mc^2라는 식으로 바뀌게 된다. 사람의 관점에서 보면, 광자 하나가 빛의 속도로 움직이다가 사람과 부딪히더라도, 매우 작은 광자의 질량(m)으로 인해 사람은 가려움조차 느끼지 못하지만(물론, 하루종일 햇볕을 쬐면 가렵긴 하다...), 전자와 같은 입자의 관점에서, 광자가 자신에게 부딪힌다는 것은 핵폭탄이 터지는 이상의 충격과 같을 것이다.

 

전기 회로를 구성하는 금속 입자를 확대해보면, 질량이 큰 핵(양성자+중성자) 주변을, 크기가 매우 작은 전자가 빙글빙글 돌고 있는 형태를 띄고 있다. 마치 지구 주변을 달이 돌고 있는 것과 비슷한 형태다. 그런데 만약, 달과 비슷한 크기의 소행성 하나가 지구로 날아오다가 달과 충돌했다고 가정해보자. 소행성과 달이 산산조각이 나지 않는다고 가정한다면, 이 충돌로 인해 발생한 에너지로 인해, 달은 지구 주변을 돌던 궤도를 벗어나 우주 저 멀리로 사라지게 될 것이다. 빛이 금속에 부딪히면 이와 비슷한 현상이 벌어지는데, 빛의 입자인 광자가, 금속 입자에 부딪히면, 핵 주변 궤도를 돌던 전자는 충돌 에너지로 인해, 핵 인력을 벗어나는 것은 물론, 다른 곳으로 이동할 수 있는 에너지까지 덤으로 얻게 된다. 전자가 금속 내부를 이동한다면?? 그게 전류가 된다. 

 

 

정리하자면, 빛 입자가 금속에 부딪히면서, 금속 원자의 전자가 이동할 수 있는 에너지를 제공하게 되는데, 이 에너지로 인해 전자가 금속 내부를 이동하면서 전류가 발생한다는 것이다. 이를 물리 용어로 광전효과라고 하며, 광센서는 이러한 광전효과로부터 만들어진 부품이라고 보면 된다.

 

 

 

 

3. 광센서 회로의 연결

 

광센서는 회로와 연결되는 2개의 다리를 가지고 있으며, 보통 아래의 사진과 같은 모양을 띄고 있다.

 

온도 센서와 달리, 극성을 가지지 않는 부품이므로, 양 단자의 어느부분이라도 GND나 전원 소스핀과 연결될 수 있다. 다만, 회로를 구성함에 있어서, 과도한 전압이 부품에 걸리는 것을 방지하기 위해, 1K 옴짜리 저항을 함께 회로에 넣어준다.

 

 

 

저항을 달아주어야 한다는 점만 주의한다면, 회로 구성에 큰 어려움은 따르지 않는 부품이다.

 

 

 

 

 

4. 광센서 동작 코드

 

빛이 없다면, 광센서 내부를 흐르는 전자도 존재하지 않기 때문에, 광센서와 GND 핀 사이에서 analogRead() 값을 측정한다면, 결과로 0 값이 나오게 된다. 반대로, 매우 밝은 빛이 광센서에 인식된다면, analogRead() 값은 빛의 세기에 비례해 증가하게 된다. (일반적으로 가정집 전등이 450 근처 값으로, 스마트폰 플래시가 900중/후반대 값으로 출력된다)

 

코드는 단순하다.

 

============================

int readPin = A0;

void setup ()
{
  Serial.begin(9600);
  pinMode(readPin, INPUT);
}

void loop ()
{
  Serial.print("Value: ");
  Serial.println(analogRead(readPin));

  delay(1000);

=============================

 

위 코드는 1초마다 센서로부터 출력 전압값을 받아 Serial Monitor에 출력시키라는 의미를 가지고 있다. 코드 실행 후, 센서를 손으로 가리거나, 핸드폰 플래시를 센서에 가까이 비춰보면, Serial Monitor에 출력되는 analogRead() 값이 지속적으로 변하는 것을 확인할 수 있다.

 

 

 

5. 응용

 

깜깜한 밤에 가정집 방의 불이 켜진 상태에서는, Arduino 회로 위의 LED가 꺼진 상태로 존재하다가, 불이 꺼져 주변이 어두워지면 LED가 점등되도록 프로그램 코드를 작성할 수 있다. 이 프로그램 역시, 이전의 예제들과 마찬가지로 회로를 이중화하여 동작시키는 방식을 사용하면 된다.

 

 

FIN.

반응형

댓글