티스토리 뷰

http://openmaker.tistory.com/48


먼저 위의 글에서 체험단 활동을 하며, IR신호 해킹하는 방법에 대한 포스팅을 하였습니다.



하지만, 체험단과 별도로 자유롭게 작성하는 것이 좋아보여 추가로 작성합니다.






적외선 통신 (Infrared Ray Communication)



먼저, IR통신에 대해 알아보면 말그대로 적외선 통신입니다.

라인트레이서나 근거리 무선 통신에서 많이 사용되는 것이죠.

모든 것들이 그런지는 알 수 없지만, 우리가 주로 사용하는 무선 마우스의 경우 IR통신을 사용한다고 합니다.


그리고 무엇보다 우리가 확실히 알고 있는 리모컨의 경우 IR신호로 통신을 합니다.


이 포스팅도 가정에서 볼 수 있는 이러한 리모컨들의 신호를 알아보고 별도로 제어해볼 수 있게 하려는 것이 목적입니다.



우선, IR통신에 대해 간단히 알아보아야 하는데 저는 솔직히 지금도 제대로 모릅니다.

IR자체는 빛에서 나오는 전자기파라고 알려져 있죠. 저도 딱 이정도만 알고 있습니다.

더 좋은 자료는 역시나 사전이나 위키죠.

http://terms.naver.com/entry.nhn?docId=1139197&cid=40942&categoryId=32238

https://en.wikipedia.org/wiki/Infrared


적외선 통신은 이러한 전자기파를 이용한 통신을 일컫습니다. 

간단한 특징을 나열해보자면,


1. 근거리 통신

2. 파장이 길기 때문에 공기 중 입자를 원활히 통과한다.

3. 주파수는 38Khz


위 내용들은 아래 링크에 자세히 설명되어 있으니 참조하시길 바랍니다.

http://navercast.naver.com/contents.nhn?rid=122&contents_id=7247


몇 가지 특징만 잘 이해해두고 다음으로 넘어가도록 하겠습니다.






IR 수신기를 활용한, IR 신호 해킹 - 회로 구성



IR수신기니 뭐니 했지만... 이 마저도 쉽게 생각되진 않습니다.

그러기 위해서 아두이노로 쉽게 해보는 것이겠죠?


IR 수신기는 여러가지가 있습니다만 저는 아래의 수신기를 사용했습니다.



VS1838B 라는 IR Receiver 모듈인데, 데이터시트는 아래 링크에 있습니다.

http://www.centralmedia.fr/download/vs1838b.pdf

추가적으로, 아래는 arduino kit사용시 레퍼런스로 만들어놓은 문서인거 같은데 회로를 잘 모를 때는 이러한 문서를 추가 참조하는 것도 좋습니다.

http://arduino-kit.ru/userfiles/image/VS1838B_INFRARED_RECEIVER_MODULE.pdf


데이터시트에서는 VCC와 OUT 사이에 20k 이상의 저항을 다는 레퍼런스 회로를 보여주고 있지만,

아래 아두이노 키트관련 링크에서는 10k 저항을 사용하였네요.


사실 이 내용은 회로적인 문제라서, 필요에 따라 정확한 계산을 적용하여 사용해야 합니다.

하지만 IR처럼 순간적인 신호의 경우에는 어느정도 오차는 중요하지 않으므로 보통 10k와 같은 저항을 간단히 달아 사용한다고 합니다.

아두이노 키트 문서에서 나오는 내용도 이러한 측면에서 적용한 내용이니 아래와 같은 회로를 적용하시면 되겠습니다.


 






IRremote library, 소스코드



회로를 구성했으니 아두이노에 소스코드를 업로드 해야겠죠?

하나부터 열까지 다 작성하려면 IR에 대한 제대로 된 이해와 함께 시작을 해야할 겁니다...

하지만 오픈소스 시대에서 굳이 하나부터 열까지 코딩하는 건 그렇게 바람직해보이지 않습니다.

그것도 아두이노 플랫폼에서요!


해서, 아래의 라이브러리를 추가하고 그 안에 있는 예제를 활용해 볼 것입니다.

https://github.com/z3t0/Arduino-IRremote


라이브러리 매니저에서 "IRremote"라고 검색하시면 위와 동일한 라이브러리가 존재할 겁니다.

그럼 추가해주시면 되겠죠 :)

라이브러리 매니저에서도 추가할 수 있지만, 현재 GitHub의 최신버전이 적용되고 있지 않습니다.

따라서, https://github.com/z3t0/Arduino-IRremote 링크에서 직접 다운받아 [내문서] - [arduino] - [library] 폴더에 압축을 풀어 추가해주시면 되겠습니다. 혹은 라이브러리 매니저로 추가한 뒤에, 생성된 폴더에 덮어쓰기 해주세요.


추가가 되었다면, IRremote에서 제공하는 기본예제중에,

"IRrecvDumpV2" 라는 예제가 있을 거에요. 이걸 열어주도록 합니다.

위 회로에 맞추어서 Pin번호만 수정한 코드를 아래에 첨부하겠습니다. 









LG에어컨 리모컨 IR신호 확인하기



위의 소스를 아두이노에 업로드 합니다. 

그리고, 시리얼 모니터를 열고 나서 집에 있는 IR리모컨을 수신기에 가져다 대고 눌러보도록 하겠습니다.


제 집에는 아래와 같은 소형 LG에어컨 리모컨이 있어서, 이걸로 테스트 해보겠습니다.



눌렀더니 아래와 같은 시리얼 메시지가 나왔습니다.


