본문 바로가기

Programming/IoT_Embedded

아두이노로 알아보는 적외선 센서

아두이노와 같은 마이크로 콘트롤러를 이용해서 할 수 있는 것 들 중에 적외선을 이용하면 할 수 있는 것이 많은데요,
이번에는 적외선을 인식하는 센서와 적외선을 만들어내는 LED를 이용해서 실험해보고 원리를 알아 보려고 합니다.

이번 실험에서는 적외선LED와 수신기를 이용해서 장애물 센서와 근접센서를 만들어 볼겁니다.
이 실험을 위해서 필요한 부품은 아래와 같습니다.
  • 포토트랜지스터(적외선 수신)  1개
  • 포토다이오드(적외선 송신) 1개
  • 저항 1M옴 ,
  • 저항 40옴~100옴 중 1개

우선 적외선을 인식하기 위해서는 포토트랜지스터(Phototransister)라는 것이 필요합니다.
이름이 어렵게 느껴지지만 별것 아닙니다. 가격도 저렴한 것은 130원 밖에 안합니다.

이번 실험에서 사용할 부품은 아래 링크에서 구입할 수 있습니다.
https://www.eleparts.co.kr/EPX33JXV  (뭐 꼭 여기서 구입하라는 건 아닙니다)


포토트랜지스터는 적외선을 인식하면 전류를 흐르게 하는 특징을 가지고 있습니다.
그러니까 적외선 빛이 베이스(Base)가 되고 긴다리가 콜렉터(Collector), 짧은 다리가 에미터(Emitter)가 되는 트랜지스터 입니다.
이런말이 어렵다면 패스 하셔도 됩니다만, 나중에는 슬슬 알아 두셔야 취미로 메이커(Maker) 활동을 하든
진지하게 임베디드 개발자를 하든 하실 수 있으니 마음에 준비는 해두시는 게 좋습니다.

어쨌든, 쉽게 다시 말하면 긴다리를 양극(+)에 짧은 다리를 음극(-)에 연결하고 그냥 두면 전기가 흐르지 않다가
적외선 빛을 쐬면 빛에 세기에 따라 전기가 흐른다는 겁니다.
그럼 일단 포토트랜지스터를 아두이노 아날로그 A0핀으로 입력을 받도록 해볼까요?


