아두이노:IR 송수신
보이기
아두이노 관련 정보를 모으기 위한 틀. 틀:아두이노
- 아두이노:개요
- 아두이노:하드웨어
- 아두이노:코드
- 아두이노:핀 사용
- 아두이노:시리얼 통신
- 아두이노:편의함수
- 센서 사용
- 아두이노:LCD 사용
- 아두이노:스위치 사용
- 아두이노:릴레이
- 통신 관련, 정보 교환
- 아두이노:해결되지 않은 다양한 의문들
- 수업용 간단 실습
- 아두이노 모터 출력
- 미완문서
- 분류:아두이노 프로젝트
개요
적외선 리모컨 신호를 받아들이고 반대로 적외선 신호를 내보내는 과정에 대하여.
하드웨어
IR 수신기
| 종류 | 설명 | 비고 |
|---|---|---|
| VS1838B | 중심주파수: 38 kHz (표준 TV/가전 리모컨 대부분) |
|
| KY-022 | VS1838B에 기판 단 것.(머리부분에 1838이라 각인되어 있다)
기판에 축전기랑 저항 달려있어서 노이즈를 줄인다. |
|
| TSOP38238 | 수신거리가 12m정도로 위보다 조금 짧지만, 노이즈에 강함. |
IR 송신기
리모컨 앞에 달린 둥그런 그것.
| 종류 | 설명 | 비고 |
|---|---|---|
| 적외선 LED | ||
| KY-005 | 적외선 LED만 있어도 되지만, 편의사항 증진.
하지만, 신호가 별로 멀리 나가진 않는다; |
활동 예시
준비물
- 수신기 작동 확인용 리모컨
코드
수신 관련 코드
IRremote 라이브러리를 요한다. 라이브러리 매니저에서 받는 게 가장 편함.
#include <IRremote.h>
int RECV_PIN = 11;
void setup() {
Serial.begin(9600);
IrReceiver.begin(RECV_PIN, ENABLE_LED_FEEDBACK); // 수신기 시작
}
void loop() {
if (IrReceiver.decode()) {
Serial.print("받은 값: 0x");
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
IrReceiver.resume(); // 다음 신호 수신 준비
}
}
송신 관련 코드
수신과 마찬가지로 IRremote 라이브러리를 요한다. 라이브러리 매니저에서 받는 게 가장 편함.
#include <IRremote.h>
// 송신 핀 (기본은 D3)
#define IR_SEND_PIN 3
void setup() {
Serial.begin(9600);
IrSender.begin(IR_SEND_PIN, ENABLE_LED_FEEDBACK); // 송신 시작
Serial.println("IR 송신기 준비 완료");
}
void loop() {
// 예: NEC 프로토콜 (TV 리모컨 많이 씀)
// 버튼 코드 예시: 0xFFA25D (리모컨에서 "전원" 버튼 같은 값)
Serial.println("IR 코드 송신 중...");
IrSender.sendNEC(0xFFA25D, 32); // (코드값, 비트수)
delay(5000); // 5초마다 전송
}
송수신 합친 코드
#include <IRremote.h>
#define RECV_PIN 2 // 수신기 핀
#define SEND_PIN 3 // 송신기 핀
IRrecv irrecv(RECV_PIN);
IRsend irsend(SEND_PIN);
decode_results results;
unsigned long learnedCode = 0; // 학습된 코드 저장
void setup() {
Serial.begin(9600);
irrecv.enableIRIn(); // 수신 시작
Serial.println("리모컨 버튼을 눌러 학습하세요...");
}
void loop() {
// ===== 1. 리모컨 수신 =====
if (irrecv.decode(&results)) {
learnedCode = results.value; // 학습
Serial.print("학습된 코드: 0x");
Serial.println(learnedCode, HEX);
irrecv.resume(); // 다음 신호 수신 준비
}
// ===== 2. 시리얼 입력 확인 =====
if (Serial.available() > 0) {
String input = Serial.readStringUntil('\n');
input.trim();
if (input == "send") {
if (learnedCode != 0) {
Serial.print("코드 송신 중: 0x");
Serial.println(learnedCode, HEX);
irsend.sendNEC(learnedCode, 32); // NEC 방식, 32비트
} else {
Serial.println("아직 학습된 코드가 없습니다!");
}
}
}
}