아두이노/무선 조명 스위치

#2 기획 및 검토 - 적외선 리모컨

songbum 2023. 5. 9. 10:14

 

방의 전등을 리모컨으로 켜거나 끄고 싶다.

 

 

전에 살던 신축 아파트에서 잘 사용했었는데, 이번에 이사온 오래된 아파트에는 없어서 좀 많이 아쉽다.  기존 스위치를 교체하는 방식의 제품들이 판매되고 있긴 한데, 교체과정에서 전선 연결을 바꿔야 하는 것이 좀 부담스러워 포기했었다.  12V 정도의 직류전기면 모를까, 220V 의 교류전기는 내가 손 대기에는 너무 아는게 없었기 때문이다. 

 

그러다가 최근 아두이노를 접하게 되면서, 기존 스위치를 건드리지 않고 기계적인 방법으로 해결이 가능할 거 같다는 생각이 들었다.  리모컨으로 제어되는 서보모터의 끝에 작은 해머를 달고, 이 해머로 전등 스위치를 누르게 하는 것이다.  교재에 나온 예제들중에서 다음의 두 가지를 응용해보기로 했다.

21장 적외선 리모콘 실습
24장 서보모터 실습

 

 

21장 적외선 리모콘 실습

 

교재 내용대로 아래와 같이 회로를 구성한 뒤, USB 케이블로 PC 와 연결했다. 

아두이노 IDE 에서 보드를 인식하는 것을 확인한 후, 프로그램 코딩을 시작한다.

 

교재의 소스를 보면 맨 윗줄에 다음과 같이 적외선 리모컨 제어 관련 라이브러리를 인클루드 하도록 돼 있다.

#include <IRremote.h>

하지만 컴파일하는 과정에서 IRremote.hpp 를 사용하라는 에러 메세지가 나왔다.

인터넷에서 검색해 홈페이지로 들어가보니, 이미 지원이 종료된 구버전(2.x)이었다.

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

 

GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive infrared signals with multiple

Infrared remote library for Arduino: send and receive infrared signals with multiple protocols - GitHub - Arduino-IRremote/Arduino-IRremote: Infrared remote library for Arduino: send and receive in...

github.com

 

대신 최신 4.x 버전을 사용하기로 한다.

라이브러리 설치도 아두이노 IDE 의 라이브러리 관리자 기능을 이용해 쉽게 할 수 있었다.

처음에는 윈도우즈10 의 보안 기능으로 인해 설치에 실패했지만, 아두이노 IDE 에 대해 보호된 폴더 액세스를 허용해 주고 나서 다시 설치하니 성공했다.

 

버전이 올라가면서 함수도 바뀌었으므로, github 의 설명을 보며 최신 버전(4.x)의 코드로 변경했다.

#include <IRremote.hpp>

int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);

void setup() { 
  Serial.begin(9600); 
  IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); 
}

void loop() {
  if (IrReceiver.decode()) {
    if (IrReceiver.decodedIRData.decodedRawData != 0) {
      Serial.print(IrReceiver.decodedIRData.protocol);       
      Serial.print(" : ");                               
      Serial.print(IrReceiver.decodedIRData.decodedRawData, HEX);       
      Serial.print(" : ");       
      Serial.print(IrReceiver.decodedIRData.decodedRawData, DEC);       
      Serial.print(" : ");       
      Serial.print(IrReceiver.decodedIRData.command, HEX);       
      Serial.print(" : ");       
      Serial.println(IrReceiver.decodedIRData.command, DEC);  
    }
    IrReceiver.resume();
  }
}

적외선 리모컨으로부터 데이터를 수신하면 IrReceiver.decodedIRData 에 데이터를 저장해 놓는데, 이 중에서 내가 필요한 것은 IrReceiver.decodedIRData.decodedRawData 값이다.  이걸로 리모컨의 어느 버튼이 눌렸는지를 알 수 있다. 

처음에는 IrReceiver.decodedIRData.command 를 사용하려고 했는데, 테스트 과정에서 항상 0만 수신되는 리모컨들이 간혹 있어서 사용하지 않기로 했다.

 

교재에 포함된 리모컨의 + 버튼과 -버튼을 누르면 다음과 같은 값이 들어오는 것을 확인할 수 있다.

 

이것으로 아두이노에서 리모컨 입력 값을 구분해서 인식할 수 있게 됐다.