Back Ground

아두이노 - 적 외선 센서 본문

아두이노

아두이노 - 적 외선 센서

Back 2016. 6. 21. 14:49


1.적외선 센서 사용하기


적외선은 우리 생활에서 각종 리모컨, 열감지, 온도측정, 야간카메라 등의 많은 분야에 쓰인다.

아두이노에서는 적외선 센서를 활용하여 감지되는 적외선 신호를 판별 할 수 있다.

간단하게 TV리모컨의 원리와 같다고 보면 된다.

적외선 센서는 KSM603LM 라는 센서를 이용한다.

적외선 수광부

KSM603LM


앞면을 볼 때 좌측부터 OUT, GND, VCC 단자이다. 핀의 길이가 모두 똑같기 때문에 연결에 유의해야 한다.

적외선 수신을 위해서 IRremote라는 라이브러리가 필요하다https://github.com/z3t0/Arduino-IRremote

 에서 관련 라이브러리를 다운받아보자.


이 IRremote 라이브러리를 사용하기 위해서 아두이노가 설치된 폴더의

“libraries \”폴더에 압축을 풀어 설치하면 된다.




간단하게 라이브러리에 나와있는 적외선 리시브 데모를 실행시켜보자.




TV 리모컨이나, 핸드폰에 리모컨 앱을 실행시키고,테스팅해보자.





스케치


#include <IRremote.h>

int input_pin = 11; //입력핀의 설정

IRrecv irrecv(input_pin); //IRrecv 객체생성

decode_results signals;  //수신 데이터 저장 구조체

 

void setup()

{

    Serial.begin(9600);   //시리얼모니터

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

}

 

void loop() {

  

//수신되는 내용이 있을 경우만 시리얼모니터에 표시함  

if (irrecv.decode(&signals)) {

  

        //수신 데이터를 16진수로 표시

        Serial.println(signals.value, HEX);

        

        //수신 데이터의 길이를 10진수로 표시

        Serial.println(signals.bits, DEC);

        

        //다음 신호를 받을 수 있도록 한다

        irrecv.resume();

        

    }

    

}



2.적외선 센서에 수신되는 값에 따라 LED램프를 켜기

참고할것!

http://www.electroschematics.com/9522/arduino-control-leds-ir-remote/




스케치

/*

source: www.electroschematics.com

You'll need to change the led pins and the codes

accordingly to your configuration and IR remote

*/

#include <IRremote.h>

int RECV_PIN = 3; // the pin where you connect the output pin of TSOP4838

int led1 = 2;

int led2 = 4;

int led3 = 7;

int itsONled[] = {0,0,0,0};

/* the initial state of LEDs is OFF (zero)

the first zero must remain zero but you can

16.change the others to 1's if you want a certain

led to light when the board is powered */

#define code1 63495 // code received from button A

#define code2 30855 // code received from button B

#define code3 22695 // code received from button C

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()

{

Serial.begin(9600); // you can comment this line

irrecv.enableIRIn(); // Start the receiver

pinMode(led1, OUTPUT);

pinMode(led2, OUTPUT);

pinMode(led3, OUTPUT);

}

void loop() {

if (irrecv.decode(&results)) {

unsigned int value = results.value;

switch(value) {

case code1:

if(itsONled[1] == 1) { // if first led is on then

digitalWrite(led1, LOW); // turn it off when button is pressed

itsONled[1] = 0; // and set its state as off

} else { // else if first led is off

digitalWrite(led1, HIGH); // turn it on when the button is pressed

itsONled[1] = 1; // and set its state as on

}

break;

case code2:

if(itsONled[2] == 1) {

digitalWrite(led2, LOW);

itsONled[2] = 0;

} else {

digitalWrite(led2, HIGH);

itsONled[2] = 1;

}

break;

case code3:

if(itsONled[3] == 1) {

digitalWrite(led3, LOW);

itsONled[3] = 0;

} else {

digitalWrite(led3, HIGH);

itsONled[3] = 1;

}

break;

}

Serial.println(value); // you can comment this line

irrecv.resume(); // Receive the next value

}

}



3.적외선 수신기로 리모컨 수신하기


적외선 송수신은 우리 일상생활에서 아주 많이 사용되고 있는 무선 제어 방식이다.

적외선 통신은 950nM 파장의 적외선은 햇빛이나 전등, 형광등 등에도 적외선이 포함되어 있기

때문에 외부의 영향을 줄이기 위해서 캐리어 주파수(Carrier Frequency, 통신 신호를 전송하

는 주파수)를 사용하여 전달하는 방식이다. 적외선 통신을 수신하기 위해서는 이 캐리어 주파수를 필터링하여 약한 신호를 증폭하는 과정을 거쳐야 한다. 참고로 우리가 자주 사용하는 삼성이나 LG의 리모컨은 주파수가 38KHz이다.

이번 예제는 38KHz 주파수를 수신할 수 있는 적외선 수신기(CH0B나 KSM603LM)를 사용하여

LED를 제어하는 예제이다.

우리는 37.9KHz를 수신할 수 있는 KSM603LM을 사용할 것이다.

KSM603LM에는 단자가 3개 있는데 돌출한 부분을 앞으로 하여 왼쪽부터 수신(Echo), GND,

Vcc 연결 핀으로 구성되어 있다.리모컨의 신호를 수신하는 예제를 만들어보자!









스케치


