본문 바로가기
아두이노

아두이노(arduino) / IR 무선 적외선리모컨

by clean_h 2021. 7. 26.
728x90

IR 무선 적외선 리모컨으로 자동차를 작동시켜본다.

 

그 전에 IR 무선 적외선리모컨의 작동 방법을 살펴보겠다. 

적외선 리모컨 신호는 2진 펄스로 구성됩니다. 무선 전송 중에 다른 적외선 신호로부터 보호하기 위해 일반적으로 특정 캐리어 주파수로 변조된 다음 적외선 다이오드를 통해 전송되고 수신부에서는 신호를 수신하여 복조과정을 통해 신호를 걸러내게 된다. 

아두이노 보드에서 리모컨의 적외선 신호를 수신받기 위해 1838 IR수신 센서를 사용하게 된다. 

 

아두이노에서 IR 무선 적외선리모컨을 사용하기 위해서는 필수적으로 라이브러리를 설치해야한다. 설치되지 않았다면 설치를 해야한다.


IRremote 라이브러리 설치하기

[툴] -> [라이브러리 관리...]를 선택하여 들어가면 라이브러리 매니저가 실행된다. 

라이브러리 매니저

라이브러리 매니저에서 'IRremote'를 검색하여 설치해준다.

#include <IRremote.h> // IR리모컨라이브러리

IRremote를 사용하기 위해 다음과 같이 헤더를 선언해주면 IR 무선 적외선리모컨을 사용할 수 있게 된다. 

 

리모컨 각 위치 코드표

적외선 리모컨의 코드표는 다음과 같다.

적외선 리모컨의 종류는 회사마다 다양하지만 코드표는 대부분 비슷한 것 같다.

다음과 같이 작성하고 리모컨을 테스트해보고 자신에게 원하는 컨트롤을 지정할 수 있다. 

 

리모컨 테스트

#include <IRremote.h>//IR리모컨라이브러리

int RECV_PIN = 11;//IR 수신센서 포트설정
IRrecv irrecv(RECV_PIN);
decode_results results;//구조체정의
int ledpin = 13; //LED IO핀(내부 LED 사용)
int on = 0;//플래그
unsigned long last = millis();

void setup()
{
  pinMode(ledpin, OUTPUT);////디지털IO핀을 출력으로 지정
  Serial.begin(9600);//시리얼포트 속도를 9600bps로 지정
  irrecv.enableIRIn(); // 리모컨 수신 시작
}

void loop()
{
  if (irrecv.decode(&results)) //IR리모컨 라이브러리 호출
  {
    if (millis() - last > 250) //수신신호 결정
    {
      on = !on;//수신신호 반전
      digitalWrite(ledpin, on ? HIGH : LOW);//리모컨 수신시 LED(13)로 표시
    }
    Serial.println(results.value, HEX); //리모컨 수신코드를 출력
    last = millis();      
    irrecv.resume(); // 다음 값을 수신
  }
}

다음 코드를 실행하여 리모컨이 잘 잘동하는지 확인한다.

아두이노에 다음 코드를 업로드 한 후 시리얼 모니터를 확인한다. 리모컨을 하나씩 눌러보면서 시리얼 모니터에 어떤 코드가 출력되는지 확인한다. 여기서 FFFFFFFF는 하나의 버튼을 오래 눌렀을때 반복되어 수신되는 코드이다.

 

 

자동차 조종하기

리모컨으로 자동차를 조종할 수 있다. 

// IR 무선 적외선리모컨 실험

#include <IRremote.h>//IR리모컨라이브러리
//바퀴
#define EN1 6 //오른쪽 전진
#define EN2 9 //왼쪽 전진
#define EN3 10 //오른쪽 후진
#define EN4 5 //왼쪽 후진

//리모컨
#define U 0xFF02FD //전진
#define D 0xFF9867 //후진
#define L 0xFFE01F //좌회전
#define R 0xFF906F//우회전
#define STOP 0xFFA857 //정지

int RECV_PIN = 11;//IR 수신센서 포트설정
IRrecv irrecv(RECV_PIN);
decode_results results;//구조체정의
int ledpin = 13; //LED IO핀(내부 LED 사용)
int on = 0;//플래그
unsigned long last = millis();

void setup()
{
  pinMode(ledpin, OUTPUT);////디지털IO핀을 출력으로 지정
  Serial.begin(9600);//시리얼포트 속도를 9600bps로 지정
  irrecv.enableIRIn(); // 리모컨 수신 시작
   pinMode(EN1, OUTPUT); //EN1
   pinMode(EN2, OUTPUT); //EN2
   pinMode(EN3, OUTPUT); //EN3
   pinMode(EN4, OUTPUT); //EN4
}

void loop()
{
  if (irrecv.decode(&results)) //IR리모컨 라이브러리 호출
  {
    if (millis() - last > 250) //수신신호 결정
    {
      on = !on;//수신신호 반전
      digitalWrite(ledpin, on ? HIGH : LOW);//리모컨 수신시 LED(13)로 표시
    }
    Serial.println(results.value, HEX); //리모컨 수신코드를 출력

    switch (results.value){
      case U:
        digitalWrite(EN1, HIGH); 
        digitalWrite(EN2, HIGH); 
        break;
      case D:
        digitalWrite(EN3, HIGH); 
        digitalWrite(EN4, HIGH); 
        break;
      case L:
        digitalWrite(EN1, HIGH); 
        digitalWrite(EN4, HIGH); 
        break;
      case R:
        digitalWrite(EN2, HIGH); 
        digitalWrite(EN3, HIGH); 
        break;
      case STOP:
        digitalWrite(EN1, LOW); 
        digitalWrite(EN2, LOW); 
        digitalWrite(EN3, LOW);
        digitalWrite(EN4, LOW); 
        break;
    }
    
    last = millis();      
    irrecv.resume(); // 다음 값을 수신
  }
}

여기서 EN1,2,3,4는 각자의 자동차에 맞게 설정해야한다. 

U, D, L, R를 리모컨에 맞게 코드를 입력해주었다. 

이때 U을 한 후 정지 하지 않고 다른 키를 작동하면 원하는대로 작동하지 않을 수 있다. 

일단 자동차의 움직임을 확인하고 싶어서 코드를 구현한 것이기 때문에 더 수월하게 움직이게 하기 위해서 더 정교하게 코드를 구현해야 한다. 그건 나중에 올리도록하자...

 

시연 영상

 

 

참고 - http://scipia.co.kr/blog/224

728x90

댓글