LIRC 없이 라즈베리 파이에서 IR 리모컨 명령 캡처하기: 파이썬 UART 방식
라즈베리 파이에 IR 리모컨을 통합할 때 LIRC를 거치지 않고 UART 시리얼 인터페이스를 직접 활용하면 간단합니다. 다음 가이드는 하드웨어 설정부터 파이썬 디코딩까지 전체 과정을 안내해 최소한의 코드로 리모컨 신호를 안정적으로 캡처할 수 있게 합니다.
왜 LIRC를 건너뛰나?
LIRC는 IR 기기용 일반 프레임워크를 제공하지만, 단순한 프로젝트에는 과하고 때로는 지연이나 호환성 문제를 일으킵니다. 내장 UART 핀(TX/RX)과 저속 시리얼 프로토콜을 사용하면 가볍고 결정적인 솔루션을 얻어 디버깅이 더 쉽습니다.
하드웨어 개요
- IR 센서: HX1838(또는 시리얼 데이터를 출력하는 5V IR 수신기).
- 라즈베리 파이 GPIO: 센서 출력을 GPIO 15(RX)에 연결. 센서 VCC를 5V, GND를 접지 핀에 연결.
- UART 핀 설정: ttyAMA0의 기본 콘솔을 비활성화해 UART를 센서 입력 전용으로 사용.
1단계 – 라즈베리 파이 UART 준비
1. 커널 커맨드 라인 백업:
sudo cp /boot/cmdline.txt /boot/cmdline_bp.txt
2. ttyAMA0 파라미터 제거 (console=ttyAMA0,115200 및 kgdboc=ttyAMA0,115200)를 /boot/cmdline.txt에서:
sudo nano /boot/cmdline.txt
결과 라인은 다음과 비슷해야 합니다:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p6 rootfstype=ext4 elevator=deadline rootwait
3. /etc/inittab에서 ttyAMA0 로그인 프롬프트 마스킹:
sudo nano /etc/inittab
주석 처리:
#X:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
2단계 – pySerial 설치
UART 통신을 위한 파이썬 시리얼 라이브러리 설치:
sudo apt-get install python-serial
설치 후 스크립트에서 임포트:
import serial
3단계 – IR 센서 배선
- 센서 출력 핀을 GPIO 15(RX)에 연결.
- 센서에 5V와 접지 공급.
- 센서가 데이터만 출력하므로 이 프로젝트에서는 TX(GPIO 14) 미사용.
4단계 – IR 바이트 읽기 기본 파이썬 스크립트
HX1838은 2400bps로 시리얼 스트림을 전송합니다. 다음 스니펫은 키 누름당 12~16바이트를 읽고 ASCII 코드를 출력합니다.
import serial
ser = serial.Serial('/dev/ttyAMA0')
ser.baudrate = 2400
for _ in range(15): # 최대 15바이트 캡처
byte = ser.read(1)
print(ord(byte))
시행착오 끝에 2400bps가 가장 안정적인 캡처를 제공했습니다. 낮은 속도가 공중 전파 비트 오류 확률을 줄이기 때문으로 보입니다.
5단계 – 삼성 리모컨 키 디코딩
삼성 TV 리모컨으로 테스트한 결과, 키 누름마다 12~16바이트가 나옵니다:
- 바이트 0~5: 헤더 – 모든 키에서 동일.
- 바이트 6~11: 페이로드 – 눌린 버튼을 고유 식별.
- 바이트 12: 테일 (이 리모컨 특유).
키를 매핑하기 위해 바이트 6~11의 단순 가중 합을 계산합니다:
keyidentity = (byte[6] + 2*byte[7] + 3*byte[8] + 4*byte[9] + 5*byte[10] + 6*byte[11])
가장 견고한 방법은 아니지만 각 버튼마다 고유한 값을 내어 비교가 간단합니다. 더 엄격한 충돌 저항이 필요하면 해시나 XOR로 대체하세요.
완성 예제: ir_serial3samsung.py
아래는 간소화된 스크립트로:
- 24바이트(두 프레임)를 읽어 시리얼 버퍼 플러시.
- 처음 12바이트만 사용해 키 디코딩.
- 계산된
keyidentity를 출력해 빠른 참조 가능.
import serial
ser = serial.Serial('/dev/ttyAMA0', 2400)
while True:
# 버퍼 클리어용 24바이트 읽기
raw = ser.read(24)
# 처음 12바이트가 단일 키 프레스에 해당
key_bytes = raw[:12]
key_id = sum((i+1)*b for i, b in enumerate(key_bytes[6:12]))
print(f'Key ID: {key_id}')
스크립트 실행 후 삼성 리모컨 버튼을 누르세요. 각 버튼마다 고유한 Key ID가 출력됩니다. 이 ID들을 룩업 테이블에 저장해 애플리케이션에서 액션에 매핑하세요.
결론
UART와 간단한 파이썬 스크립트로 IR 리모컨 신호를 캡처하면 LIRC가 필요 없고, 지연이 줄어들며, 디코딩 로직을 완전히 제어할 수 있습니다. 코드가 최소화되고 투명해 디버깅이 간단합니다. 시리얼 데이터를 출력하는 모든 IR 리모컨에 이 패턴을 적용할 수 있어 라즈베리 파이 프로젝트에 다재다능한 솔루션입니다.
더 자세한 지침은 원본 게시글 참조: How to Use and Emulate…