// IRremote 라이브러리 코드를 스케치에 추가한다.

#include <IRremote.h>

#define NEC 1 // 이전의 삼성 리모컨이 여기에 속한다.

#define SONY 2

#define RC5 3

#define RC6 4

#define DISH 5

#define SHARP 6

#define PANASONNIC 7

#define JVC 8

#define MITSUBISHI 10

#define UNKNOWN -1

// 소니 리모컨

#define SONY_NUM3 265116 // 3번

#define SONY_NUM6 658332 // 6번

#define SOSY_NUM9 68508 // 9번

// NEC 리모컨

#define NEC_NUM3 312787007

#define NEC_NUM5 312778847

#define NEC_NUM7 312795167

// 삼성 LCD TV 리모컨- 타입 11

#define SAM_NUM0 3772811383

#define SAM_NUM2 3772817503

#define SAM_NUM5 3772813423

#define SAM_NUM8 3772821583

// 적외선 수신기가 연결되어 있는 디지털 핀 9번 정의

const int RECEIVE_PIN = 9;

// RGB LED 출력 핀 정의

int redPin5 = 5;

int greenPin6 = 6;

int bluePin7 = 7;

// IRrecv 객체를 생성한다.

IRrecv irrecv(RECEIVE_PIN);

// IR 감지기의 결과를 저장한다.

decode_results decodeSignal;

// 적외선 수신이 완료되면 LED에 신호를 보낼 디지털 핀 3번 지정

int ledPin3 = 3;

void setup() {

// 시리얼 통신포트 초기화

Serial.begin(9600);

/* 시리얼 포트가 준비되었는지 검사한다.

* 시리얼 포트가 준비되지 않았다면 무한 대기한다.

**/

while(!Serial) {

;

}

// LED 출력 핀 정의

pinMode(ledPin3, OUTPUT);

pinMode(redPin5, OUTPUT);

pinMode(greenPin6, OUTPUT);

pinMode(bluePin7, OUTPUT);

/* 초기 시작시 R, B, B색상의 LED가 모두 꺼진 상태로 시작한다.

* 우리가 사용하는 RGB LED는 공통 애노드 방식으로 R, G, B 단자를 GND에

* 연결하므로 각 단자에 0을 출력하면 최대 밝기가 되고 255를 출력하면

* 최소 밝기가 된다.

**/

digitalWrite(redPin5, HIGH);

digitalWrite(greenPin6, HIGH);

digitalWrite(bluePin7, HIGH);

// 적외선 수신기 오브젝트 시작한다.

irrecv.enableIRIn();

}

// LED 상태 초기화

boolean lightState = false;

/* 마지막 IR 메시지의 수신 시간을 저장한다.

* unsigned long millis(void) 함수는 아두이노가 제공하는 시간 함수로

* 스케치 프로그램이 시작된 이후의 경과 시간을 밀리초 단위로 반환한다.

* 약 50일이 경과하면 오버플로우(Overflow)로 인해 다시 0이 된다.

**/

unsigned long last = millis();

void loop() {

if(irrecv.decode(&decodeSignal)) {

// 마지막 메시지 이후 1/4초가 경과되었는지 체크한다.

if(millis() - last > 250) {

// LED 상태를 토글 시킨다.

lightState = !lightState;

// 리모컨 입력 값과 리모컨 타입을 시리얼 모니터에 출력한다.

long inputNum = decodeSignal.value;

Serial.print("리모컨 입력 값 : ");

Serial.print(inputNum, HEX);

Serial.print(", 십진수 : ");

Serial.println(inputNum, DEC);

Serial.print("리모컨 타입 : " );

Serial.println(decodeSignal.decode_type);

digitalWrite(ledPin3, lightState);

delay(300);

lightState = !lightState;

digitalWrite(ledPin3, lightState);

delay(300);

// 2번 키가 입력되었으면 RGB LED 빨간색 켜기

if(inputNum == SAM_NUM2) {

digitalWrite(redPin5, LOW);

digitalWrite(greenPin6, HIGH);

digitalWrite(bluePin7, HIGH);

// 5번 키가 입력되었으면 RGB LED 초록색 켜기

} else if(inputNum == SAM_NUM5) {

digitalWrite(redPin5, HIGH);

digitalWrite(greenPin6, LOW);

digitalWrite(bluePin7, HIGH);

// 8번 키가 입력되었으면 RGB LED 파란색 켜기

} else if(inputNum == SAM_NUM8) {

digitalWrite(redPin5, HIGH);

digitalWrite(greenPin6, HIGH);

digitalWrite(bluePin7, LOW);

// 0번 키가 입력되었으면 RGB LED 모두 끄기

} else if(inputNum == SAM_NUM0) {

digitalWrite(redPin5, HIGH);

digitalWrite(greenPin6, HIGH);

digitalWrite(bluePin7, HIGH);

}

}

// 마지막 IR 메시지 수신 시간을 갱신한다.

last = millis();

// 다른 메시지를 기다린다.

irrecv.resume();

}

}



'아두이노' 카테고리의 다른 글

아두이노 - 트위터에 글씨 올리기  (0) 2016.06.22
아두이노 - 이더넷쉴드  (2) 2016.06.21
아두이노 - 온도센서  (0) 2016.06.21
아두이노 - 온습도센서  (0) 2016.06.21
아두이노 - 7 세그먼트 사용하기  (0) 2016.06.21
Comments