[매드정] 아두이노 강좌 - 15. 리모컨 센서 모듈 동작

안녕하세요~ 매드 입니다.
이번 시간에는 센서 중에서도 활용도가 높은 리모컨 센서 모듈을 다루어 보도록 하겠습니다.

벌써 15강이나 진행했네요~ ㅎㅎ 생각보다 시간이 금방 지나가는 것 같습니다. 이것저것 많은 것들을 할려다보니 생각처럼 진도 나가는 것들이 많이 없네요 ㅠ
그래도! 한번 시작한 만큼 없는 컨텐츠를 만들어내는 그날까지 진행해 보겠습니다!

그럼 리모컨 센서에 대해서 알아볼까요?~


15-1. 적외선이란?

먼저 적외선이 무엇인지 알아보도록하죠.


< 출처 : 구글 사진 >

잘 보이시나요?~ 먼가 굉장히 많아보이는데 굉장히!! 굉장히 중요한 그림입니다. 빛을 주파수로 나누면 위 처럼 여러가지로 나눌 수 있는데요. 우선 오늘 공부할 가운데 3가지만 보고 가도록 하죠. 적외선, 가시광선, 자외선 입니다.

우리가 일반적으로 사물들을 칼라로 인식하고 볼 수 있는 이유는 '가시광선' 때문입니다. 사물에 빛이 비춰지면 색깔을 흡수하고 남은 색이 반사되는데 우리가 눈으로 보는 색은 이 사물로 부터 반사되는 색을 보게되는 것이죠. 예를들어 잎사귀가 초록색으로 보이는 이유는 나머지 색들을 다 흡수하고 초록색만 반사되기 때문입니다. 가시광선은 우리랑 굉장히 친숙하죠? ㅎㅎ

그럼 가시광선을 기준으로 오른쪽에 있는 자외선은 멀까요~? 우리가 여름에 태양 빛을 쬐면 안좋다고 썬크림을 바르게되는데 이 썬크림이 바로 자외선 차단제 입니다. ㅠ 당연히 우리 몸에 별로 안좋으니까 자외선 차단제를 바르는 것이겠죠~

앞서 이야기가 좀 길었는데 가시광선의 왼쪽에 있는 '적외선'이 바로 오늘 공부할 부분입니다. 이 적외선은 현재 많은 곳에서 사용되고 있습니다. 우선 사람은 가시광선만 구분할 수 있기 때문에 밤에 카메라 촬영할 때 적외선 빛이 사용되구요. 이외에도 많이 사용되는 것이 바로 오늘 진행할 리모컨 센서에도 사용되게 됩니다. 이 적외선을 이용해서 옛날에는 많은 무선통신을 했는데요. 심지어 핸드폰끼리 사진, 전화번호 등을 주고 받기 위해서도 잠시 사용되었었죠.

사실 리모컨 센서 모듈이라고 부르기는 했지만 적외선 수신기라고 부르는게 더 정확하게죠. 사람의 눈으로 볼 수 없는 빛을 적외선 수신기를 통해 받아서 사용하기 때문입니다.

어떻게 통신하냐구요?~ 한번 자세히 알아보죠.


15-2. 리모컨 센서

< 출처 : 구글 사진 >


우선 리모컨 센서만 보면 위와 같이 생겼습니다. 이 리모컨 센서의 정식 이름은 '적외선 수신기' 인데요. 영어로 적으면 Infrared Red Receiver 죠.

위와 같이 생긴것 이외에도 많은 종류가 있지만 국내에서 리모컨 센서라 부르고 쉽게 구할 수 있는 것은 보통 그림 처럼 생겼습니다.

< 출처 : 구글 사진 >

모델명 1838b ir receiver로 구글에서 검색해서 찾아보니 위와 같은 사진이 나오네요. 생긴건 비슷하게 생겼어도 반드시 정확한 모델명으로 구글에서 검색해서 어떤핀이 OUT,GND,VCC 핀인지 확인하셔야 합니다. GND랑 VCC가 반대인 모델들이 꽤 있거든요.

이제 위와 같은 그림만 봐도 우리는 어떻게 연결해야될지 대충 감이 오지요?~

VCC는 아두이노의 5V에 연결하고
GND는 아두이노의 GND에 연결하고
OUT신호는 아두이노의 Digital PIN에 연결하면 되는데... 이전시간에 설명했던 무언가가 떠오르지 않나요~?

