아두이노

오늘도 기분좋은날! 그래서 포스팅 하나 IR(InfraRed)리모트 컨트롤 하기

ILETCTM 2014. 4. 22. 18:08
반응형

인적성을 통과를 하여서 기분이 좋아서 글 하나만 쓰고 다시...

지금 삼성은 SDS로 사트를 쳤는데 발표가 연기되어서.. 아두이노 공부를 더 할 수 있는 시간이 생김..

글을 쓴는게 쉬운것이아니라서.. 공부 한 것을 다 쓰는게 쉽지 않아서 쉬운것부터 차근차근 써 내려가려고 함.


IR이란?

IR은 Infra Red의 약자... 원적외선으로써 우리가 흔히 사용하는 리모컨에서 사용이 되는 빛의 파장이다.

리모컨 누를때 눈으로 보면 빛이 안보이지만 카메라를 통


해서 보면 보인다. 


아두이노 스타터킷을 사면 리모컨이랑 IR입력을 받는 소자가 딸려오는데 리모컨은 뭐.. 다 어떻게 생긴지 아실 것이고

IR소자는 이렇게 생김!


금요일 시험인 공학수학2... 2학년때들어야 하는데 마지막 3학점으로 이걸 듣고 있다..

여튼 저렇게 생긴 IR소자는

데이타 시트를 참고하면..



쩰 왼쪽이 아두이노에 연결, 중간은 그라운드 오른쪽은 5v에 연결함을 알 수 있다.


우선 연결하고 난 후.

원론적으로 공부하는것은 너무 힘들어서... 라이브러리를 쓰기로 한다.

이것은 IR의 예제를 불러와서 내 리모컨에 맞게 조정을 한것.



/*-----( Import needed libraries )-----*/


#include "IRremote.h" // IR라이브러리를 불러온다.


/*-----( Declare Constants )-----*/

int receiver = 11; //IR리시버를 연결 할 핀을 선택


/*-----( Declare objects )-----*/

IRrecv irrecv(receiver);           // create instance of 'irrecv'

decode_results results;            // create instance of 'decode_results'

/*-----( Declare Variables )-----*/



void setup()   /*----( SETUP: RUNS ONCE )----*/

{

  Serial.begin(9600);

  Serial.println("YourDuino IR Receiver Button Decode Test");

  Serial.println("Questions: terry@yourduino.com");  

  irrecv.enableIRIn(); // Start the receiver


}/*--(end setup )---*/


void loop()   /*----( LOOP: RUNS CONSTANTLY )----*/

{

  if (irrecv.decode(&results)) // 리모컨으로부터 신호를 받았는지 확인


  {

//    Serial.println(results.value, HEX);  키에 해당하는 16진수를 출력

    translateIR(); // IR코드를 받은 것을 토대로 작동하는 함수

    irrecv.resume(); // 다음 값 받기

  }  

}/* --(end main loop )-- */


/*-----( Declare User-written Functions )-----*/

void translateIR() // takes action based on IR code received


// describing KEYES Remote IR codes 


{


  switch(results.value)


  {


  case 0xFFA25D: Serial.println(" Power"); break;

  case 0xFF629D: Serial.println(" Mode"); break;

  case 0xFFE21D: Serial.println(" Mute"); break;

  case 0xFF22DD: Serial.println(" Pase");    break;

  case 0xFF02FD: Serial.println(" Previous");    break;

  case 0xFFC23D: Serial.println(" Next");   break;

  case 0xFFE01F: Serial.println(" EQ"); break;

  case 0xFFA857: Serial.println(" -"); break;

  case 0xFF906F: Serial.println(" ="); break;

  case 0xFF6897: Serial.println(" 0");    break;

  case 0xFF9867: Serial.println(" Repeat");    break;

  case 0xFFB04F: Serial.println(" U/SD");    break;

  case 0xFF30CF: Serial.println(" 1");    break;

  case 0xFF18E7: Serial.println(" 2");    break;

  case 0xFF7A85: Serial.println(" 3");    break;

  case 0xFF10EF: Serial.println(" 4");    break;

  case 0xFF38C7: Serial.println(" 5");    break;

  case 0xFF5AA5: Serial.println(" 6");    break;

  case 0xFF42BD: Serial.println(" 7");    break;

  case 0xFF4AB5: Serial.println(" 8");    break;

  case 0xFF52AD: Serial.println(" 9");    break;

  case 0xFFFFFFFF: Serial.println(" REPEAT");break;  


  default: 

    Serial.println(" other button   ");


  }// End Case


  delay(500); // Do not get immediate repeat



} //END translateIR


이제 대충 봐도 뭔말인지는 알겠는데...

이거 함수의 역할이 쬐끔 궁금하다..

우선 마지막 쪽에있는 case구문에서 리모컨 버튼에 맞는 코드를 일일이 할당만 하면 누른 버튼을 출력하는건 쉽게 된다.

저걸 다른곳에 응용할때는

만약 

1 2 3

4 5 6

7 8 9


에서 4,2,6을 서보 모터의 방향조절에 사용한다고 할 경우

 switch(results.value)


  {  case 0xFF10EF: myServo.write(0);   Serial.println("Position at 0 degree");  break;

  case 0xFF18E7: myServo.write(90);    Serial.println("Position at 90 degree") break;

 case 0xFF5AA5: myServo.write(180);   Serial.println("Position at 180 degree") break;

}


이렇게 하면 4,2,6 버튼에 따라 0도 90도 180도의 각으로 맞춰질 것을 예상할 수 있다.

근데 이건 그냥 내 생각이고 될지 안될지는 모르겠음.. 

우선 시간나면 해 보고

기본적인 IR소자 연결과 예제의 수정을 알아봤고.. 

다음포스팅은 IR라이브러리의 작동원리를 좀 알아봐야겠다.. 근데 언제다시쓸지는 모름...면접준비해야되어서! ㅋㅋ ㅜ

반응형