플밍

아두이노 기초강좌 - 10. IR 센서 본문

프로그래밍/아두이노

아두이노 기초강좌 - 10. IR 센서

너구리안주 2015. 7. 24. 00:39


본 강좌는 지인의 사이트에서 허락받고 퍼온 강좌입니다.

다른곳으로 불펌하시면 곤란합니다.

그리고 제가 아두이노를 그리 잘 알지는 못합니다.

저한테 물어보시는것도 곤란.... ^^


#ads_1

IR 센서 (Infrared rays Sensor) 는 적외선 센서입니다.

적외선 리모콘을 누르면 센서가 신호를 수신하여 아두이노에 전달합니다.

 

실제로 테스트 해볼때는 원리에 대해서 자세히 알지 않아도 IRremote 라는 라이브러리를 사용하면 간단하게 해결할 수 있습니다.

 

하지만 수신이 어떻게 이루어지는 대충이라도 알고 넘어갑시다

 

적외선 신호포멧은 NEC, SONY, RC5, RC6 등 여러가지가 있으나 대표적으로 NEC(아시아 태평양 연안), RC5(유럽 등) 포멧이 주로 이용됩니다. 삼성과 LG는 NEC포멧을 사용합니다.

 

NEC 포멧은 아래와 같은 배열로 구성되어야 합니다.

  Lead code

 

 Custom code

(8bit) 

 Custom code

(8bit)

  Data code

(8bit)

Data code

(반전된 8bit)

 

 

Lead code

- 신호가 시작됨을 알립니다.

삼성 : 4.5ms HIGH, 4.5ms LOW

LG : 9ms HIGH, 4.5ms LOW

 

Custom code

- 제조사와 제품별 구분용입니다.

16bit를 통째로 이용하거나 8bit와 반전된 8bit를 이용하기도 합니다.

 

Data code

- 데이타를 표시합니다

8bit 와 반전된 8bit를 이용합니다

 

포멧의 개념은 대충 이렇게 구성되는구나라고만 이해하면 됩니다.

그럼 실습을 해봅시다.

먼저 회로구성도입니다.

 

 #ads_2

 IR 센서 이미지가 좀 흐려서 잘 안보이네요.  x모양 이미지가 수신램프이고요 그 아래로 3개의 다리가 핀으로 나와 있는 형태입니다.  왼쪽이 신호, 중간이 GND, 오른쪽이 VCC입니다. (다른 형태일 수도 있으나 보통 이렇게 구성되어 있습니다)

 

 

IR 센서들

 

 

저항은 4.7k옴,  컨덴서는 104 라고 적혀있는 걸 사용하시면 됩니다. (꼭 104가 아니어도 됩니다 하지만 volt는 맞추어 주세요)

컨덴서의 용량은 F(패러드 : 아마도 영국의 과학자 마이클 패러데이를 기념해 만든 단위인듯..)이며 104 라고 적혀있으면 앞에 두자리는 pF(피코패러드)의 수치이며 마지막 자리 4는 승수입니다.  즉, 100000pF = 100nF(나노패러드) 입니다.

 

※ 1F = 1000mF(밀리 패러드) = 1000000μF(마이크로 패러드) = 1000000000nF(나노 패러드) = 1000000000000pF(피코 패러드)

 

여기서 컨덴서는 신호를 안정적으로 만들어 주는 역할을 합니다.  컨덴서를 빼도 신호가 수신되기는 하지만 보다 안정적인 신호를 원할때 사용합니다.

 

※ 컨덴서의 종류는 여러가지가 있으나 대표적으로 전해컨덴서와 세라믹컨덴서가 있습니다.

세라믹컨덴서의 경우는 극성(+, -)이 없어서 아무렇게나 꽂아도 상관없지만 전해컨덴서의 경우에는 극성에 주의하셔야 합니다.  반대로 꽂았을 경우 녹거나 폭발할 위험이 있으니 반드시 확인하고 사용하길 당부드립니다.

세라믹컨덴서는 비교적 적은 용량에 주로 사용하고 대용량은 전해컨덴서를 사용합니다.

 

 

 

 

다음으로 IR 라이브러리인 IRremote 를 다운로드 해야 합니다

아래 링크를 클릭하고 다운로드 후에 라이브러리 폴더에 압축을 해제합니다.

 

https://github.com/shirriff/Arduino-IRremote/archive/master.zip 

 

제 경우엔 라이브러리 폴더가 아래와 같은 위치네요

 

c:\Users\Administrator\Documents\Arduino\libraries\ 

 

이제 스케치를 열어서 코딩을 합니다.

 

 

#include <IRremote.h>

#include <IRremoteInt.h> 

 

IRrecv irrecv(A5);           //IRrecv 객체를 만듭니다 (아날로그 5번핀으로 수신)

decode_results result;     //수신받은 데이타를 저장할 구조체를 만듭니다 

 

void setup(){

Serial.begin(9600);

irrecv.enableIRIn();    //수신을 시작합니다

irrecv.blink13(true);    //수신받았을 경우 아두이노 13번핀을 깜빡입니다

 

void loop(){

if(!irrecv.decode(&result)) return;    //수신받은게 없으면 아래를 수행하지 않습니다. 

 

if(result.decode_type == SAMSUNG){  //삼성리모콘이면

Serial.println("Samsung");

}else if(result.decode_type == LG){   //LG리모콘이면

Serial.println("LG");

}else{                                           //기타 NEC, SONY, RC5 등을 쓴다면 else if 로 추가해주세요

 

Serial.println("기타");   

}

 

Serial.print("데이타: ");

Serial.println(result.value, HEX);   //받은 데이타를 16진수로 표시합니다

Serial.print("길이: ");

Serial.println(result.bits, DEC);   //데이타의 길이를 10진수로 표시합니다.

delay(10);

irrecv.resume();   // 다시 수신할 수 있도록 합니다

} 

 

 

 

 

길게 설명할게 없이 주석만 봐도 이해가 되실거라 생각합니다.

여기서 주의할건 처리를 완료하고 반드시 resume()을 해주셔야 계속 수신이 가능하다는 겁니다.

 

이제 업로드 해보시고 시리얼 모니터를 여신다음 리모콘을 눌러보세요

시리얼 모니터에 해당 제품명과 데이타가 찍혀 나올겁니다.

 

참고로 적외선 리모콘이기 때문에 햇볕이 들어오는 환경이거나 아주 밝은 장소에서는 수신감도가 떨어집니다.

 

이제 이렇게 나온 값들에 따라 led를 켜고 끈다든지 RC자동차의 바퀴를 움직인다든지 하는 동작을 나름 구현하면 되겠습니다.

 

#ads_3

Comments