brunch

You can make anything
by writing

C.S.Lewis

by Cylogic Oct 13. 2020

44.열번째 장난감:춤추는 피에로(irRemote)#1

적외선 리모컨(irRemote)과 네오픽셀 활용

적외선 리모컨(irRemote) 사용법

우리는 이미 블루투스를 이용한 무선 통신을 경험했지만, 무선조종을 손쉽게 할 수 있는 다양한 방법이 있다. 

가장 손쉽게 접할 수 있는 것이 TV 리모컨처럼 독립된 도구로 기기를 조종할 수 있는 적외선 리모컨이다. 근거리에서 정확하게 방향을 맞추어야 동작하는 단점이 있지만 저렴하고 단순하게 무선 조종이 가능하다는 이점 때문에 많이 사용되고 있다. 


적외선 리모컨 송신기에서 발생되는 신호를 수신기에서 받아 그 값을 분석하여 원하는 동작을 하게 하는 기능을 가지고 있다.

송신기와 수신기는 아래의 사진과 같고, 많은 아두이노 키트에 탑재되어 있다.

없다면 인터넷 쇼핑몰을 통하여 5~6000원 정도에 송수신기를 세트로 구매할 수 있다. 송신기의 배터리는 CR2025 단추형 배터리가 들어간다.

좌측의 리모컨 형태의 장비가 송신기이고 금속 틀 안에 X형태의 모자를 쓴 것과 같은 부품이 수신기이다.


수신기는 3개의 핀을 가지고 있고 각각의 기능은 사진과 같다.


리모컨의 각 버튼은 고유의 신호를 가지고 있고, 이 신호에 따라 어떤 동작을 할 것인지는 프로그램을 하는 사람이 직접 선택할 수 있다. 그러니까 1이라고 하는 버튼을 눌렀다고 해서 1이라는 신호가 오는 게 아니라 정의된 고유의 신호가 오는 것이고 이를 가지고 어떤 동작을 정의할지는 마음대로 해도 된다는 것이다.


우리가 만들려고 하는 장난감은 춤추는 피에로이다. 

특정 번호를 누르면 피에로가 팔다리를 번쩍 들고, 번호마다 원형 네오픽셀에서  특별한 빛을 발하도록 하는 장난감이다.

영상을 보면 어떤 동작을 하는지 쉽게 알 수 있을 것이다.


위에 달린 피에로 인형은 아이들 완구 파는 곳에 가면 쉽게 구할 수 있는 인형으로 아래의 빨간 노끈을 잡아당기면 팔다리를 번쩍 든다. 이를 구현하기 위하여 빨간 노끈을 서보모터에 연결하였다.


다양한 빛을 보이기 위하여 네오픽셀을 연결했고, 네오픽셀이 매달린 박스는 아이들 완구 제작용으로 나온 아이스크림 바이다. 글루건을 이용하여 다른 나무 조각에 붙여서 박스를 만들었다.

 

영상 속 장난감의 회로는 아래와 같다. 오른쪽에 그린 리모컨은 여러분이 구매한 것과 모양이 다를 수 있으니 그냥 참조만 하시라.

주요한 연결을 확인하자면


1. 서보모터 : 4 번핀

2. 네오픽셀 : 6번 핀

3. IR수신기 : 11번 핀

과 같이 연결되어 있고 각 부품의 VCC는 5V, GND는 GND에 연결하면 된다.


일단 네오픽셀 부분은 두고 '0'번 버튼을 누르면 피에로가 팔다리를 번쩍 들었나 내리는 장면을 만들어 보자.

적외선 리모컨을 사용하려면 아래의 라이브러리를 설치해야 한다. 툴-라이브러리 관리에서 irremote를 검색하여 설치하자.

setup 함수의 내용은 간단하다.


앞서 설치한 라이브러리를 #include <IRremote.h>와 같이 포함하여 코딩을 준비한다.

나머지 부분들은 일반적인 내용이고 9번 줄의 내용이 리모컨 수신 내용을 처리하는 함수 선언이다.

19번 줄에서 적외선 리모컨의 수신 준비를 마무리한다.

11번의 decode_results results는 수신된 신호를 디코드 하여 해석하기 위한 변수이다.


이제 loop 함수를 알아봐야 하는데 그전에 

9번 줄의 decode_results results 변수에 대해 알아보자. 이 변수는 loop함수에서 

irrecv.decode(&result) 와 같이 사용되는데, 이 내용은 IRremote.h에 아래와 같이 정의되어 있는데,


 class decode_results {

   public:

       decode_type_t decode_type;  

       unsigned int address;       

       unsigned long value;        

       int bits;                   

       volatile unsigned int *rawbuf;      

       unsigned int rawlen;        

       int overflow;               

   };


수신기로부터 받은 신호를 숫자로 표시하는 값을 value에 넣어주는 클래스이다.

클래스니 뭐니 하는 내용은 지금은 기억하지 않아도 된다. 단지 해당 변수의 value값만 신경 쓰면 된다.

irrecv.decode(&result)와 같이 사용할 경우 result.value에 리모컨에서 나온 신호의 값이 저장된다.

이를 이용하여 어떤 버튼이 눌렸는지를 확인하면 된다.


void loop() {

  if (irrecv.decode(&results)) {

    value = results.value;

    switch(value){      

        case 0xFF6897: // 0

          servo.write(90);

          delay(1000);

          servo.write(0);

          break;

        case 0xFF30CF: // 1

          break;

        case 0xFF18E7: // 2

          break;

        case 0xFF7A85: // 3

          break;

        case 0xFF10EF: // 4

          break;

        case 0xFF38C7: // 5

          break;

        case 0xFF5AA5: // 6

          break;

        case 0xFF42BD: // 7

          break;

        case 0xFF4AB5: // 8

          break;

        case 0xFF52AD: // 9

          break; 

   

    Serial.println(value, HEX);

    irrecv.resume(); // Receive the next value

    delay(200); 

}

일단 0부터 9까지의 번호가 눌렸을 때 어떤 신호가 들어오는 지를 알려주는 코드이다.

위의 빨간색 코드가 0이 눌렸을 때 한번 서보모터가 움직였다가 제 자리로 돌아가는 것을 명령하는 코드이다.

만일 1이 눌렸을 때 어떤 일이 발생하기를 원한다면 1에 해당하는 자리에 같은 코드를 아래와 같이 넣어주면 될 것이다.

      case 0xFF30CF: // 1

          servo.write(90);

          delay(1000);

          servo.write(0);

       break;


일단 현재까지의 코드로 0번이 눌렸을 때 피에로가 한번 춤을 추는 것까지의 코드는 마무리되었다.

이곳에 어떻게 더욱 다양한 기능(네오픽셀 작동과 같은)을 넣을 수 있는 지를 다음 회에 마무리하도록 하자.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari