오래된 리모컨 재활용: 아두이노로 DIY 스마트 기기 만들기
부품 및 소모품
| 부품 | 수량 | 비고 |
| 아두이노 나노 R3 | 1 | |
| 5mm 적색 LED | 3 | 상태 표시용 1개, 나머지는 채널 식별용 |
| 5mm 녹색 LED | 1 | 채널 식별용 |
| 5mm 황색 LED | 1 | 채널 식별용 |
| 청색 LED | 2 | 채널 식별용 |
| 브레드보드 (풀 사이즈) | 1 | |
| 점퍼 와이어 (일반) | 1세트 | |
| 토글 스위치 (SPST, Off-On) | 1 | 런/런 모드 전환용 |
| 브레드보드 파워 서플라이 스틱 5V/3.3V | 1 | 선택 사항 (USB 전원 사용 시 불필요) |
| IR 수신 모듈 (KY-022 37.9kHz) | 1 | 아마존 구매품 사용 |
프로젝트 소개
낡은 VCR, TV, DVD 플레이어 등의 여분 리모컨을 재활용하여 램프, 히터 등 5V 신호로 제어 가능한 기기(릴레이, 파워 트랜지스터 등)를 켜고 끄는 프로젝트입니다. 여기서는 데모로 최대 6개 LED를 토글 제어합니다.
작동 원리
아두이노 나노의 EEPROM(1024바이트)에 리모컨의 6개 버튼 코드(롱 정수, 각 4바이트)를 저장합니다. 전원 차단 후에도 코드가 유지됩니다. 토글 스위치로 '학습 모드'와 '실행 모드'를 전환합니다.
학습 모드 (스위치 ON)
- 빨간 상태 LED 점등으로 학습 모드 알림
- LED 1이 깜빡이면 리모컨의 1번 키 누름 → 해당 코드 저장 후 상태 LED 고속 점멸(진동처럼 보임)로 확인
- LED 2~6 순차 반복
- 완료 후 상태 LED 1초 간격 느린 점멸 → 스위치를 실행 모드로 전환하라는 신호
실행 모드 (스위치 OFF)
- 저장된 6개 코드와 수신 코드 비교
- 일치하는 채널의 LED 토글 (켜짐↔꺼짐)
- 등록되지 않은 코드 수신 시 전체 LED 끄기 (리셋 기능)
- 중복 코드 감지 시 해당 LED 몇 회 점멸로 경고 (강제 재학습은 안 함)
팁: 수신 감도 향상을 위해 IR 수신부 LED를 45도 아래로 굽히고 골판지+테이프로 한쪽만 열린 박스를 씌우면 5~8피트 거리에서도 안정적으로 수신됩니다.
릴레이 확장 예시 (애드엔덤)
LED 1~5와 병렬로 5개 릴레이 연결 테스트 완료. 120VAC 스탠드 조명 제어 가능. 6번째도 동일 작동 예상. 주의: 메인 전압은 감전/사망 위험이 있으니 전문가 감독 하에 작업하세요.
소스 코드
/* IR 리모컨 재활용 스케치 - Paul M Dunphy VE1DX, 2020년 3월 */
#include <IRremote.h>
#include <EEPROM.h>
long unsigned int intIRCode;
long unsigned int savedIRCodes[6];
long unsigned int dupeCheck[6];
const int Recv_Pin = 2;
const int PinOne = 12, PinTwo = 11, PinThree = 10, PinFour = 9, PinFive = 8, PinSix = 7;
const int switchPin = 4, statusPin = 5;
const unsigned long int repeatKeyPress = 0xFFFFFFFF;
boolean learnMode, first_iteration;
int togglestate1=0, togglestate2=0, togglestate3=0, togglestate4=0, togglestate5=0, togglestate6=0;
int remote_code_1, remote_code_2, remote_code_3, remote_code_4, remote_code_5, remote_code_6;
IRrecv irrecv(Recv_Pin);
decode_results results;
// EEPROM 4바이트 롱 정수 쓰기/읽기 함수
void EEPROMWritelong(int address, long value) { ... }
long EEPROMReadlong(long address) { ... }
int Flip_LED(int led, int toggle_state) { ... }
void Reset() { ... }
void guessType() { ... }
int learnCodeRead(int pinCode) { ... }
void Confirm() { ... }
void learn_Mode() {
// 6개 채널 순차 학습, EEPROM 저장, 중복 체크 등
// 상세 로직은 원문 참조
}
void run_Mode() {
// 수신 코드 비교 후 해당 LED 토글, 미등록 코드는 Reset()
}
void setup() {
first_iteration = true;
Serial.begin(9600);
irrecv.enableIRIn();
// EEPROM 초기값 FFFFFFFF(리피트 코드) 감지 시 소니 RM-YD104 기본값 세팅
// LED 핀 출력 설정, Reset(), 저장된 코드 읽기, 중복 체크
}
void loop() {
learnMode = (digitalRead(switchPin) == HIGH);
if (learnMode) { first_iteration = true; Reset(); digitalWrite(statusPin, HIGH); learn_Mode(); Reset(); first_iteration = false; }
else { digitalWrite(statusPin, LOW); run_Mode(); first_iteration = false; }
}
회로도