저항은 1M옴을 사용했는데, 풀업의 의미입니다.
(풀업저항에 대해 궁금하시면 http://blog.xcoda.net/77 를 읽어 보세요.)
저항이 10K옴이 아니라 1M옴 이냐면, 풀업 저항이 크면 클 수록 입력 신호에 전위차가 커져서 
아날로그 입력 핀에 감도가 좋아 지기 때문입니다. (이 부분은 나중에 전압분배 법칙을 따로 포스팅 하겠습니다.)
1M옴이 없으면 10k옴을 써도 무방합니다. 다만, 감도가 조금 더 떨어질 겁니다.

어쨌든 이렇게 회로를 구성하고 아두이노에 코드를 업로드 합니다.

#define IRRX A0

int val = 0;
void setup() {
  Serial.begin(9600);
}

void loop() {
  int r = analogRead(IRRX);
  if( abs(r - val) > 0){
    Serial.println(r);
    val = r;
    delay(100);
  }
}

A0핀에서 아날로그로 입력을 받아서 시리얼모니터에 출력하는 아주 간단한 코드 입니다.

이제 시리얼 모니터를 실행시키고 집에 있는 리모콘 하나를 가져다가 아무 버튼이나 눌러 봅니다.
그러면 입력값이 조금이 다르게 찍히는걸 볼 수 있을 겁니다.

아래 동영상은 실험 결과입니다.

다들 아시다 시피 리모콘은 적외선으로 신호를 보내기 때문에 리모콘 버튼을 누르는 것에 따라 포토레지스터로 부터 입력되는 값이 
바뀌게 되고 이에 따라 아두이노 A0핀에 입력되는 전압도 달라 지게 됩니다.

이번에는 리모콘을 치우고 우리가 적외선을 발신하는 장치를 만들어 봅니다.
필요한 부품 링크입니다. http://www.eleparts.co.kr/EPX33JXY
가격은 120원 이네요.


적외선을 발생 시키는 LED인데요. 모양은 파란색 빛을 내는 LED와 똑 같습니다.
그래서 섞어 놓으면 찾을 수가 없습니다.

이 LED를 켜는데  저항이 필요할 텐데요.
통상 아두이노로 LED를 켜는데 220옴을 쓰지만 IR LED는 220옴을 이용해서 켜면 너무 약하게 켜집니다.
물론 적외선 이기 때문에 우리 눈으로는 안보이는데, 핸드폰 카메라로 보면 불빛을 눈으로 볼 수 있습니다.


위 사진에서 왼쪽에 불빛이 220옴으로 켠것이고 오른쪽이 40옴으로 켠것입니다.
(다시 말하지만, 맨 눈으로는 안 보여요, 핸드폰 카메라로 보세요.)

자, 그럼 저항을 몇 옴을 써야 할까요?
계산을 위해서 판매처에서 제공하는 데이타 시트를 확인합니다.


위 표에서 Forward Current(100mA)가 IR LED의 사용 전류이고, Forward Voltage(1.3V~1.7V)가 사용 전압입니다.

그럼 V = I * R이라는 오옴의 법칙에 따라 필요한 저항 값을 찾을 수 있겠네요.
전류가 100mA(= 0.1A)이고 전압은 1.3V~ 1.7V이니까 그 중간 정도 인 1.5V로 보고 계산을 하면,
아두이노가 5V가 나오니까 5V에서 IR LED가 쓰는 1.5V를 빼면, 3.5V가 나오구요.
그것을 사용 전류 0.1(단위를 마춰야 하니까 100mA를 0.1A로 바꿉니다)로 나누면 되겠군요. 
식으로 다시 쓰면 : (5 - 1.5)V / 0.1A = 35옴

결국 35옴을 쓰면 가장 밝게 IR LED를 켤 수 있습니다. 
근데 만약 여기서 조금만 전류나 전압이 세지면 LED는 바로 망가지는 벼랑끝 수치 이니까 약간 안전하게 수치를 낮출 필요가 있습니다.
그래서 50옴 정도면 적당할 듯 한데, 제가 가진 저항이 없어서 100옴을 이용했습니다.
실험 하실 분은 40옴에서 100옴 사이에 가지고 계신것 중 적당한것을 골라서 쓰시면 됩니다.
35옴 보다 작은 저항을 쓰면 IR LED가 타버려서 못쓰게 되고 100옴 보다 큰 저항을 쓰면 빛이 너무 약해서 실험이 잘 안됩니다.


이제 아두이노 코드를 아래와 같이  다시 업로드 합니다.

#define IRRX A0
#define LED 13

int val = 0;
void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int r = analogRead(IRRX);
  if(r > 999){
    digitalWrite(LED, HIGH);
  }else{
    digitalWrite(LED, LOW);
  }
  if( abs(r - val) > 0){
    Serial.println(r);
    val = r;
    delay(100);
  }
}

그리고 디지털 13번 핀에 일반 LED도 하나 꼽아 두고, IR LED와 포토트랜지스터를 서로 마주보게 한 후에
시리얼모니터 값을 확인하고 그 사이에 손으로 장애물을 만들어서 값을 다시 확인 하면 그 차이를 볼 수 있습니다.


이것을 이용하면 외부에서 누가 침입했는지, 어떤 통로를 누가 통과 했는지, 몇번 통과 했는지 등을 알 수 있고
실제로 방범이나 자동문 등에 사용하고 있습니다.

또, IR LED와 포토트랜지스터를 사로 같은 방향으로 바라보게 하고 다시 실험을 해 보면,
앞에 아무것도 없을 때는 적외선 인식이 되지 않다가 앞에 무언가가 나타나면 적외선이 반사되어 인식이 되는 것을 알 수 있습니다.


이것을 이용하여 근접 센서에 응용할 수 있는데, 남자 화장실 소변기에 사람이 서거나 멀어지면 물이 내려가는
식으로 실제 사용하고 있습니다.

또, 근접한 물체의 색이 검정색일때와 하얀색일때 반사 정도가 달라 지는 것을 확인 할 수 있는데,
이것을 이용해서 라인트레이서(선을 따라 자율 주행하는 자동차)를 만들기도 합니다.



이와 같은 적외선 센서의 가장 큰 단점은 실내에서만 사용 할 수 있다는 것입니다.
실외에서 태양의 직사광선을 받으면 태양광에 엄청난 적외선이 있기 때문에 제대로 인식할 수 없습니다.
그래서 방범에 사용하는 적외선 센서 장치는 이렇게 작지 않고 엄청 크고 2중화하고,
썬글라스처럼 태양 빛을 차단하는 물질로 덮어 놓습니다.
전압도 12V~ 24V를 사용합니다.


위 사진은 실제로 방범회사에서 설치할때 사용하는 것과 동일한 제품으로 제 집에서 사용하고 있는 적외선 센서입니다.
아두이노 보드와 비교해서 보시면 적외선 발생기와 수신기 크기가 얼마나 큰지 알 수 있을 겁니다.

다음에는 리모콘 인식과 복제에 대해서 다뤄 볼까 합니다.