아두이노 코딩 : 아두이노 우노로 리모컨 만들기
Lucy Archive
Lucy 2023
2020. 9. 11. 00:23

Arduino IRED IR Remote SwitchArduino IRED IR Remote Switch

Arduino Uno : IR(Irfrared) Remote Control Using CL-1L5

이번 포스트에서는

스위치의 디바운스 코드를 사용하여 모니터의 볼륨을 IR(Irfrared) 통신 방식으로 제어하는 예제

를 소개하였습니다. 이번 예제에 사용한 채터링 코드와 IRremote 라이브러리 사용법이 궁금하신 분들은 하단의 관련 포스트를 참고해주세요.

Hardware

준비물

본 예제의 구성 품은 아래와 같습니다.

  • Arduino Uno x 1EA
  • CL-1L5 x 1EA (IRED : 적외선 발광 소자)
  • Tack Switch x 2EA 
  • Bread Board x 1EA
  • JumperWIres

회로도 및 연결

아두이노 우노 : IRED, Switch 연결아두이노 우노 IRED, Switch 연결 회로도 및 연결 예시

IRremote 라이브러리로 IRED 를 송신하는 경우 출력 포트는 3번 포트로 고정되어 있어 트랜지스터의 베이스는 D3 포트로 사용하였습니다. 스위치는 D4, D5 번 포트를 사용하고, 아두이노의 내부 풀업 저항을 사용합니다. 


예제 : 스위치로 모니터 Volume Up/Down

아두이노에 연결된 TACT 스위치 2개를 사용하여 모니터의 Volume Up/Down 을 수행하는 예제입니다. 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <IRremote.h>
 
#define UPSWITCH 4 // 택트스위치1 - VOlUME UP
#define DOWNSWITCH 5 // 택스스위치2 - VOlUME DOWN
#define DEBOUNCETIME 100 // 디바운스 타임
#define PUSHHOLDTIME 500 // 푸쉬홀드 타임
#define VOLUMEUP 0x40BF30CF // 모니터 볼륨 업
#define VOLUMEDOWN 0x40BF728D // 모니터 볼륨 다운
 
IRsend irsend;
 
int bFlag1 = 0// 버튼1 Flag
int bFlag2 = 0// 버튼2 Flag
 
void setup() {
    // 스위치 연결 포트 내부 풀업 모드로 사용
    pinMode(UPSWITCH, INPUT_PULLUP);
    pinMode(DOWNSWITCH, INPUT_PULLUP);
}
 
void loop() {
    // UPSWITCH과 2가 눌려져 있는 경우 pushEvent(눌러진 핀) 함수 호출
    if(digitalRead(UPSWITCH) == LOW){
        pushEvent(UPSWITCH);
    }   
    if(digitalRead(DOWNSWITCH) == LOW){
        pushEvent(DOWNSWITCH);
    }
    // bFlagn : 버튼n이 처음 눌려지거나, 500ms 눌러져있는 경우
    if(bFlag1 == 1){
        Serial.println("Volume Up!");
        irsend.sendNEC(VOLUMEUP, 32);
        bFlag1 = 0;
    }
    if(bFlag2 == 1){
        Serial.println("Volume Down!");
        irsend.sendNEC(VOLUMEDOWN, 32);
        bFlag2 = 0;
    }
}
 
// pushEvent 함수 : 디바운스 코드 및 버튼 홀드를 판단
void pushEvent(int button){
    // tLastTime, tNow : 디바운스 시간 판단을 위한 변수
    // timeSum : 버튼 홀드 타임 판단을 위한 함수
    static unsigned long tLastTime = 0;
    unsigned long tNow = millis();
    static unsigned int timeSum = 0;
    // 디바운스 코드
    if((tNow-tLastTime) > DEBOUNCETIME){
        if(button == UPSWITCH){
            bFlag1 = 1;
        }
        else{
            bFlag2 = 1;
        }
        timeSum = 0;
    }
    // 버튼 홀드 판단 코드 : 버튼 500ms 누르고 있는 경우 flag 활성화
    else if(timeSum > PUSHHOLDTIME){
        if(button == UPSWITCH){
            bFlag1 = 1;
        }
        else{
            bFlag2 = 1;
        }
        timeSum = 0;
    }
    timeSum = timeSum + (tNow-tLastTime);
    tLastTime = tNow; 
}
cs

코드 설명

📌 5 Line DEBOUNCETIME : 스위치의 디바운스 시간을 ms 단위 지정합니다. 100ms 이내 스위치 입력시 무효처리

📌 6 Linn PUSHHOLDTIME : 스위치를 누르고 있다고 판단하는 기준 ms 단위 시간입니다. 500ms 동안 누르고 있으면 같은 동작을 반복합니다. 

📌 51~59 Line : 스위치 디바운스 처리 코드 입니다. DEBOUNCE 로 설정된 ms 시간 동안 스위치 입력시 채터링으로 간주하고 스위치 입력을 무료 처리 합니다.

📌 61~71 Line : 스위치가 눌러져 있는 시간이 PUSHHOLDTIME 보다 긴 경우 반복 동작 명령을 수행합니다. 즉, 볼륨 증가 스위치를 0.5s 이상 누른 경우 볼륨 증가 신호를 반복적으로 송신합니다.


실행 결과

위 예제를 실행하면 아래 영상과 같이 눌러진 스위치에 따라 볼륨 증가 또는 감소를 수행합니다. 버튼이 눌러져 있는 경우 0.5s 간격으로 같은 동작을 반복 수행합니다. 


마무리

이번 포스트에서는

아두이노 우노, 스위치, IRED 를 사용하여 아두이노를 리모컨 처럼 사용

할 수 있는 예제를 소개하였습니다. 예제에 사용한 디바운스 코드 설명과 IRED 사용법, IRremote 라이브러리 사용법이 필요하신 분들은 아래의 포스트를 참고해주세요.

끝까지 읽어 주셔서 감사합니다.😄

관련포스트

👉 아두이노 디지털 입출력 관련글 목록 보기

👉 아두이노 적외선 송수신 관련글 목록 보기

👉 아두이노 센서 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기