본문 바로가기

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를 사용합니다.


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

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


  • 익명 2016.05.24 15:48

    비밀댓글입니다

  • 지나가던학생 2016.11.20 22:11

    좋은 자료 감사합니다 많은 도움이 되었습니다

  • 익명 2016.11.25 21:41

    비밀댓글입니다

    • Favicon of https://blog.xcoda.net BlogIcon 이세우 2016.12.12 22:24 신고

      저도 몇가지 스마트 폰으로 적외선 LED를 확인해 봤는데, 아이폰은 빛을 보여 주지 않더군요.

      저는 여러 이유로 아이폰을 쓰지 않고 있습니다.^^

  • anavella 2017.11.09 22:20

    안녕하세요
    좋은 자료 정말로 감사합니다 ㅠㅠ 과제할때 한줄기의 희망이 되었어요 ㅠㅠ
    제가 화학과인데 왜 이런거를 하자고 조별과제가 잡힌건지.. ㅎㅎ

    암튼 적외선 근접센서를 통해서 나란히 놓은 마지막 실험 영상 있잖아요? 코딩은 위의 실험과 동일하게 해도 되는 건가요?
    또 연결도 위와 동일하게 하면은 되는건가요??

    이상 대학교 1학년생의 질문이었습니다
    읽어주셔서 감사합니다 ㅠㅠ

    • Favicon of https://blog.xcoda.net BlogIcon 이세우 2017.11.14 23:21 신고

      네, 그대로 하시라고 작성한 포스트에 다시 질문을 하셨네요.
      화학과에서 왜 이런 과제를 진행하시는지 모르겠네요. 좋은 성과 있기를 바랍니다.

  • 희이재 2018.05.29 02:05

    안녕하세요 기계공학과 졸업작품 관련해서 아두이노를 사용하고있는데

    블로그를 통해 많이 배우고 있습니다. 정말 감사합니다!!!!

    그런데 진행을하면서 막힌게

    IR LED와 트랜지스터를 서로 마주보게하여 시리얼모니터값을 확인하여 1023이 나오는것 까지 확인을 했는데

    그사이에 장애물을 넣어서 본 시리얼모니터 값이 1023에 그대로 있습니다...ㅠㅠ

    1023만 줄줄이 뜨고 변함이 없더라구요.

    저희가 제작하려고하는 졸업작품 방향은 동영상처럼 IR센서와 트랜지스터가 서로 마주보고 신호를 받고있는 상황을 정상

    상황으로 가정하여 LED를 점등하는것인데 IR센서와 트랜지스터 시리얼모니터값이 장애물이 있을때와 없을때의 차이가 없

    어서 갑갑한 마음입니다. ㅠㅠ

    아두이노를 완전 처음 접해본것이라 많이 막막한데 조언주시면 정말 감사하겠습니다.

    • Favicon of https://blog.xcoda.net BlogIcon 이세우 2018.08.16 21:02 신고

      답변이 늦어서 미안합니다.
      1023 값이 변함없이 측정된다면 해당 핀에서 5v가 변함없이 입력된다는 뜻입니다.
      회로를 잘 확인해 보시라고 밖에 드릴 말씀이 없네요.

  • dd 2019.10.14 00:32

    저 회로에서 트랜지스터가 빛을 안받으면 A0에 전류가 안흐르는건 알겠는데 빛을 받으면 GND랑 A0에 병렬로 연결되나요?