TV 리모컨으로 아두이노 IR 제어하기 - 단계별 튜토리얼
작동 원리
이 아두이노 IR 튜토리얼에서는 TV 리모컨과 아두이노를 사용하여 전자 기기를 제어하는 방법을 배웁니다. 간단한 LED 제어부터 DC 팬 속도 제어, 고전압 가전제품 제어까지 몇 가지 예제를 다룹니다.
TV 리모컨 앞의 LED가 버튼을 누를 때 깜빡이는 것을 볼 수 있습니다. 이는 적외선이므로 카메라를 통해서만 볼 수 있으며 육안으로는 보이지 않습니다.
이 깜빡임은 버튼을 누를 때 적외선 LED가 빛의 파동이나 펄스를 보내며, 이를 적외선 수신기로 받아야 함을 의미합니다.
이 튜토리얼에서는 V 34838 IR 수신기를 사용합니다. 블록 다이어그램에서 볼 수 있듯이 수신된 신호를 증폭, 필터링, 복조하여 아두이노 디지털 입력에 적합한 깨끗한 로직 출력을 제공합니다.
Ken Shirriff의 Arduino-IRremote 라이브러리와 데모 예제를 사용하면 시리얼 모니터에서 각 버튼 누름에 대한 고유한 16진수 코드를 확인할 수 있으며, 이를 프로그램 제작에 활용합니다.
Ken Shirriff의 Arduino-IRremote 라이브러리: https://github.com/z3t0/Arduino-IRremote
TV 리모컨으로 RGB LED 제어하기
필요한 부품
- IR 수신기
- RGB LED
- 3x 220옴 저항
- 아두이노 보드
- 브레드보드와 점퍼 와이어
TV 리모컨의 4개 색상 버튼으로 LED 색상을 제어합니다. 먼저 IRrecvDemo 예제를 업로드하고 시리얼 모니터를 실행하여 각 버튼의 16진수 코드를 확인하고 기록합니다.
데모 코드를 수정하여 특정 버튼이 눌렸을 때 실행되는 if문을 추가합니다. 각 버튼에 적절한 RGB 값을 설정하고 setColor() 함수로 LED를 해당 색상으로 켭니다. RGB LED 작동 원리는 아두이노 RGB 튜토리얼을 참조하세요.
/*
* TV 리모컨으로 RGB LED 제어하기
* Ken Shirriff IRremote 라이브러리의 IRrecvDemo 예제 수정
* Ken Shirriff, https://arcfn.com
* 수정: Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <IRremote.h>
int RECV_PIN = 8; // IR 수신기 - 아두이노 8번 핀
IRrecv irrecv(RECV_PIN);
decode_results results;
int redPin = 5;
int greenPin = 6;
int bluePin = 7;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // 수신기 시작
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop() {
if (irrecv.decode(&results)) {
if (results.value == 0xF21D7D46) { // 빨간 버튼
setColor(255, 0, 0); // 빨간색 설정
delay(100);
}
if (results.value == 0x87CF1B29) { // 녹색 버튼
setColor(0, 255, 0); // 녹색
delay(100);
}
if (results.value == 0x6623D37C) { // 노란 버튼
setColor(255, 255, 0); // 노란색
delay(100);
}
if (results.value == 0x854115F2) { // 파란 버튼
setColor(0, 0, 255); // 파란색
delay(100);
}
if (results.value == 0x1639AB6E) { // 정지 버튼
setColor(0, 0, 0); // 끄기
delay(100);
}
irrecv.resume(); // 다음 값 수신
}
delay(100);
}
// RGB LED 활성화용 사용자 정의 함수
void setColor(int red, int green, int blue) {
analogWrite(redPin, red); // 빨간 핀에 PWM 신호 전송
analogWrite(greenPin, green);
analogWrite(bluePin, blue);
}
TV 리모컨으로 DC 팬 속도 제어하기
필요한 부품
- DC 모터 또는 DC 팬
- NPN 트랜지스터
- 다이오드
- 커패시터 - 1uF
- 저항 - 1k옴
TV 리모컨의 재생/정지, 앞/뒤 버튼으로 DC 팬 속도를 제어합니다. 팬 속도 제어 회로도는 다음과 같으며, 실제로는 버튼으로 PWM 신호를 제어합니다. 회로도 작동 원리는 아두이노 모터 튜토리얼을 참조하세요.
/*
* TV 리모컨으로 DC 팬 속도 제어하기
* Ken Shirriff IRremote 라이브러리의 IRrecvDemo 예제 수정
* 수정: Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <IRremote.h>
int RECV_PIN = 8; // IR 수신기 - 아두이노 8번 핀
int pwmPin = 7; // 아두이노 7번 핀 - 트랜지스터 베이스
int pwmValue;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(pwmPin, OUTPUT);
pwmValue = 0; // 모터 끄기로 시작
}
void loop() {
if (irrecv.decode(&results)) {
analogWrite(pwmPin, pwmValue);
if (results.value == 0xAFAF8374) { // 재생 버튼
pwmValue = 255; // 100% 듀티 사이클 | 최대 속도
}
if (results.value == 0x98519C65) { // 정지 버튼
pwmValue = 0; // 0% 듀티 사이클 | 끄기
}
if (results.value == 0x93F1BA08) { // 앞으로 버튼
if (pwmValue <= 245) {
pwmValue = pwmValue + 10; // PWM 듀티 사이클 증가
delay(20);
}
}
if (results.value == 0x71D086FF) { // 뒤로 버튼
if (pwmValue >= 20) {
pwmValue = pwmValue - 10; // PWM 듀티 사이클 감소
delay(20);
}
}
Serial.print(pwmValue); Serial.print(" "); Serial.println(results.value, HEX);
irrecv.resume();
}
delay(100);
}
TV 리모컨으로 고전압 가전제품 제어하기
필요한 부품
최종 예제는 TV 리모컨으로 고전압 가전제품을 제어하는 것입니다. HL-52S 릴레이 모듈을 사용하며, 250V 및 125V AC에서 10A 정격입니다. 아두이노 7번 핀으로 릴레이를 제어하며, 릴레이에는 모든 고전압 전자 기기를 연결할 수 있는 소켓이 있습니다.
고전압을 사용하므로 매우 주의해야 하며, 부적절하거나 잘못된 사용은 심각한 부상이나 사망을 초래할 수 있습니다. 필자는 여러분의 행동에 책임을 지지 않습니다. 릴레이 사용법과 전자 기기 연결용 소켓 제작 방법은 아두이노 릴레이 튜토리얼을 참조하세요.
/*
* TV 리모컨으로 고전압 가전제품 제어하기
* Ken Shirriff IRremote 라이브러리의 IRrecvDemo 예제 수정
* Ken Shirriff, https://arcfn.com
* 수정: Dejan, www.HowToMechatronics.com
*/
#include <IRremote.h>
int RECV_PIN = 8;
int relayOut = 7;
int buttonState;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
pinMode(relayOut, OUTPUT);
buttonState = HIGH; // 릴레이 끄기로 시작. 릴레이 입력이 역으로 작동하므로 HIGH는 비활성화
}
void loop() {
buttonState = digitalRead(relayOut);
if (irrecv.decode(&results)) {
if (results.value == 0xAFAF8374) { // 재생 버튼
digitalWrite(relayOut, LOW); // 릴레이 활성화
}
if (results.value == 0x98519C65) { // 정지 버튼
digitalWrite(relayOut, HIGH); // 릴레이 비활성화
}
irrecv.resume();
}
Serial.print(" "); Serial.println(results.value, HEX);
delay(100);
}