본문 바로가기
프로그래밍/아두이노

아두이노 초음파 센서 HC-SR04 오류? 불량?

by YongRa 2024. 5. 13.

안녕하세요! 오늘은 아두이노로 초음파 센서 사용 중 발생한 일에 대해 적어보려 합니다. 초음파를 활용한 자율주행 자동차를 만들기 위해 테스트 중이였는데, 원래는 측정한 거리만 출력되어야 하는데 중간중간 0이 출력이 되고 측정 간격이 1초정도 되는 일이 생겼습니다.

초음파 센서 측정 결과

이렇게 되면 앞에 거리를 측정해 장애물이 있으면 자동차를 멈추게하기 어렵습니다. 일단 여러가지 가정을 한번 해보도록 하겠습니다.

 

1. 코드의 오타 또는 사용한 함수의 문제

2. IDE의 버전 문제

3. 초음파 센서의 문제

4. 아두이노 보드의 문제

 

보드는 가장 마지막으로 테스트를 진행하고 우선 3가지를 확인해보도록 하겠습니다.

 

1. 코드의 오타 또는 사용한 함수의 문제

 // Ultrasonic HC-SR04

 const int trigPin = 13;
 const int echoPin = 12;
 long duration;
 long distance;
 
 void setup() {
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  Serial.begin(9600); 
 }
 
 void loop() {
  digitalWrite(trigPin, LOW); // Clears the trigPin
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH); //travel time us
  distance= duration*0.034/2;
  delay(0.001);
  Serial.print(distance); // 교재 오타 수정
  Serial.println("     cm");
 }

코드의 오타를 확인하기 위해 IDE의 '확인' 기능을 사용하고 몇번이고 코드를 다시 읽어보았습니다. 코드에 문제가 있다면 거리 측정이 정상적으로 안되지 않을까 생각하고 2번째로 넘어가도록 하겠습니다.

 

2. IDE 버전 문제

제가 쓰고 있는 버전은 1.8.19 Legacy 버전을 사용하고 있습니다. 최근에는 2.3 버전도 나왔는데 프로그램 실행 시 켜지는데 시간이 걸려 예전에 쓰던 버전을 사용하는 중입니다. Legacy 버전은.. 사실 예전에 나왔던 버전이라 이게 원인일리가 없을거 같지만.. 한번 테스트를 해보도록 하겠습니다. 사용한 코드는 기존것과 다른 코드를 사용해 테스트 해보도록 하겠습니다.

2.3 버전으로 진행한 테스트 결과

2.3 버전으로 새로운 코드를 사용해도 0이 계속해서 출력이 되고 있습니다. 사용한 코드는 도매키트 아두몰의 블로그에 있는 코드를 사용하였습니다. 참고한 블로그에서는 delay에 1000값을 주어 1초 간격으로 측정하게 했습니다. 제가 가지고 있는 초음파 센서 또한 1초 간격으로 측정을 하게 되면 정상적인 값이 출력하긴 하지만 원하는 방식은 아닙니다.

 

3. 초음파 센서 문제

회사에 여러 초음파가 있는데 PCB(?) 색도 다르고 글자 프린팅 되어 있는것도 제각각입니다. 그래서 여러 개를 테스트 해보도록 하겠습니다.

여러 가지 초음파 센서

여러 개의 초음파를 테스트 하던 중 하나의 초음파 센서만이 정상(?)적인 결과를 보였습니다. 여기서 말하는 정상적이다라는 것은 위의 이미지 처럼 중간에 0이 나오지 않는 것을 말합니다. 가장 첫번째로 사용한 코드를 이용해 테스트 한 결과 첫번째 줄 마지막에 있는 초음파 센서를 제외하고 다 중간에 0이 출력되었습니다.

(좌) 중간에 0 출력 (우) 정상적인 출력

초음파 센서를 여러개 테스트 하는 과정 중에 2번째 IDE가 문제일 경우일 때 참고한 코드가 생각났습니다. delay(1000)이 있었었는데, 이 delay를 10으로 줄여보았습니다. 아래 코드처럼 말이죠.

 

 // Ultrasonic HC-SR04

 const int trigPin = 13;
 const int echoPin = 12;
 long duration;
 long distance;
 
 void setup() {
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT); 
  Serial.begin(9600); 
 }
 
 void loop() {
  digitalWrite(trigPin, LOW); // Clears the trigPin
  delayMicroseconds(5);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH); //travel time us
  distance= duration*0.034/2;
  delay(10); // delay 추가
  Serial.print(distance); // 교재 오타 수정
  Serial.println("     cm");
 }

0이 중간에 출력되던 초음파 센서에 delay를 추가한 결과

기존에 0이 출력되던 초음파 센서 였는데 delay(10)을 추가했더니 연속적인 값을 출력하게 되었습니다. 물론 잘 되던것은 당연히 잘 나오고 있습니다. 예전에 사용하던 초음파 센서들은 delay가 필요없었습니다. 제가 참고했던 책도 마찬가지로요. 그런데 최근에 구매한 초음파 센서는 delay 없이는 연속적인 값을 얻어내지 못하고 있네요. 뭐가 문제일까요?


결론은 일단 delay(10);을 추가하면 연속적인 값을 얻을 수 있다!