나는 괴짜다!

내가 만든 리모컨으로
텔레비전 채널을 돌려보자!

글. 산업공학과 1 송지민 편집. 조선해양공학과 4 백지원

※ 본 기사는 Arduino IDE 2.3.0 버전, IRremote 라이브러리 4.2.1 버전을 기준으로 작성되었습니다.

오랜만에 여유를 즐기던 휴일 오후, 즐겨 보던 예능 프로그램을 마저 보려고 TV 앞에 앉았는데... 아뿔싸! TV 리모컨이 어디 간 건지 보이지를 않네요. 이럴 때면 정말 난감하죠. 그런데 만약 내가 만든 여분의 리모컨이 있다면 이런 곤란한 상황을 피할 수 있지 않을까요?

이런 불편함을 간단하게 해결할 수 있는 것이 바로 '아두이노'입니다. 아두이노를 활용하면 간단한 기계 부품을 조립하고, 전자회로를 구성하고, 동작 과정을 제어하는 코드를 입력해서 원하는 대로 동작하는 기계 장치를 만들 수 있지요. 복잡한 전자기학 지식이 없어도 간단하게 리모컨을 만드는 방법이라니, 궁금하지 않은가요? 오늘은 공대상상 부원이 직접 아두이노로 리모컨을 만드는 과정을 소개합니다!

1. 아두이노란 무엇일까?

리모컨을 본격적으로 만들기에 앞서서 아두이노에 관한 기본적인 지식을 알아봅시다.

그림1 아두이노

아두이노란 오픈 소스1) 기반의 단일 마이크로 컨트롤러2)의 한 종류로, 발광 다이오드, 모터, 센서 등 부품(하드웨어)을 프로그램(소프트웨어)으로 제어하며 여러 가지 일을 수행하는 초소형 컴퓨터입니다. 아두이노는, 아두이노 보드에 여러 부품이 연결되어 이루어진 하드웨어와 전용 코딩 프로그램인 아두이노 IDE로 구성되어 있어서, 아두이노 키트만 있다면 여러분이 원하는 기계를 얼마든지 쉽게 만들어낼 수 있습니다.

아두이노의 장점 중 하나는 오픈 소스 기반이라는 것으로, 아두이노 소프트웨어와 하드웨어를 우리 입맛에 맞게 수정할 수 있다는 것입니다. 또한, 누구나 자신만의 코드를 만들고 공유할 수 있어서 온라인에서 많은 정보를 얻을 수 있습니다.

그리고 아두이노의 하드웨어를 이루는 핵심 부품 중 '아두이노 보드'가 있는데요. 이 보드에는 작은 컴퓨터인 '마이크로' 컨트롤러가 장착되어 있어서 아두이노의 두뇌와 같은 역할을 합니다. 우리는 사용하기 쉽게 설계된 아두이노 보드를 통해 마이크로 컨트롤러를 간편하게 다룰 수 있답니다.

2. 리모컨은 어떤 원리로 작동할까?

우선 리모컨의 원리를 알아봅시다. 리모컨은 간단하게 말해서 원격으로 신호를 송수신하는 장치를 말합니다. 그중에서도 텔레비전, 선풍기, 로봇 청소기 등과 같은 가전제품을 제어하는 리모컨은 일반적으로 적외선 신호를 이용합니다.

그림2 적외선 신호를 이용하는 리모컨

적외선은 가시광선이나 자외선보다 열 작용과 침투력, 유기화합물에 대한 공진 공명 작용이 강하다는 성질 때문에 여러 산업, 의료 분야와 각종 전자제품에 널리 활용됩니다. 리모컨 역시 비교적 저렴하고 안정적이며, 직진성이 강하다는 등의 이유로 적외선 신호를 사용합니다. 또한, 적외선 신호는 벽이나 거울에 반사되기 때문에 리모컨을 전자기기 쪽으로 바로 향하지 않아도 전자기기를 제어할 수 있습니다. 그러나 비슷한 파장대를 가진 강한 빛이 있는 실외에서나 장애물이 있을 때는 신호가 제대로 전달되지 않는 단점이 있습니다.

