[아두이노 공부] 8. 적외선(IR)센서 사용해보기 - 원하는 적외선 송신
공부/아두이노, 전자·전기

[아두이노 공부] 8. 적외선(IR)센서 사용해보기 - 원하는 적외선 송신

안녕하세요.

시험이 끝나서 돌아왔습니다.

 

오늘은 원하는 적외선을 송신해볼거에요.

 

저는 처음에 송신기가 잘 작동하지 않아서, 고생했는데,

같은 상황 겪으실 분들을 위해 그 과정을 포함해서 글을 쓸게요.

 

1. 회로도


 

 

송신기의 오른쪽 남는 핀 하나는 없는 것으로 생각해주세요.

송신기, 수신기 모두 왼쪽부터 GND, VCC, DATA 핀입니다!

 

수신기는 상관 없으나, 송신기는 pwm 핀에 꽂아주셔야합니다.

 

저는 송신기는 3번, 수신기는 10번에 꽂아주었습니다.

 

 

2. 적외선 값 수신 및 송신 코드


 

 

[아두이노 공부] 적외선(IR) 센서 사용해보기 - 2. 적외선 수신값 확인

안녕하세요. 기계과감성쟁이입니다. 오늘은 적외선 수신모듈을 활용한 적외선 수신값 확인을 공부했어요. 회로도 아두이노 회로도 그리는 프로그램 좋은 거 어디 없나... 무료로...... 전과 같이,

senti-mech.tistory.com

 

이전에 쓴 글처럼, 수신기를 이용해 리모컨 신호를 분석했습니다.

 

스피커 리모컨

사실 저번에 사용한 TV 리모컨으로 TV를 껐다 켜보려 했는데,

송신기의 신호가 약해서 그런지 작동을 하지 않았어요.

 

그래서 대체했습니다..ㅎㅎ

 

이 리모컨 전원버튼은 '1EE1F40B'의 신호를 가지고 있었고, 저는 코드에 삽입했습니다.

#include <IRremote.h>

int Recv_pin = 10; // 수신기는 10번 핀
int Send_pin = 3;
IRrecv irrecv(Recv_pin); //IRrecv 객체 생성
decode_results results; // 수신 데이터 저장 구조체

void setup()
{
  Serial.begin(9600);
  Serial.println("Start");
  IrReceiver.begin(Recv_pin, ENABLE_LED_FEEDBACK); // 수신기 작동 시작
  IrSender.begin(Send_pin, ENABLE_LED_FEEDBACK); // 송신기 작동 시작
}

void loop() {
  for (int i = 0; i < 3; i++) { 
   IrSender.sendNECMSB(0x1EE1F40B,32);
   delay(40); // 해당 신호 3번 반복, 
  }
if (irrecv.decode(&results)) {
  Serial.println(results.value, HEX); // 수신한 적외선 값 디코딩하여 16진수로 출력
  Serial.println(results.decode_type); // 적외선 타입 출력
  irrecv.resume();
}
  delay(1000);
}

수신기와 송신기를 합쳤습니다.

추가한 것은 Serial.println(results.decode_type) 입니다.

 

프로토콜 방식을 출력하라는 뜻이죠.

 

이와 같이 7이 나왔고,

무슨 뜻인고 하니,

 

출처 : https://learn.adafruit.com/using-an-infrared-library/hardware-needed

위에서 확인하니 NECX 라는 값이 나왔는데, NEC로 사용하면 될 것 같았습니다.

솔직히 이 부분은 잘 모르겠습니다. 어떤 숫자가 어떤 프로토콜을 의미하는지 말입니다.

 

다만, NEC가 일반적으로 많이 사용하는 적외선 프로토콜이며

어떤 회사들은 (삼성, LG 등등) 조금씩 달라서, 다른 타입으로 출력해주어야 합니다.

 

 

 

3. 결과


 

잘 되네요!

 

이걸 이용해서, 리모컨을 만들 수 있는데,

아직 부품들이 없어서 만들지를 못하겠군요...ㅎㅎ 바로 주문하도록 하겠습니다.

 

사용법은 여기서 끝입니다.

이 뒤는 고난의 행군을 기록했으니, 관심 있으신 분들만 봐주세요 ㄴ(ㅇ0ㅇ)ㄱ

 

4. 시간이 오래 걸렸던 이유


1.

 

구글에 '아두이노 적외선 송신'이라고 검색하면,

제일 흔히 나오는 코드가 있습니다.

#include <IRremote.h>

IRsend irsend;

