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 연결 회로도 및 연결 예시
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 라이브러리 사용법이 필요하신 분들은 아래의 포스트를 참고해주세요.끝까지 읽어 주셔서 감사합니다.😄
'Embedded > Arduino' 카테고리의 다른 글
아두이노 코딩 : HC-SR04 로 측정한 거리를 I2C CLCD 에 출력 (0) | 2020.09.21 |
---|---|
아두이노 강좌 #38 HC-SR04 동작 방식과 사용법 (0) | 2020.09.19 |
아두이노 강좌 #37 IR 적외선 통신 송신 코드 작성 IRremote 라이브러리 사용 (0) | 2020.09.10 |
아두이노 강좌 #36 IRremote 라이브러리로 IR 수신 코드 작성 - 603LM (2) | 2020.09.08 |
아두이노 강좌 #35 적외선 IR(Infrared) 송신 수신 부품 CL-1L5 603LM (0) | 2020.09.07 |