정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 IR 리모콘 관련
김승종 | 2016-01-22

안녕하세요...

이제 아두이노 오랜지보드 블루를 사서 처음 접해 보는 사람입니다.

5버튼짜리 IR 리모콘을 이용하여 아래와 같은 기능을 구현 하려 하는데 잘 되지 않아 도움을 요청드립니다.

(리시버 프로그램을 통하여 ir리모콘의 데이터는 알아놨어요)

1.  리모콘 1번키 (case 0x002FD58A7: // Key 0 ) 누르는 동안 아두이노 2번핀 hi

2. 리모콘 2번키 ( case 0x002FD9867: // Key 1 ) 누르는 동안 아두이노 3번핀 hi

3. 리모콘 3번키 ( case 0x002FD18E7: // Key 2 ) 누루는 동안 아두이노 4번핀 hi

4. 리모콘 4번키 ( case 0x002FD807F: // Key 3 ) 누르는 동안 아두이노 5번핀 hi

5. 리모콘 5번키 (  case 0x002FD00FF: // Key 4 ) 한번 누르면 아두이노 6번 hi

6. 리모콘 5번키 ( case 0x002FD00FF: // Key 4 ) 한번 누르면 아두이노 6번 low

7. 리모콘 5번키 ( case 0x002FD00FF: // Key 4  ) 가 hi가 되고 10초동안 5번키가 안들어오면 자동으로 off

* ir sensor는 7번핀에 입력 해놓은 상태입니다.

펌웨어 를처음 접해보는 터라... 인터넷에서 찾아서 이것 저것 해보다, 빠른 시간내에 만들어내야 해서 이렇게 도움 요청드립니다.

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

#include <IRremote.h>

 

int RECV_PIN = 7; // RECV_PIN핀을 7번으로 설정
//=====================================================
int led1 = 2; //led1을 2번핀으로 설정
int led2 = 3; //led2을 3번핀으로 설정
int led3 = 4; //led3을 4번핀으로 설정
int led4 = 5; //led4을 5번핀으로 설정
int led5 = 6; //led5을 6번핀으로 설정
 //==========================================================

IRrecv irrecv(RECV_PIN);

 

decode_results results;

 

void setup()

{

    Serial.begin(9600);

    irrecv.enableIRIn();

}
//=======================================================================
{
  pinMode(led1,OUTPUT); //LED1핀을 OUTPUT으로 설정
   pinMode(led2,OUTPUT); //LED2핀을 OUTPUT으로 설정
    pinMode(led3,OUTPUT); //LED3핀을 OUTPUT으로 설정
     pinMode(led4,OUTPUT); //LED4핀을 OUTPUT으로 설정
      pinMode(led5,OUTPUT); //LED5핀을 OUTPUT으로 설정

pinMode(RECV_PIN,INPUT); // RECV_PIN(7번핀)을 input으로 설정

     
}
//=========================================================================
void loop()
{
    if(digitalRead(RECV_PIN) == 0x002FD58A7)
       digitalWrite(led1,HIGH) ; //RECV_PIN 이 0x002FD58A7 일경우 led1은 higt
      
    if(digitalRead(RECV_PIN) == 0x002FD9867)
       digitalWrite(led1,HIGH) ; //RECV_PIN 이 0x002FD58A7 일경우 led2은 higt
      
    if(digitalRead(RECV_PIN) == 0x002FD18E7)
       digitalWrite(led1,HIGH) ; //RECV_PIN 이 0x002FD58A7 일경우 led3은 higt
      
    if(digitalRead(RECV_PIN) ==  0x002FD807F)
       digitalWrite(led1,HIGH) ; //RECV_PIN 이 0x002FD58A7 일경우 led4은 higt

       if(digitalRead(RECV_PIN) == 0x002FD00FF)
       digitalWrite(led1,HIGH) ; //RECV_PIN 이 0x002FD58A7 일경우 led5은 higt
}
  else  {
    digitalWrite(led1,low) //이외의 경우 led1을 꺼라.
    digitalWrite(led2,low) //이외의 경우 led2을 꺼라.
    digitalWrite(led3,low) //이외의 경우 led3을 꺼라.
    digitalWrite(led4,low) //이외의 경우 led4을 꺼라.
    digitalWrite(led5,low) //이외의 경우 led5을 꺼라.
  }
//===========================================================================
void loop()

{

    if(irrecv.decode(&results)){

        if(results.decode_type == NEC){

          switch(results.value){

            case 0x002FD58A7: // Key 0

                Serial.println("Press '0'");

                break;

            case 0x002FD9867: // Key 1

                Serial.println("Press '1'");

                break;

            case 0x002FD18E7: // Key 2

                Serial.println("Press '2'");

                break;

            case 0x002FD807F: // Key 3

                Serial.println("Press '3'");

                break;

            case 0x002FD00FF: // Key 4

                Serial.println("Press '4'");

                break;

                  default:

                break;

          }           
        }
        irrecv.resume();
    }
}

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

할수있는데 까지는 작성해 봤는데요;;;;

돌아가지 않아요;;;

프로필사진

수박쨈 2016-01-22 15:34:16

리모콘 1번키를 누르면 아두이노 2번핀이 HIGH가 되고

리모콘 2번키를 누르면 아두이노 3번핀이 HIGH가 되고 이런식의 코드를 만드시는 건가요?

 

간단하게 구현해보면 아래와 같은 방법으로 구현하시면 될 듯 합니다.

전부다는 작성안헀고 3번까지만 일단 작성했는데 방법은 똑같으니 else if문만 계속적으로 추가해주시면 될 듯 합니다.

(적외선 수신부가 7번에 꽂혀있다고 가정하고 작성했습니다. 적외선 수신부 데이터 부분은 아래 방법이 아니면 수정해 주시면 될 듯 합니다)

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

void loop() {
  long a = analogRead(7);
  if(a == 0x002FD58A7) {
    digitalWrite(2,HIGH);   //1번키가 눌리면 2번핀에 HIGH신호 전달
  }
  else if(a == 0x002FD9867) {
    digitalWrite(3,HIGH);   //2번키가 눌리면 3번핀에 HIGH신호 전달
  }
  else if(a == 0x002FD18E7) {
    digitalWrite(4,HIGH);   //3번키가 눌리면 4번핀에 HIGH신호 전달
}

 

근데 7번은 디지털핀인데 7번에 연결해도 저런 숫자데이터가 오는건가요?? 

프로필사진

수박쨈 2016-01-22 15:44:11

글 쓰는 동안 글 내용이 수정되었네요ㅎㅎ;;

 

위 코드를 보시면 loop()문이 2개가 있습니다.

아두이노는 하나의 코드에 하나의 setup()과 하나의 loop()만 실행됩니다. loop()문을 두개 사용하면 에러가 납니다.

 

그리고 코드를 보니 IRremote라는 라이브러리를 사용하는데 혹시 라이브러리를 가지고 있으신지도 모르겠네요.

없으시다면 라이브러리를 받아서 아두이노 설치한 폴더에 있는 libraries폴더에 압축을 해제하고 넣어 주셔야 합니다.

https://github.com/shirriff/Arduino-IRremote

위 링크에서 받으시면 될 듯 합니다.

 

위에 작성하신 loop문을 다 지우고 아래 소스를 사용하면서 각 해당하는 데이터에 digitalWrite으로 원하는 핀에 HIGH신호를 주면 될거 같네요.

void loop()

{

    if(irrecv.decode(&results)){

        if(results.decode_type == NEC){

          switch(results.value){

            case 0x002FD58A7: // Key 0

                Serial.println("Press '0'");

                 digitalWrite(2,HIGH); 

                break;

            case 0x002FD9867: // Key 1

                Serial.println("Press '1'");

                 digitalWrite(3,HIGH);

                break;

            case 0x002FD18E7: // Key 2

                Serial.println("Press '2'");

                digitalWrite(4,HIGH); 

                break;

            case 0x002FD807F: // Key 3

                digitalWrite(5,HIGH);

                Serial.println("Press '3'");

                break;

            case 0x002FD00FF: // Key 4

                digitalWrite(6,HIGH);

                Serial.println("Press '4'");

                break;

                  default:

                break;

          }           
        }
        irrecv.resume();
    }
}

프로필사진

김승종 2016-01-22 17:04:00

댓글 감사합니다.

근데 켜지기만 하고....꺼지질 않는데

프로그램을 보면 누루고 있는 동안만 led가 켜져있어야 하는거 아닌가요?

프로필사진

수박쨈 2016-01-22 17:17:23

만약에 누르지 않을 때 LED가 꺼지게 하고 싶다면

코드 마지막에 default:라는 코드를 볼 수 있습니다.

 

default:와 break;사이에 LED를 끄는 코드를 삽입하면 될거 같습니다.

 

default:는 위에 존재하는 case가 한번씩 내려오면서 해당하는 case가 없을 때 마지막으로 실행하는 블록입니다.

리모콘을 누르지 않았다면 데이터가 전송되지 않기 때문에 존재하는 case문은 모두 건너뛰고 마지막의 default:가 실행되겠죠

 

예) 

default:

  digitalWrite(2,LOW);

  digitalWrite(3,LOW);

  break;

프로필사진

수박쨈 2016-01-22 17:18:37

만약 위 방법으로도 안된다면

if(irrecv.decode(&results)){ } 이 조건과 이어지는 else문을 만들어서 LED를 끄면 될거 같습니다.

프로필사진

김승종 2016-01-22 17:24:24

아.... 저렇게하면 한번만 켜지고 꺼지는거 아닌가요?

누루고 있는동안 켜지게 하고 싶은데;;;

 

프로필사진

수박쨈 2016-01-26 10:11:31

누르고 있는 동안 켜지지않나요??

 

제가 의도했던 바도 누르고 있는 동안 켜지게 하는것이였습니다~~

프로필사진

김승종 2016-02-01 20:00:25

아니요 누르고 있는동안 켜지지 않습니다. ㅜㅜ

한번 누르면 켜지기만 하네요;;

펌웨어 자체를 이제 시작하는단계라 언어책을 보면서 하고는 있는데;;;

당췌 제가 원하는대로는 움직여 지지 않네요;;;

프로필사진

김승종 2016-02-01 20:19:32

아래 업로드 되어있는 프로그램 인데요

이대로라면 한번 켜지고 안꺼지는게 맞는거 아닌가요?

 

#include <IRremote.h>
int RECV_PIN = 7; // RECV_PIN핀을 7번으로 설정

int led1 = 2; //led1을 2번핀으로 설정
int led2 = 3; //led2을 3번핀으로 설정
int led3 = 4; //led3을 4번핀으로 설정
int led4 = 5; //led4을 5번핀으로 설정
int led5 = 6; //led5을 6번핀으로 설정

IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
Serial.begin(9600);
irrecv.enableIRIn();

pinMode(led1,OUTPUT); //LED1핀을 OUTPUT으로 설정
pinMode(led2,OUTPUT); //LED2핀을 OUTPUT으로 설정
pinMode(led3,OUTPUT); //LED3핀을 OUTPUT으로 설정
pinMode(led4,OUTPUT); //LED4핀을 OUTPUT으로 설정
pinMode(led5,OUTPUT); //LED5핀을 OUTPUT으로 설정
pinMode(RECV_PIN,INPUT); // RECV_PIN(7번핀)을 input으로 설정
}
void loop()
{
if(irrecv.decode(&results)){
if(results.decode_type == NEC){
switch(results.value){
 
case 0x002FD58A7: // Key 0
Serial.println("Press '1'");
digitalWrite(2,HIGH);
break;

case 0x002FD9867: // Key 1
Serial.println("Press '2'");
digitalWrite(3,HIGH);
break;

case 0x002FD18E7: // Key 2
Serial.println("Press '3'");
digitalWrite(4,HIGH);
break;

case 0x002FD807F: // Key 3
Serial.println("Press '4'");
digitalWrite(5,HIGH);
break;

case 0x002FD00FF: // Key 4
Serial.println("Press '5'");
digitalWrite(6,HIGH);
break;

default:
break;

}
irrecv.resume();
}
}

 

프로필사진

kocoafabeditor 2016-02-16 13:52:47

case 0xFFFFFFFFF:

break;

프로필사진

kocoafabeditor 2016-02-16 14:13:34

#include <IRremote.h>
int RECV_PIN = 7; // RECV_PIN핀을 7번으로 설정
int led1 = 2; //led1을 2번핀으로 설정
int led2 = 3; //led2을 3번핀으로 설정
int led3 = 4; //led3을 4번핀으로 설정
int led4 = 5; //led4을 5번핀으로 설정
int led5 = 6; //led5을 6번핀으로 설정
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(led1,OUTPUT); //LED1핀을 OUTPUT으로 설정
  pinMode(led2,OUTPUT); //LED2핀을 OUTPUT으로 설정
  pinMode(led3,OUTPUT); //LED3핀을 OUTPUT으로 설정
  pinMode(led4,OUTPUT); //LED4핀을 OUTPUT으로 설정
  pinMode(led5,OUTPUT); //LED5핀을 OUTPUT으로 설정
  pinMode(RECV_PIN,INPUT); // RECV_PIN(7번핀)을 input으로 설정
}
void loop()
{
  if(irrecv.decode(&results)){
    if(results.decode_type == NEC){
      switch(results.value){

      case 0x002FD58A7: // Key 0
        Serial.println("Press '1'");
        digitalWrite(2,HIGH);
        break;
      case 0x002FD9867: // Key 1
        Serial.println("Press '2'");
        digitalWrite(3,HIGH);
        break;
      case 0x002FD18E7: // Key 2
        Serial.println("Press '3'");
        digitalWrite(4,HIGH);
        break;
      case 0x002FD807F: // Key 3
        Serial.println("Press '4'");
        digitalWrite(5,HIGH);
        break;
      case 0x002FD00FF: // Key 4
        Serial.println("Press '5'");
        digitalWrite(6,HIGH);
        break;
      case 0xFFFFFFFFF:
        break;
      default:
        for(int i = 2; i < 7 ; i++){
          digitalWrite(i, LOW);
        }
        break;
      } 
    }
    irrecv.resume();
  }


}

 

이전글   |    오렌지보드 BLE 신호 세기 2016-01-20
다음글   |    아두이노 초음파 센서를 이용하여 2016-01-22