아두이노 코딩 : 아두이노 우노로 리모컨 만들기
이번 포스트에서는 스위치의 디바운스 코드를 사용하여 모니터의 볼륨을 IR(Irfrared) 통신 방식으로 제어하는 예제를 소개하였습니다. 이번 예제에 사용한 채터링 코드와 IRremote 라이브러리 사용법이 궁금하신 분들은 하단의 관련 포스트를 참고해주세요.
Lucy Archive
Lucy / Facilitate4U
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 라이브러리 사용법이 필요하신 분들은 아래의 포스트를 참고해주세요.

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

관련포스트

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

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

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

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