void setup()
{
  Serial.begin(9600);
}

void loop() {
    irsend.sendNEC(0xFAA36BCD, 32);
    delay(40);
}

대략 이런 식의

irsend.sendNEC (송신값, 비트수) 를 이용한 코드입니다.

 

이렇게 간단히 코드를 쓸 수 있는 것은,

irsend 라는 모듈에서 출력핀을 정해놓았기 때문입니다.

(아두이노 우노 보드는 3번 핀)

 

물론 저는 안됐습니다.

이걸로 몇시간을 찾아다녔죠.

 

가장 큰 후회는,

'정품 살 껄...' 뭘 해도 호환보드라서 안되는 것 같은 찝찝함;;

 

 

2.

 

가장 먼저 가능성을 발견했던 것은 예제였습니다.

SimpleSender 예제를 이용하니, 송신기가 작동합니다.

 

그래서, 저는 코드를 분석하기 시작합니다.

 

그리고 빨간 색 부분에 주목하죠.

저건 raw 데이터로 출력하라는 말입니다. 

 

출처 : https://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol

적외선은 이런 식으로 0과 1로 정보를 만들어 출력하고,

이 Content 들을 부르는 명칭이 Address와 Command 이기 때문이죠.

 

(정보 : 저기서 Inverse 신호를 보내는 이유는 신호를 올바르게 보냈는지 재차 확인하기 위함입니다.)

 

그럼 내 송신기가 디코딩 된 신호가 아닌, raw data 만을 보낼 수 있는 것인가?

아쉬웠습니다. 그러면 코드가 너무 보기 싫어지고, 분석하는 것도 힘듭니다.

 

 

 

3.

 

저는 위 코드에서 동그라미 친 두 부분만 기존 코드에 붙여 넣어서

작동해보았으나, 달라지는게 없었습니다.

 

그럼 raw 데이터의 문제가 아닙니다.

 

그래서 기존 코드와 다른 것들을 하나씩 넣었다가, 안되면 빼보고...를 반복하던 와중에

 

 

이 코드를 넣는 순간 송신기에 불이 들어왔습니다.

이 후로는 모든 과정에 문제가 없었죠.

 

그래서 구글링을 해보니...

 

 

IRremote.h updated, old code not working, need help!

Hi, I was using the IRremote.h library made by Ken Shirrif for a college project where I was simply sending an IR signal every 0.5 seconds and decoding it on the other side. There have apparently been some updates to the library recently and the code I was

forum.arduino.cc

 

다음과 같은 글이 나옵니다.

IRremote 라이브러리가 업데이트 된 후, 이전 코드가 작동하지 않는다는 글이었고,

 

이전 코드는 저의 코드와 유사했습니다.

 

답글에는 Readme.txt 좀 읽으라는 말들... 그리고 작성자는 반성하였는지

코드를 고쳤다며 바뀐 코드를 적었는데,

 

IrSender.begin(IR_SEND_PIN, ENABLE_LED_FEEDBACK)

이 들어있던 겁니다.

 

저도 반성 좀 해보겠다며 (애초에 읽어보기도 했지만 놓쳤나싶어)

 

 

Arduino-IRremote/Arduino-IRremote

Infrared remote library for Arduino: send and receive infrared signals with multiple protocols - Arduino-IRremote/Arduino-IRremote

github.com

 

에 들어가 Readme.txt 를 읽었는데

 

제가 못찾는 것인지 수신기에 관련된 내용만 있고,

송신기는 제대로 적혀있지 않았습니다 ㅠㅠ...

 

 

버전이 업데이트 되며

PWM이 SW적으로 구현되면서 특정 핀 (앞서 말한 3번 핀처럼)을 사용할 필요가 없다는 말과 함께

Recv에 관한 내용만... 있었어요...

 

하지만 누군가는 이 파일을 읽고 코드를 바르게 고쳤고

저는 못했던 것이죠. 제가 부족한 탓입니다.

 

물론, 이 외에도 sendNEC가 sendNECMSB 로 바뀌는 등 여러 변경점이 있으니

한번씩 읽어보시는 것을 추천합니다.

 

인터넷엔 예전 코드들이 많더라구요.

 

5. 마치며...


시험기간 끝나자마자 보드를 손에 잡았는데

시작하자마자 머리를 싸맸네요.

 

하지만 고생한 만큼 궁금했던 적외선 구조도 알게되고

Readme 를 똑바로 읽자는 교훈도 함께 얻었습니다. 하하;;;

 

더 열심히 살아야겠습니다. 그럼 20000!