바로 '외부 인터럽트' 죠. 외부에서 들어오는 신호인 적외선 센서 신호를 아두이노의 아무핀으로도 신호를 받을 수 있지만 가끔씩 신호를 놓칠 수 있기 때문에 외부 인터럽트 핀인 아두이노 2,3번 핀을 사용하는 것이 정확도와 성능을 높일 수 있으니 참조하시기 바랍니다!

다른 핀을 쓰면 안되냐구요?~ 아뇨 됩니다. 정확하게는 '폴링' 방식이라고 부르는데 인터럽트 방식이 아니라 매 시간마다 입력값을 체크하기 때문에 여러가지 동작을 겹쳐서 하게되면 신호를 놓칠 수 밖에 없게되죠. 그럼 저 신호를 잡기 위해서 얼마나 빨리 잡아야 하느냐면... 흠.. 이건 고급과정인데 '나이퀴스트 이론' 이라고 입력되는 신호의 2배 이상 만큼 빠르게 샘플링하게 되면 문제가 없다는 이론 입니다. ㅎㅎ 우선 이런게 있다~ 라고만 알고 가죠.

< 출처 : 구글 사진 >

초보인 저희를 위해서 ㅠㅠ 누군가가 리모컨 코드를 분석해 두었네요! 리모컨에 따라서 조금씩 방식은 다르지만 대부분은 위와 같다고 생각하면 됩니다. 먼가 많이 봤던 파형들 같죠? 이전 시간에 했었던 WS2812B, 18b20 등이랑 비슷하네요! 데이트 비트의 1이 0.56ms이고 1과 0을 합친 길이가 1.125ms 이면 '로직 0'으로 인식하고 2.25ms 이상이면 '로직 1' 로 인식하네요!

이외에도 앞의 리드코드(스타트코드)가 들어온 후 커스텀코드가 들어오고 그리고 데이터코드가 들어오는 순서가 됩니다. 아두이노로 만약 리모컨 신호를 받게된다면 위에서 입력되는 리드코드를 체크하고 있다가 리드코드가 들어온 후 버퍼에 커스텀코드와 데이터코드를 다 저장해서 비교하면 될 것 같네요~ 먼가 어려워 보이지만 우리의 아두이노가 멉니까 ㅠ 이미 이것들을 다 ~~~ 만들어 두었습니다. 누가? 전세계의 개발자들이 취미로! 그리고 그것들을 공개해 두었죠!

자 그럼 어떻게 가져다 쓰는지는 동영상 강좌로 보도록 하죠!

실습은 중반 부분 정도부터 시청하시면 될 것 같네요~~ :)


15-3. 펌웨어 코드

#include <IRremote.h>

int RECV_PIN = 11;
unsigned long remo = 0;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  pinMode(5, OUTPUT); // red
  pinMode(6, OUTPUT); // green
  pinMode(7, OUTPUT); // blue
  digitalWrite(5, LOW);
  digitalWrite(6, LOW);
  digitalWrite(7, LOW);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}

void loop() {
  if (irrecv.decode(&results)) {
    //Serial.println(results.value, HEX);
    remo = results.value;
    Serial.println(remo, HEX);

    if( remo == 0xFA9F387F ) {
      digitalWrite(5, HIGH); // red
      delay(1000);
      digitalWrite(5, LOW); // red
    }
    else if( remo == 0x52445FFB ) {
      digitalWrite(6, HIGH); // green
      delay(1000);
      digitalWrite(6, LOW); // green
    }
    else if( remo == 0x1280BF5B ) {
      digitalWrite(7, HIGH); // blue
      delay(1000);
      digitalWrite(7, LOW); // blue
    }
   
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}

ㅎㅎ 활용도가 높은 리모컨 센서 모듈인 만큼 확실하게 어떻게 사용하는지 알고 가시는게 좋을 것 같네요. 진행하다 모르시는 부분은 리플달아주시면 답변 드리겠습니다~~



ㅎㅎ 다음 시간에는 로터리 엔코더에 대해서 알아볼께요! >.<

댓글 쓰기

1 댓글

  1. 안녕하세요. 아두이노 해킹에 관해 관심이 많은 학생입니다. 동작과정과 리모컨 그리고 연결방식에 대해 궁금한 것이 있는데 메일로 여쭤도되나요??

    답글삭제