안녕하세요.
시험이 끝나서 돌아왔습니다.
오늘은 원하는 적외선을 송신해볼거에요.
저는 처음에 송신기가 잘 작동하지 않아서, 고생했는데,
같은 상황 겪으실 분들을 위해 그 과정을 포함해서 글을 쓸게요.
1. 회로도
송신기의 오른쪽 남는 핀 하나는 없는 것으로 생각해주세요.
송신기, 수신기 모두 왼쪽부터 GND, VCC, DATA 핀입니다!
수신기는 상관 없으나, 송신기는 pwm 핀에 꽂아주셔야합니다.
저는 송신기는 3번, 수신기는 10번에 꽂아주었습니다.
2. 적외선 값 수신 및 송신 코드
이전에 쓴 글처럼, 수신기를 이용해 리모컨 신호를 분석했습니다.
사실 저번에 사용한 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이 나왔고,
무슨 뜻인고 하니,
위에서 확인하니 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 데이터로 출력하라는 말입니다.
적외선은 이런 식으로 0과 1로 정보를 만들어 출력하고,
이 Content 들을 부르는 명칭이 Address와 Command 이기 때문이죠.
(정보 : 저기서 Inverse 신호를 보내는 이유는 신호를 올바르게 보냈는지 재차 확인하기 위함입니다.)
그럼 내 송신기가 디코딩 된 신호가 아닌, raw data 만을 보낼 수 있는 것인가?
아쉬웠습니다. 그러면 코드가 너무 보기 싫어지고, 분석하는 것도 힘듭니다.
3.
저는 위 코드에서 동그라미 친 두 부분만 기존 코드에 붙여 넣어서
작동해보았으나, 달라지는게 없었습니다.
그럼 raw 데이터의 문제가 아닙니다.
그래서 기존 코드와 다른 것들을 하나씩 넣었다가, 안되면 빼보고...를 반복하던 와중에
이 코드를 넣는 순간 송신기에 불이 들어왔습니다.
이 후로는 모든 과정에 문제가 없었죠.
그래서 구글링을 해보니...
다음과 같은 글이 나옵니다.
IRremote 라이브러리가 업데이트 된 후, 이전 코드가 작동하지 않는다는 글이었고,
이전 코드는 저의 코드와 유사했습니다.
답글에는 Readme.txt 좀 읽으라는 말들... 그리고 작성자는 반성하였는지
코드를 고쳤다며 바뀐 코드를 적었는데,
IrSender.begin(IR_SEND_PIN, ENABLE_LED_FEEDBACK)
이 들어있던 겁니다.
저도 반성 좀 해보겠다며 (애초에 읽어보기도 했지만 놓쳤나싶어)
에 들어가 Readme.txt 를 읽었는데
제가 못찾는 것인지 수신기에 관련된 내용만 있고,
송신기는 제대로 적혀있지 않았습니다 ㅠㅠ...
버전이 업데이트 되며
PWM이 SW적으로 구현되면서 특정 핀 (앞서 말한 3번 핀처럼)을 사용할 필요가 없다는 말과 함께
Recv에 관한 내용만... 있었어요...
하지만 누군가는 이 파일을 읽고 코드를 바르게 고쳤고
저는 못했던 것이죠. 제가 부족한 탓입니다.
물론, 이 외에도 sendNEC가 sendNECMSB 로 바뀌는 등 여러 변경점이 있으니
한번씩 읽어보시는 것을 추천합니다.
인터넷엔 예전 코드들이 많더라구요.
5. 마치며...
시험기간 끝나자마자 보드를 손에 잡았는데
시작하자마자 머리를 싸맸네요.
하지만 고생한 만큼 궁금했던 적외선 구조도 알게되고
Readme 를 똑바로 읽자는 교훈도 함께 얻었습니다. 하하;;;
더 열심히 살아야겠습니다. 그럼 20000!