본문으로 이동

아두이노:IR 송수신

학교의 모든 지식. SMwiki
Sam (토론 | 기여)님의 2025년 8월 27일 (수) 04:53 판 (IR 수신기)

아두이노 관련 정보를 모으기 위한 틀. 틀:아두이노

  1. 아두이노:개요
  2. 아두이노:하드웨어
    1. 아두이노:우노보드
    2. 아두이노:ESP32
  3. 아두이노:코드
    1. 아두이노:컴퓨터에서 보드로
    2. 아두이노:안드로이드에서 보드로
    3. 아두이노:기초 문법
    4. 아두이노:라이브러리
  4. 아두이노:핀 사용
    1. 아두이노:전원공급
  5. 아두이노:시리얼 통신
    1. 아두이노:엑셀기록
    2. 아두이노:파이썬과 통신
  6. 아두이노:편의함수
  7. 센서 사용
    1. 아두이노:모션센서
    2. 아두이노:온습도센서
    3. 아두이노:조도센서
    4. 아두이노:인체감지센서
    5. 아두이노:pH미터 만들기(Gravity 아날로그 pH센서)
  8. 아두이노:LCD 사용
  9. 아두이노:스위치 사용
  10. 아두이노:릴레이
  11. 통신 관련, 정보 교환
    1. 아두이노:WIFI
    2. 아두이노:블루투스(외장모듈)
    3. 아두이노:IR 송수신
    4. 아두이노:RFID
  12. 아두이노:해결되지 않은 다양한 의문들
  13. 수업용 간단 실습
    1. 아두이노:LED
    2. 아두이노:초음파센서
    3. 아두이노:전압계 만들기
    4. 아두이노:저항계 만들기
  14. 아두이노 모터 출력
    1. 아두이노:서보 모터
    2. 아두이노:DC 모터
    3. 아두이노:BLDC 모터
  15. 미완문서
    1. 아두이노:스테핑 모터
  16. 분류:아두이노 프로젝트

개요

적외선 리모컨 신호를 받아들이고 반대로 적외선 신호를 내보내는 과정에 대하여.

하드웨어

IR 수신기

종류 설명 비고
VS1838B 중심주파수: 38 kHz (표준 TV/가전 리모컨 대부분) ir_remote_pinout.jpg
KY-022 VS1838B에 기판 단 것.(머리부분에 1838이라 각인되어 있다)

기판에 축전기랑 저항 달려있어서 노이즈를 줄인다.

  • S라 쓰인 단자가 신호
  • -라 쓰인 곳이 GND
  • 가운데가 전원입력
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("아직 학습된 코드가 없습니다!");
      }
    }
  }
}