본문으로 바로가기

1. IR 센서의 반사광으로 흑백 구분하기

 

 

 

 

 

 

 

2. 바닥면의 IR 센서로 바닥의 밝기 측정하기

 

 

 

[참고] Jellibi AGV는 반사광이 많을수록 analogRead() 함수로 읽히는 값이 더 작도록 회로가 구성되어 있습니다.

 

 

 

 

3. 전면의 중앙 IR 센서로 거리 측정하기 응용 실습

 

 

 

 

 

[주의] IR 센서로 정확한 거리를 측정하기 힘듭니다.

 
반사하는 벽이나 종이의 재질과 흑백 색상에 따라서 측정값이 많이 달라질 수 있습니다.

 

 

4. 디버깅(Debugging) 실습 : 소스 코드에서 문제점 찾아 수정하기 (오류가 포함된 소스 코드)

 

u디버깅(Debugging) 이란?

    컴퓨터 프로그램이나 하드웨어 장치에서 잘못된 부분, 즉 버그(오류)를 찾아서

    수정하거나 회피하는 처리과정이다.


   
흔히 프로그램의 오류를 찾아 수정하는 작업을 할 때 디버깅한다고 표현한다.

 
  • u아두이노 코딩 시 흔히 사용하는 디버깅 방법
  • 시리얼 모니터에 모니터링할 값을 출력하여 확인
  • LCD/OLED 등에 모니터링할 값을 출력하여 확인
  • LED, BUZZER 소리, 모터 회전 등의 출력으로 확인

 

  • 버깅 실습 예제 소스

    오른쪽 코드는 직전의 실습 코드와 같이 전면의 IR 센서로 거리를 측정하는 코드입니다.

    하지만, 여기서는 디버깅 실습을 위해 의도적으로 2군데 오류를 추가했습니다.

    업로드하여 실행했을 때 시리얼 모니터에 거리 측정값이 잘 나오도록 수정하세요!

 

 

 

예상되는 오류를 수정하고 실행하여 측정 값을 시리얼 모니터로 확인하면서 (만약 오류가 더 있다면 이를 수정하고 다시 실행하여 결과를 확인하면서

디버깅을 해보세요!

 

 

5. 소스 코드에서 문제점 찾아 수정하기 (소스 수정 및 해설)

 

 

 

  • 오류가 있는 소스에서는 IR 센서의 값을 읽기 위해 digitalRead() 함수를 사용하고 있으므로,
    센서를 읽은 value1 값은 0 또는 1 이 됩니다.
  • if 구문에서 if( value1 < 1000 )인 경우가 먼저 검사되므로, 두 번째 비교 검사인 else if( value1 < 950 ) 부분은 아예
    실행이 되지 않습니다.

[ 거리 측정이 잘 되도록 수정된 소스 코드 ]

 

 

 

  • IR 센서의 값을 읽을 때는 analogRead() 함수를 사용해야 합니다. ( 반환 값 :  0 ~ 1023 )

 

  • if 구문에서 if( value1 < 950 )인 경우를 먼저 검사하고, 그 다음에 else if( value1 < 1000 ) 인 경우를 검사해야
    값에 따라 두 조건이 모두 검사됩니다.

 

 

다음은 전면의 모든 센서의 데이터를 cm로 대략 변환하는 프로그램입니다. 소스 코드를 작성 후 테스트해 보시기 바랍니다.

 

//////////////  IR센서 (바닥면 2개 + 전면 3개)

#define pinLT1  A6  // 1번(왼쪽) IR센서 연결 핀
#define pinLT2  A7  // 2번(오른쪽) IR센서 연결 핀

#define pinLT3  A0  // 전면 왼쪽 IR센서
#define pinLT4  A1  // 전면 중앙 IR센서
#define pinLT5  A2  // 전면 오른쪽 IR센서

////////////////////  메인 프로그램 (setup & loop)

void setup() {
  Serial.begin( 9600 ); // 시리얼 통신 (bps)
}

void printDistance(int value)
{
  if( value < 300 )
    Serial.print( ", 0.5 Cm 이내" );
  else if( value < 700 )
    Serial.print( ", 1 Cm 이내" );
  else if( value < 850 )
    Serial.print( ", 2 Cm 이내" );
  else if( value < 950 )
    Serial.print( ", 5 Cm 이내" );
  else if( value < 1000 )
    Serial.print( ", 10 Cm 이내" );
  else
    Serial.print( ", 멀거나 없음" );
}

void loop() {
  int left_value = analogRead( pinLT3 );  // 왼쪽 IR센서 값 읽기
  int center_value = analogRead( pinLT4 );  // 가운데 IR센서 값 읽기
  int right_value = analogRead( pinLT5 );  // 오른쪽 IR센서 값 읽기

  Serial.print( "왼쪽 IR값= " ); // IR센서로 반사되는 값을 읽음
  Serial.print( left_value );    // 색상이나 반사면 상태에 의존
  printDistance(left_value);

  Serial.print( "가운데 IR값= " ); // IR센서로 반사되는 값을 읽음
  Serial.print( center_value );    // 색상이나 반사면 상태에 의존
  printDistance(center_value);
  
  Serial.print( "오른쪽운데 IR값= " ); // IR센서로 반사되는 값을 읽음
  Serial.print( right_value );    // 색상이나 반사면 상태에 의존
  printDistance(right_value);

  Serial.println();
  delay( 1000 );
}
728x90
728x90