우선 Encoding에 LG라고 나오네요. IR통신의 프로토콜(약속)은 제조사마다 상이하기 때문에 인코딩 방식을 통해 제조사 혹은 프로토콜 방식을 확인할 수 있습니다예를 들어 삼성 TV 리모컨을 사용하시면 SAMSUNG 이라고 나옵니다.

다음은 Code에 Hex값이 보이네요. 28bit로 되어있다고 하는데, IR통신마다 비트수는 상이합니다. 일다 LG는 28비트는 사용하는구나. 라고 넘어가면 되겠죠. 이 코드는 바로 다음에 살펴볼 기나긴 값들을 "정해진 비트수로 표현한 값" 이라는 것만 기억해 두세요.
다음만 이해하면 됩니다. 0x8800909 이라는 코드는 "냉방" "바람약함" "상하바랑" "24도" "예약없음" 의 데이터가 포함된 코드라는 것을요 :)

Timing이라고 되어 있는 RAW데이터들이 보입니다. 이 RAW데이터 어딘가에는 에어컨 세팅에 대한 데이터들이 들어 있습니다.
이걸 알고 싶으면 분석을 해야겠죠? 제조사에서 프로토콜을 알려주지 않는 이상은요!
여기서는 간단히 저 값들이 대략 어떠한 것을 의미하는지... 호기심을 가지실 분들을 위해 살포시 언급만 하고 넘어가겠습니다.
일단 이 Raw데이터는 IR 신호를 표현한 것이라고 생각하시면 됩니다.
각각의 숫자는 시간입니다. 양수(+)는 HIGH상태의 시간, 음수(-)는 LOW상태의 시간이죠.
정확히 표현하자면, 양수(+)는 PWM이 Off 되어 있는 시간이며, 음수(-)는 PWM이 On되어 있는 시간입니다.
( 회로 구성이 기본 풀업이기 때문에 평상시에 HIGH신호를 유지합니다 )

보시면 규칙이 보이실거에요. 처음 시작할 때의 대기 HIGH시간과 LOW시간은 깁니다.
그리고 그 다음부터는 HIGH시간은 대체로 비슷하며, LOW시간이 조금씩 다르죠.
HIGH시간은 신호 구분을 위한 것이며, LOW시간이 짧고 긴것을 판단하여 논리적 0, 1을 판단합니다.

물론 이러한 내용이 모든 IR통신 방식에서 통한다는 것은 아닐겁니다. 
아래 링크의 문서만 보더라도 그 코딩방식이 상이한 것을 볼 수 있습니다.

하지만 여기서 우리가 사용하는 것들의 방식은 위에서 설명 드린바와 같습니다.
참조할만한 링크로 아래 링크를 드립니다.

http://www.brainlinksystem.com/all-about-ir-signals

https://learn.adafruit.com/ir-sensor/ir-remote-signals


좀 더 직관적이고, 시각적인 자료를 원하신 분들은 아래 링크를 꼭 참조해보세요 :)

https://qph.ec.quoracdn.net/main-qimg-31a7693890951a448ab8c4b0ead192fe?convert_to_webp=true

https://www.quora.com/How-do-an-IR-transmitter-and-receiver-work


간단히 정리해 보면,


1. Start 신호가 존재한다.

2. PWM신호의 길이차로 논리적 1과 0을 구분한다 (이렇게 되면 디지털 언어를 표현할 수 있겠죠?)

3. 수신측에서는 이러한 신호를 받아 논리적 값으로 변환하고 이를 통해 명령을 수행한다.



그리고, 아래의 경우는 인코딩이 UNKOWN이라고, 알수없다고 하고 있죠?

물론 이 예제에 등록되지 않은 내용들은 전부 UNKNOWN으로 나옵니다.

하지만, 저처럼 LG라는게 명확히 나오는 경우가 있는 상황에서의 UNKNOWN은 문제가 있는 것이겠죠?

이러한 것들은 확인을 해주어야 합니다.



이러한 IR통신의 특징이 일상생활에서 아래와 같은 상황을 맞이하게 해줍니다.

즉, 우리가 간혹 리모컨을 누르는데 기기가 안먹는 경우가 있죠. 리모컨 화면은 혼자 꺼지구요...

이러한 경우가 위와 같은 현상으로 인한 것임을 알 수가 있습니다. IR 신호가 에어컨의 리시버에 제대로 전달되지 못한 것이죠!

그러니 적절한 근거리와 각도를 잘 맞추어 주어야 제대로 된 통신을 할 수 있겠죠?







활용 방안



집에 있는 리모컨의 IR신호를 확인해본들 사용하지 않으면 실용적인 의미는 없겠죠?

이제 이것을 토대로 원격지에서 클라우드 서비스나 자신만의 서버를 통해 에어컨을 제어할 수 있는 것을 해보려고 합니다.


더운 여름에 집에 들어가기 10분 전이라도 에어컨을 미리 틀어 놓을 수 있었으면..... 하는 생각 해보셨나요?

그를 위한 간단한 IoT 장비를 아두이노를 통해 쉽게 만들 수 있습니다. 그러니 아두이노를 사용하는거죠 :)

개발자가 아닌 사람들도 최대한 낮은 장벽으로, 자신만의 홈 오토메이션을 만들어보는 거죠!


우선, 자신만의 서버를 구축하거나 하는 행위들은 다소 여러가지 작업들이 수반되므로, 상용 서비스를 이용해 쉽게 만들어보고자 합니다.

다만 상용 서비스인만큼, 사용자가 커스터마이징 하는 것에는 제한이 따르겠죠?


그럼 다음 포스트에서 뵙도록 하겠습니다.



댓글
댓글쓰기 폼