리모컨의 버튼을 누르면 적외선 발광 다이오드(LED)를 통해 특정 버튼이 눌렸다는 것을 알리는 적외선 신호가 인코딩(Encoding)을 거쳐서 전자기기로 전달이 됩니다. 이후 전자기기의 포토다이오드가 이 신호를 감지하면, 이 신호는 디코딩(Decoding)을 거쳐서 전기신호로 바뀌고, 그 버튼에 해당하는 명령을 수행하도록 전자기기를 제어합니다.

그림3 리모컨의 encoding과 decoding

3. 아두이노로 리모컨을 만들자!

이제 아두이노를 이용하여 리모컨을 만들어 볼 건데요, 필요한 부품은 다음과 같습니다. 왼쪽부터 아두이노 우노(UNO) 보드, 브레드 보드3), 적외선 수신 모듈, 적외선 송신 모듈, 복제하고자 하는 리모컨, 데이터 케이블, 점퍼 와이어(M-M)입니다.

그림4 필요한 부품

여기서 가장 핵심 부품인 아두이노 보드에 관해 자세히 알아봅시다. 아두이노 보드의 입출력은 '핀(PIN)'을 통해 이루어집니다. 일반적인 USB 포트와 비슷한 개념이지요. 그중에서도 필수적인 역할을 담당하는 핀이 있는데요. 먼저 3.3V 핀과 5V 핀은 전원을 공급하는 역할을 하고, 접지를 의미하는 영어 단어 'Ground'에서 명칭이 비롯된 GND핀은 회로를 접지하는 역할을 합니다. 그리고 다양한 아두이노 보드 중에서 가장 흔히 사용되는 아두이노 우노(UNO) 보드에는 아날로그 센서에서 읽은 신호를 디지털 값으로 바꿔주는 5개의 아날로그 입력 핀과 디지털 신호의 입출력을 담당하는 14개의 디지털 핀이 있습니다.

그리고 적외선 신호를 감지하는 적외선 수신 모듈과 적외선 신호를 내보내는 적외선 송신 모듈이 있습니다. 이 2개의 모듈은 각각 GND, VCC, DATA핀을 가지고 있습니다. GND핀 및 VCC핀은 컴퓨터에서 아두이노 보드로 전원을 공급하여 모듈을 작동시키고, DATA핀은 적외선 신호 데이터를 입출력합니다.

1텔레비전의 적외선 신호 알아내기

리모컨을 만들기 위해서는 우리가 만들고자 하는 텔레비전 리모컨의 특정 버튼이 어떠한 신호를 텔레비전으로 보내는지 먼저 알아내야 합니다. 쉽게 말해 텔레비전과 리모컨 사이에 어떤 '약속'이 존재하는지 알아내야 한다는 거지요. 텔레비전에서 '채널 증가', '음량 감소'와 같은 명령어를 입력하려면 어떤 적외선 신호가 필요할까요?

이를 알아내기 위해 다음 사진과 같이 브레드 보드에 적외선 수신 모듈을 연결한 후, 전선을 이용하여 브레드 보드와 아두이노 보드를 연결했습니다. 이때 적외선 수신 모듈의 VCC핀을 아두이노 보드의 5V 핀에, 모듈의 GND핀을 보드의 GND핀에, 모듈의 DATA핀을 보드의 2번 핀에 연결해야 합니다.

그림5 적외선 신호를 수신하는 아두이노

