반응형

【 아두이노 센서#25】 IR 적외선 센서 다루기 ( GP2Y0A41SK )


 대표적인 적외선(IR) 센서인 GP2Y0A41SK를 알아보고 거리값을 시리얼 모니터를 통해 출력해보고자 한다. 


▶ IR 센서 사양 및 동작 특성

위 그래프는 목적물과의 거리에 따른 출력 신호와의 관계 그래프이다.

거리가 4Cm에서 부터 최고치의 출력을 보여주고 있으며, 거리가 멀수록 신호의 출력값은 그래프 처럼 낮아 진다. 또한 목표물의 색이 회색일(어두운색) 경우 반사율이 18%로 낮지만 흰색일수록(가까울 수록) 반사율이 90%로 높다는 것을 알 수 있다.  


▶ 실습 목표 :  

1. IR 센서의 작동 방식에 대해 이해할 수 있다.

2. 센서로 부터 얻어 지는 아날로그 값을 디지털값 및 전압값으로 바꾸어 거리값으로 환산할 수 있다.

3. 얻어진 거리값을 시리얼 모니터와 LED로 표시할 수 있다. 


▶ 실습 회로도면 1 (기본회로):
  (이미지 클릭하면 확대 가능)


▶ 실습 1  : 


1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    DC센서의 아날로그 출력 값에 A/D변환(아날로그를 디지털로)을 위한 값인 '5/1024' 를 곱해준다.(디지털화 된 전압값이 된다) 

3.    디지털 전압값이 나오면 아래 식에 삽입하여 거리값을 구한다.
 (※ 거리값 : 13 x pow(volts, -1)  )

4.   물체와의 거리가 30cm 이하일 때만 시리얼 모니터로 출력 하도록 하다.

▶ 실습1. 프로그램 코드 및 설명 : 

/* 적외선 센서 (IR sensor) 프로그램       */
/*  by RASIno , http://rasino.tistory.com  */

 // 물체와의 거리가 30cm 이하 일 때만 시리얼 모니터로 거리값을 표시하라


#define sensor A0   //  IR 센서의 입력 포트 정의



void setup( )  {

  Serial.begin(9600); //  시리얼 통신 시작

}


void loop( ) {



Serial.print("1.sensor:");  

    Serial.println(analogRead(sensor));  

// A/D 값 변환을 위한 5/1024(분해능)을 곱해준다

    float volts = analogRead(sensor) * 0.0048828125; 


    Serial.print("2.volts:");  

    Serial.println(volts);  

    int distance = 13 * pow(volts, -1); // pow(x,y):x의 y승

    Serial.print("3.distance:");  

    Serial.println(distance);  


  delay(1000);         // 응답시간을 고려하여 시간지연 한다

  if (distance <= 30) {

    Serial.println(distance); 

  } 


}


▶ 실습1. 실행영상 :  

(전체화면 보기로 보세요)



▶ 아두이노 파일(실습1. 다운) :

IR_distance.ino



▶ 실습 회로도면 2 (확장회로):
  (이미지 클릭하면 확대 가능)

 ※ 센서의 선구분은 색깔로 구분하기 쉽다. LED는 기본적으로 저항을 달아주어야 하나, 장시간이 아닌 간단히 테스트 하는 용도로 사용할 때는 그냥 연결하여도 크게 문제가 되지 않는다. 


▶ 실습 2  : 


1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    센서값이 500이상 일때 LED를 끄도록 하고, 40~500 사이 값일 때 아두이노 포트로 출력 조절 가능한 값인 255~0 사이 값으로 맵핑 처리 한다. map(sensor, 40, 500, 255, 0);

3.    LED를 통해 이를 확인하도록 한다. 


▶ 실습2. 프로그램 코드 및 설명 : 

/* 적외선 센서 (IR sensor) 프로그램       */
/*  by RASIno , http://rasino.tistory.com  */

 // 물체와의 거리가 30cm 이하 일 때만 시리얼 모니터로 거리값을 표시하라


const int sensorPin = A0;

const int ledPin = 12;

int sensor = 0;

int value = 0;


void setup( )  {

  Serial.begin(9600);     //  시리얼 통신 시작

  pinMode(ledPin, OUTPUT);

}


void loop( ) {

  sensor = analogRead(sensorPin);

  if (sensor != value) {

    Serial.println(sensor);

 

    value = sensor;

    if (sensor < 40) return;

    if (sensor > 500) {

      digitalWrite(ledPin, LOW);

    } else {

      sensor = map(sensor, 40, 500, 255, 0);

      analogWrite(ledPin, sensor);

    }

  }

  delay(500);

}


▶ 아두이노 파일(실습2. 다운) :

02_IR_LED02.ino


반응형