IR 복습, Boss Quest

magicdrill·2025년 3월 1일

임베디드SW_아두이노

목록 보기
14/14

IR 복습

이전에 gnd와 vcc를 반대로 연결해 태워먹은 IR 수신센서를 다시 구매해서 테스트 해본다.

#include <IRremote.h>

int RECV_PIN = 8;  // IR 수신 핀

IRrecv irrecv(RECV_PIN);  // IR 수신 객체 생성

void setup() {
  // Serial 모니터 초기화
  Serial.begin(9600);

  // IR 수신 시작
  irrecv.enableIRIn();
}

void loop() {
  // IR 신호가 수신되었을 때
  if (irrecv.decode()) {
    // 수신된 IR 명령을 Serial 모니터에 출력
    long int decCode = irrecv.decodedIRData.decodedRawData;
    Serial.println(decCode, HEX);

    // 다음 신호를 받을 수 있도록 준비
    delay(100);
    irrecv.resume();
  }
}

일단 리모컨 신호를 읽는거 까지는 했는데, ...이걸 이용해서 final boss 문제를 수행해 보겠다.

page.161 Final Boss

  1. 리모컨의 1번부터 9번까지 눌렀을 때 버저에서 각각 [도, 미, 솔#, 라, 시, 높은도, 높은 레, 높은레#, 높은미]의음이 0.1초간 출력
  2. LC에 현재 출력되고 있은 음을 [Do, Mi, Sol#, La, Si, High Do, High Re, High Re#, High Mi]의 문자열로 출력함
  3. 989895764, 1245, 2356, 989895764, 1245, 2654 순서대로 리모컨을 눌러 연주함

버저 + IR 리모컨 + LCD 사용

1. IR 복습 활용해 분기문 생성

#include <IRremote.h>

int RECV_PIN = 8;  // IR 수신 핀
IRrecv irrecv(RECV_PIN);  // IR 수신 객체 생성

void setup() {
  // Serial 모니터 초기화
  Serial.begin(9600);

  // IR 수신 시작
  irrecv.enableIRIn();
}

void loop() {
  // IR 신호가 수신되었을 때
  if (irrecv.decode()) {
    long int deCode = irrecv.decodedIRData.decodedRawData;
    Serial.print(deCode, HEX);

    if(deCode == 0xF30CFF00){//1누름
      Serial.println(" / 1");
    }
    if(deCode == 0xE718FF00){//2누름
      Serial.println(" / 2");
    }
    if(deCode == 0xA15EFF00){//3누름
      Serial.println(" / 3");
    }
    if(deCode == 0xF708FF00){//4누름
      Serial.println(" / 4");
    }
    if(deCode == 0xE31CFF00){//5누름
      Serial.println(" / 5");
    }
    if(deCode == 0xA55AFF00){//6누름
      Serial.println(" / 6");
    }
    if(deCode == 0xBD42FF00){//7누름
      Serial.println(" / 7");
    }
    if(deCode == 0xAD52FF00){//8누름
      Serial.println(" / 8");
    }
    if(deCode == 0xB54AFF00){//9누름
      Serial.println(" / 9");
    }

    // 다음 신호를 받을 수 있도록 준비
    delay(100);
    irrecv.resume();
  }
}

2. LCD 연결

#include <IRremote.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

int RECV_PIN = 8;  // IR 수신 핀
IRrecv irrecv(RECV_PIN);  // IR 수신 객체 생성

LiquidCrystal_I2C lcd(0x27, 16, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
  // Serial 모니터 초기화
  Serial.begin(9600);

  // IR 수신 시작
  irrecv.enableIRIn();

  //lcd 초기
  lcd.init();  // initialize the lcd
  lcd.backlight();
}

void loop() {
  // IR 신호가 수신되었을 때
  if (irrecv.decode()) {
    lcd.clear();//lcd창 초기

    // 수신된 IR 명령을 Serial 모니터에 출력
    long int deCode = irrecv.decodedIRData.decodedRawData;
    Serial.print(deCode, HEX);

    if(deCode == 0xF30CFF00){//1누름
      Serial.println(" / 1");
      lcd.print("Do");
    }
    if(deCode == 0xE718FF00){//2누름
      Serial.println(" / 2");
      lcd.print("Mi");
    }
    if(deCode == 0xA15EFF00){//3누름
      Serial.println(" / 3");
      lcd.print("Sol#");
    }
    if(deCode == 0xF708FF00){//4누름
      Serial.println(" / 4");
      lcd.print("La");
    }
    if(deCode == 0xE31CFF00){//5누름
      Serial.println(" / 5");
      lcd.print("Si");
    }
    if(deCode == 0xA55AFF00){//6누름
      Serial.println(" / 6");
      lcd.print("High Do");
    }
    if(deCode == 0xBD42FF00){//7누름
      Serial.println(" / 7");
      lcd.print("High Re");
    }
    if(deCode == 0xAD52FF00){//8누름
      Serial.println(" / 8");
      lcd.print("High Re#");
    }
    if(deCode == 0xB54AFF00){//9누름
      Serial.println(" / 9");
      lcd.print("High Mi");
    }

    // 다음 신호를 받을 수 있도록 준비
    delay(100);
    irrecv.resume();
  }
}

3. 부저 연결

#include <IRremote.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

int RECV_PIN = 8;  // IR 수신 핀
IRrecv irrecv(RECV_PIN);  // IR 수신 객체 생성

int buzzer = 9;   // 부저 핀
int melody[] = { 262, 330, 415, 440, 494, 523, 587, 622, 659 };

LiquidCrystal_I2C lcd(0x27, 16, 2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup() {
  // Serial 모니터 초기화
  Serial.begin(9600);

  // IR 수신 시작
  irrecv.enableIRIn();

  //lcd 초기
  lcd.init();  // initialize the lcd
  lcd.backlight();

  //부저 초기화
  pinMode(buzzer, OUTPUT);
}

void loop() {
  // IR 신호가 수신되었을 때
  if (irrecv.decode()) {
    lcd.clear();//lcd창 초기

    // 수신된 IR 명령을 Serial 모니터에 출력
    long int deCode = irrecv.decodedIRData.decodedRawData;
    Serial.print(deCode, HEX);

    if(deCode == 0xF30CFF00){//1누름
      Serial.println(" / 1");
      lcd.print("Do");
      tone(buzzer, melody[0], 100);//0.1초 동안 출력
    }
    if(deCode == 0xE718FF00){//2누름
      Serial.println(" / 2");
      lcd.print("Mi");
      tone(buzzer, melody[1], 100);//0.1초 동안 출력
    }
    if(deCode == 0xA15EFF00){//3누름
      Serial.println(" / 3");
      lcd.print("Sol#");
      tone(buzzer, melody[2], 100);//0.1초 동안 출력
    }
    if(deCode == 0xF708FF00){//4누름
      Serial.println(" / 4");
      lcd.print("La");
      tone(buzzer, melody[3], 100);//0.1초 동안 출력
    }
    if(deCode == 0xE31CFF00){//5누름
      Serial.println(" / 5");
      lcd.print("Si");
      tone(buzzer, melody[4], 100);//0.1초 동안 출력
    }
    if(deCode == 0xA55AFF00){//6누름
      Serial.println(" / 6");
      lcd.print("High Do");
      tone(buzzer, melody[5], 100);//0.1초 동안 출력
    }
    if(deCode == 0xBD42FF00){//7누름
      Serial.println(" / 7");
      lcd.print("High Re");
      tone(buzzer, melody[6], 100);//0.1초 동안 출력
    }
    if(deCode == 0xAD52FF00){//8누름
      Serial.println(" / 8");
      lcd.print("High Re#");
      tone(buzzer, melody[7], 100);//0.1초 동안 출력
    }
    if(deCode == 0xB54AFF00){//9누름
      Serial.println(" / 9");
      lcd.print("High Mi");
      tone(buzzer, melody[8], 100);//0.1초 동안 출력
    }

    // 다음 신호를 받을 수 있도록 준비
    delay(100);
    noTone(buzzer);
    irrecv.resume();
  }
}

오류 해결

다른거까지는 잘 해결되는데 부저만 연결해서 출력을 하고 나면 문제가 발생했다.

라이브러리 코드 수정

부저와 IR 리모컨이 모두 타이머2 인터럽트라는 것을 사용한다고 한다.
그래서 부저를 출력하고 나면 IR리모컨 신호를 왜곡해서 받는 문제가 발생한다. IR리모컨을 타이머1 인터럽트로 수정해 해결했다.

라이브러리의 IRTimer.hpp를 수정한다.



-->

LCD 복습

LCD의 SDA, SCL을 따로 지정을 안해줬는데 A4, A5에 지정되는 이유?
-> Arduino Uno와 Nano에서는 I2C 통신이 기본적으로 아날로그 핀 A4, A5에 할당되어 있어서, Wire.h 라이브러리를 사용하면 자동으로 해당 핀을 I2C 통신에 사용함

  • SDA (데이터) = A4
  • SCL (클럭) = A5

0개의 댓글