다음으로 이 장치를 작동시키는 코드에 대해 알아봅시다. 아두이노 IDE 프로그램을 컴퓨터에 설치하고, 적외선 송수신 모듈을 사용하기 위해 IRremote 라이브러리4)를 추가했습니다. 그리고 리모컨의 적외선 신호를 디코딩하는 코드인 IRremote 라이브러리의 SimpleReciever 예제를 열었습니다. 이와 같이 다른 사람들이 작성한 코드를 가져와 사용할 수 있다는 점이 아두이노의 또 다른 매력입니다.

그리고 데이터 케이블을 이용하여 아두이노 보드를 컴퓨터와 연결했습니다. 아두이노 보드에 코드를 업로드하기 전에 기본적인 세팅을 해야 하는데요. 아두이노 IDE 창에서 아두이노 보드 이름을 'Arduino Uno'로, 포트를 아두이노 보드가 연결된 곳으로 정확히 설정해야 합니다. 또한, 데이터를 원활하게 송수신하기 위해 시리얼 모니터 우측 상단에 있는 'Baud' 값과 코드의 'Serial.begin()' 함수 안에 지정된 속도를 일치시켜야 한다는 점 유의해 주세요!

그림6 아두이노 보드와 포트 설정 예시

모든 준비를 마치고 업로드 버튼을 눌러 아두이노 보드에 코드를 업로드했습니다! 적외선 신호를 확인하기 위해 시리얼 모니터5)를 열어보았더니, 복제하고자 하는 리모컨의 버튼을 하나씩 눌러주면 시리얼 모니터에 어떤 문장이 2줄씩 나타납니다.

이 문장들은 이 리모컨이 사용하는 데이터 전송 방식과 해당 버튼에 대한 정보입니다. 그림7의 첫째 2줄을 예시로 간단하게 설명하자면, 'Protocol=NEC'는 리모컨이 NEC라는 데이터 전송 방식을 사용한다는 것을 의미하고, 'Raw-Data=0xE619BF40'는 버튼에 해당하는 16진수 값이 'E619BF40'라는 것을 의미합니다.6) 그러니까 지금까지 텔레비전은 이러한 16진수 값을 입력받아 그에 해당하는 명령을 실행했던 거예요.

또한, 'Address=0x40'는 장치를 식별하는 데 사용되는 값이고, 'Command=0x19'는 해당 버튼의 기능을 나타내는 명령 값입니다. 마지막으로, 'Send with: IrSender.sendNEC(0x40, 0x19, );' 는 적외선 신호를 송출하는 데 사용되는 코드의 일부분으로, 두 번째 단계에서 사용하기 위해 기억해 두어야 합니다!

그림7 시리얼 모니터

2복제한 리모컨으로 적외선 신호 송신하기

드디어 마지막 단계입니다. 다음 사진과 같이 복제 리모컨을 만들어 주었습니다. 앞서 만들었던 적외선 신호를 수신하는 장치와 구조가 유사한데요, 이번에는 브레드 보드에 적외선 송신 모듈을 연결한 후, 전선을 이용하여 브레드 보드와 아두이노 보드를 연결했습니다. 적외선 수신 모듈의 VCC핀은 아두이노 보드의 5V 핀에, 모듈의 GND핀은 보드의 GND핀에, 모듈의 DATA핀은 아두이노 보드의 3번 핀에 연결해야 합니다.

그림8 적외선 신호를 송신하는 아두이노

다음으로 아두이노 IDE에서 리모컨의 적외선 신호를 송신하는 코드인 IRremote 라이브러리의 SimpleSender 예제를 열어 이 장치를 작동하는 코드를 완성하려 합니다. 그런데, 이 코드를 사용하기 위해 수정해야 하는 부분들이 있습니다. 먼저, 이 장치로 작동시킬 리모컨 버튼 하나를 정한 후, 이 버튼에 해당하는 신호 값을 코드에 입력해야 합니다. 그래서 코드의 49번째 줄에서 '0x34' 대신 (1)에서 구한 Command값(ex. 0x19)을 입력하고, 58번째 줄의 'HEX'에는 버튼에 해당하는 16진수 값(ex. 0xE619BF40)을 입력합니다. 그리고 67번째 줄의 'IrSender.sendNEC()' 함수의 첫 번째 변수로 할당된 '0x00' 대신 Address값(ex. 0x40)을 입력합니다. 마지막으로 69-77번째 줄은 불필요하니 삭제하고, 코드의 가장 아래에 있는 'delay()'함수에는 채널을 100000ms마다 돌린다는 의미에서 100000을 입력했습니다.

