반응형

【 아두이노 센서#26】 IR 적외선 센서 거리 LED 레벨바 만들기

 지난 시간 적외선(IR) 센서인 GP2Y0A41SK의 기본 사용법에 대해 알아 보았다. 이번 시간에는 거리에 따른 LED 레벨바를 만들어 보려 한다.  과거 LED Latch 회로를 다루어 보았는데 IR 센서와 연결하면 간단히 구현가능하다. 


▶ 선수 학습 :

1. (센서)#9 시프트 레지스터 이해하기 1 (Latch 회로이해1 강좌보기클릭  2(센서)#10 나이트라이더 만들어보기 (Latch 회로이해2)   강좌보기클릭  
3(센서)#25 IR적외선 센서 다루기     (IR 센서 기초)     강좌보기클릭  


▶ IR 센서 사양 및 동작 특성


▶ 실습 목표 :  

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

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

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

4. 시프트 레지스터 기능(74HC595) IC를 이용하여 거리에 따라 LED가 켜지도록 레벨바 형태를 구현 할 수 있다.


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



▶ 실습 절차  : 


1.    위 회로 연결도를 참고하여 부품들을 연결한다
2.    앞선 실습 자료를 참고하여 IR센서로 부터 측정되는 값을 확인 한다음, LED 레벨이 반응하기 원하는 수치값(거리)의 최소값과 최대값을 정한다.(maxVal값  , minVal 값)
3.    프로그램을 동작시켜보고 maxVal값과 minVal값을 조절해 본다.

4.   가까울 수록 LED레벨이 켜지는 것을 멀수록 LED레벨이 켜지도록 프로그램을 수정해본다. 

▶ 프로그램 코드 및 설명 : 

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

const int SER=8;   // 시프트 레지스터로 데이터를 입력하는 8번 핀 SER 상수 정의

const int LATCH=9;  //LATCH LATCH 상수 정의

const int CLK= 10;  //CLOCK CLK 상수 정의

const int DIST=0; //아날로그 입력 0번 핀에 연결된 IR 센서의 장애물 거리값

 //LED 거리값 패턴을 저장한 vals 배열 정의

int vals[9]={0,1,3,7,15,31,63,127,255};

int maxVal=600; //IR 센서의 장애물 거리 최대값

int minVal=260;   //IR 센서의 장애물 거리 최소값

//###  IR 센서의 최대, 최소값은 실제 측정해보고 원하는 값으로 수정 필요


void setup( ) {

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

  pinMode(SER, OUTPUT);

  pinMode(LATCH, OUTPUT);

  pinMode(CLK, OUTPUT);

}


void loop( ) {

  int distance=analogRead(DIST);  //IR 센서에서 장애물 거리값을 읽음

  Serial.println(distance);          // 시리얼 모니터로 IR값을 확인해 본다

  distance=map(distance, minVal, maxVal, 0, 8);

  distance=constrain(distance,0,8); //거리값 범위 조정

  digitalWrite(LATCH,LOW);  //LATCHLOW 입력

  shiftOut(SER, CLK, MSBFIRST, vals[distance]); //거리값에 맞는 데이터전송

  digitalWrite(LATCH, HIGH);  // 거리에 따라 LED가 켜지도록 High 입력함

  delay(10);     // 센서가 장애물을 감지하는 시간 간격 지정

}


▶ 실행영상 :  

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


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

Latch_IR_Sensor.ino


반응형
반응형

【 아두이노 센서#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


반응형