자작 적외선 리모컨 (무선 전화기 개조)

거실 TV에 PC가 연결되어 있는데 PC로 동영상 볼려면 TV 리모컨과 PC용 적외선 무선 키보드 2개를 조작해야 한다.
PC용 키보드는 파일 선택을 위한 트랙볼과 재생 위치 및 볼륨 조절용 방향키만 주로 사용한다.
이걸 한개로 통합한 리모컨을 만들까 하다가 회로도 그리고 땜질하고 만들기도 귀찮고, 또 자작한 하드웨어는 언제나 마무리(하우징)가 아쉬어 미루고 있었다.
운좋게 적외선 리모컨 기능이 내장된 무선 전화기를 하나 구했다.
LG에서 만든 GP-9138이라는 모델이고 KT ann용 무선 전화기 이다.


[요렇게 생긴 놈이다]
배를 갈라보니 LPC2210이라고 마킹된 메인 컨트롤러가 보인다.
요건 또 뭘까? 구글신께 문의 시작...
메인 컨트롤러는 ARM7TDMI 기반이고 다행히 LCD를 제외한 메인 컨트롤러 및 주변 부품들의 메뉴얼과 데이터 시트를 구할 수 있었다.
컬러 LCD와 전화기용 키패드가 있어 리모컨 만들기에 아주 딱이다.
요걸로 만들면 되겠다 싶어 시작 했다.


[메인 컨트롤러]
우선 컨트롤러의 리셋 벡터와 부트 모드를 확인해 보았다.
JTAG핀을 쓸까 하다가 UART 시리얼 부트모드와 제작사에서 제공하는 'LPC2000 Flash Utility'라는 툴을 이용하면 부트로더 주입이 가능해 보여 이걸로 시작 하기로 했다.
부트모드 변경 및 UART연결을 위한 와이어 작업을 한다.
하는김에 다른 기기들 조작을 위해 리모컨 발신 분석용 IR 수신기도 달아 준다.
수화스피커를 떼낸 공간에 딱 맞게 들어 간다.


[대가리쪽에 달아준 IR 수신기]
[오.. 딱 맞게 들어간다]
필요 없는 RF 및 모뎀 관련 부품들은 소모전류를 줄이기 위해 모두 들어낸다.
LPC2210에는 내장 플래시 메모리가 없어 'LPC2000 Flash Utility'툴 사용이 가능할지 의문이었는데 내부 램 R/W와 내부 램으로 점프도 가능하게 구성되어 있다. 탱크유소우머취.
내부 램에 1차 부트로더를 올리고 외부 플래시 메모리에 2차 부트로더를 버닝하면 된다.
안되면 JTAG을 붙일려고 자작해서 쓰고 있는 USB-JTAG 하드웨어를 옆에 대기 시켜놨는데 철수해도 되겠다. 흐흐흐... 철수중에 철수는 역시 배철수지. 크크크...


[부트모드 변경용 버튼과 리셋버튼 그리고 UART 연결용 케이블 제작]
간단히(?) 부트로더를 만들어 올리고 기본 펌웨어는 백업받아 파일로 저장해 놓는다.
회로 구성상 UART를 전혀 쓰지 않은 것으로 보인다.
터미널 연결도 없이 코딩을 하다니...
아주 좋은 디버깅 하드웨어를 썼거나 아니면 터미널 없이도 개발이 가능한 대단한 개발자 이거나...

PLL, 타이머, 인터럽트, UART, 키패드, LED, LCD 백라이트, 외부메모리 인터페이스등 기본 기능들 테스트를 완료하고 LCD부터 시작.

LCD에 마킹된 문자열로 검색해 봤는데 구글이 모른댄다. 나오는 데이터가 없어 인터넷으로 구할 수 있는 컬러 LCD제어기 칩들을 모아 일일히 메뉴얼대로 구현해 인터페이스 테스트를 해봤다.
안된다. 젠장...
read 스트로브 신호를 쓰지 않아 칩 상태를 읽어 볼 수가 없다.
아 피곤하군...
백업 받은 바이너리 파일을 디스어셈블한다.
LCD에 접근하는 코드를 찾아낸다.
LCD에 접근하는 함수가 약 3개 정도 보이는거 같다.
역시나 LCD상태를 읽어보는 코드는 보이지 않는다.
한개는 LCD 초기화 함수 같고 한개는 초기화시 호출하는 함수 인데 플래시에서 상수를 읽어 LCD레지스터에 쓴다. 뭐하는 함수인지 모르겠다.
나머지는 픽셀제어용 함수인듯 보인다. 4개 인수를 받아 좀 복잡한 수식 계산을 하는데 그래픽 램 어드레스 설정이나 포인터 설정등 뭐 이런거 하는거 같다. 어셈블리로된 수치연산 코드 해석은 골아프다. 일단 스킵...
초기화 함수로 추정되는 코드를 따라 하드 코딩된 8bit 상수 데이터를 뽑아내 초기화 해보니 오우~~ 된다. 나머지 함수들도 C로 구현해 이리 저리 돌려보며 설정할 수 있게 되었다.
이틀간 삽질로 LCD제어가 완료 되었다 (참 쉽죠?).
초기화시 호출하는 함수는 LCD 콘트라스트 설정이고, RGB포멧은 픽셀당 4:4:4 12bit 포멧이다 (2픽셀당 3바이트).
인터페이스 방식이 기존 인터넷에서 구했던 컬러LCD 제어칩들과 완전히 다르다.


[LCD 테스트중]
기본 IR 송신과 수신기능을 테스트하고 기기 기능들을 구현해 넣는다.
동작 모드는 총 3가지로, RC모드 (Remote Control Mode), TX모드 (Transmission Mode), RX (Receive Mode)모드이다.
RC모드는 알고있는 기기들의 송신코드를 미리 넣어 해당 기기를 조작하는 기능을 구현시켰다.
TX모드는 리모컨이 없는 기기에 임의의 IR코드를 주입시켜 동작테스트를 해볼 목적으로 구현해 넣었다.
RX모드는 IR리모컨의 발신 신호를 받아 분석할 수 있게 기능을 구현했다.

사용중인 IR제어 기기들의 코드를 읽어 내장시켰다.

대부분 NEC코딩 방식이라 쉽게 읽어볼 수 있었으나 IR 무선 키보드는 자체 개발 포멧인지 데이터 분석이 불가하여 키별 타이밍값을 하드코딩하여 넣어 버렸다.
기존 장착된 Ni-Cd배터리는 맛이가서 리튬이온 배터리로 달아 줬다.


[맛간 Ni-Cd 배터리를 걷어내고 안쓰는 휴대폰 배터리를 개조해서 넣어줌]
[동작 모드별 LCD화면]
LCD표기는 위 그림의 좌측부터 RC모드, RC모드에서 키보드 선택, TX모드, RX모드에서 수신대기, RX모드에서 수신완료 상태이다.
RX모드에서는 IR수신 완료후 NEC 포멧으로 분석하여 헤더 타이밍, 8bit-ID, 8bit-DATA값을 표기해 주도록 하였다. 나머지 수치는 수신된 타이밍값을 us단위로 모두 표기해 NEC포멧이 아닐 경우 수동으로 해독할 수 있게 했다.
소프트파워 버튼이 하드웨어로 구현되어 있어 일정시간내 키 조작이 없을 경우 자동 OFF시켜 꽤 오래 쓸 수 있을듯 하다.


[최종 완성]