그림9 SimpleSender 예제 코드에서 수정한 부분

그리고 아두이노 보드와 컴퓨터를 데이터 케이블로 연결해주고 앞서 이야기한 기본적인 세팅을 한 후, 코드를 아두이노 보드에 업로드해서 리모컨을 완성했습니다!

이제 리모컨이 잘 작동하는지 한번 테스트해 볼까요? 코드를 보드에 업로드했더니 채널이 바뀌는 것을 확인할 수 있었습니다. 이렇게 리모컨을 복제해 내는 데 성공했네요!

지금까지 아두이노와 리모컨의 원리에 대해 알아본 후 리모컨을 직접 만들어보았습니다. 음량 버튼이나 전원 버튼 등, 다른 동작을 제어하는 버튼의 신호를 알아내고 복제 리모컨에 부품을 추가한다면, 더 많은 기능을 가진 리모컨을 만들 수도 있을 거예요. 리모컨에서 일어나는 적외선 통신은 Wi-Fi 기술 등 우리 일상생활에서 이제는 없어서는 안 될 무선통신 기술의 일부이기도 합니다. 무선통신 기술을 활용하면 서로 떨어져 있는 전자기기를 연결하여 다양한 일을 할 수 있고, 이는 곧 사물인터넷, 즉 모든 것들의 인터넷(Internet of Things, IoT)으로 이어집니다.

누구나 '자기 전에 침대에서 버튼만 누르면 불을 대신 꺼 주는 기계는 없을까?', '습도가 일정 수준 이상이면 경고음을 내는 기계는 없을까?'와 같은 생각을 해 보았을 거예요. 하지만 실제로 작동하는 '기계'를 만든다는 것이 너무나도 어렵게 느껴져서 그저 상상으로만 그치는 경우가 많지요. 하지만 오늘 나만의 리모컨을 만들어 보았듯이, 여러분도 아두이노를 활용하면 얼마든지 여러분만의 발명품을 만들 수 있다는 사실을 잊지 마세요. 작은 발명으로 키운 상상력과 호기심으로 여러분이 공학자라는 큰 꿈을 이루어 나가기를 응원합니다.

주석
  • 1) 오픈 소스(open source)란 누구나 접근하고 수정할 수 있도록 공유되는, 소프트웨어 프로그램을 개발할 때 사용할 수 있는 소스 코드나 설계도를 말한다.

  • 2) 마이크로 컨트롤러(MCU)란 컴퓨터의 중앙 처리 장치인 마이크로 프로세서와 입출력 모듈을 하나의 칩으로 만들어, 특정 기능을 수행하는 컴퓨터이다.

  • 3) 브레드 보드란 흔히 빵판이라고 불리는 장치로, 납땜을 하지 않고도 전선과 부품을 연결하여 전자회로를 구성할 수 있는 도구이다.

  • 4) 라이브러리(Library)란 프로그래밍을 할 때 자유롭게 가져와서 사용할 수 있도록 미리 코딩해둔,특정 기능들을 제공하는 프로그램 조각들을 의미한다.

  • 5) 시리얼로 받은 값을 볼 수 있는 창을 말한다.

  • 6) 리모컨 코드는 16진법을 사용함으로써 2진법과의 변환이 용이하고 표현이 간단해서 메모리의 부담을 줄일 수 있다는 장점이 있다.

참고 문헌
그림 출처
공대상상 이벤트 참여하기