여러 개의 초음파 거리센서 사용하기 (HC-SR04)

 

아래의 HC-SR04는 초음파 거리 센서 중 하나로 

초음파를 발사하여 반사되어 오는 반사 신호를 받을 때까지의 시간을 확인하여 거리를 측정하는 센서 입니다. 

소리의 속도인 340m/s를 이용하여 거리를 측정합니다. 

e3818860ddeb941dc9cbdf4ec1e1226f_1539239
HC-SR04 제품 스펙  


 

 

HC-SR04는 4개의 핀이 있습니다.


1) Vcc : 전원을 공급받습니다

2) Trig :  초음파를 발신합니다

3) Echo : 초음파를 수신합니다

4) Gnd : 접지의 역할을 합니다

 

 

초음파를 이용한 거리측정의 원리는 다음과 같습니다. 

 

1) Trig에서 초음파를 만들어 발신을 합니다. 

2) 어떠한 물체에 닿게 되었을때 초음파는 다시 팅겨서 돌아오고, 

3) 그 초음파를 Echo에서 수신합니다. 

4) 이 때의 걸린 시간을 이용하여 거리를 측정합니다.

 

거리 = 속력×시간 이라는 공식을 이용합니다.

 

그림으로 표현하면 다음과 같습니다. 

 

e3818860ddeb941dc9cbdf4ec1e1226f_1539240

 



 

 


1. 한 개의 초음파 거리센서 사용법


e3818860ddeb941dc9cbdf4ec1e1226f_1539240


아두이노 소스코드

 //초음파 센서의 핀번호를 설정한다.

int echoPin = 12;

int trigPin = 13;

 

void setup() {

Serial.begin(9600);

// trig를 출력모드로 설정, echo를 입력모드로 설정

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

}

 

void loop() {

 

// 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.

    digitalWrite(trig, LOW);

    digitalWrite(echo, LOW);

    delayMicroseconds(2);

    digitalWrite(trig, HIGH);

    delayMicroseconds(10);

    digitalWrite(trig, LOW);

 

// echoPin 이 HIGH를 유지한 시간을 저장 한다.

    unsigned long duration = pulseIn(echoPin, HIGH); 

// HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.

float distance = ((float)(340 * duration) / 10000) / 2;  

Serial.print(distance);

Serial.println("cm");

// 수정한 값을 출력

delay(500);

}




2. 여러 개의 초음파 거리센서를 사용하는 법



한 개의 초음파 거리센서를 사용하는 방법과 마찬가지로, 여러 개로 확장할 수 있지만

문제는 Trig와 Echo 핀을 사용해야하기 때문에 디지털핀 2개씩 추가로 필요하다는 점입니다. 

이러한 문제를 해결하기 위해서 NewPing이라는 라이브러리를 사용할 수 있고, 

초음파 거리센서 하나당 하나씩 디지털핀을 사용할 수 있습니다.

 

e3818860ddeb941dc9cbdf4ec1e1226f_1539240

 

라이브러리는 다음의 링크에서 다운로드 받을 수 있습니다. 

http://mechasolution.com/shop/board/view.php?id=sourcecode&no=119 


라이브러리를 다운로드 받은 후에, 

아두이노에서 스케치-라이브러리 포함하기-.ZIP 라이브러리 추가를 이용하여 라이브러리를 추가합니다. 

위와 같이 하드웨어 연결을 한 후에는 다음의 소스코드를 업로드해서 사용해봅니다. 

 

 

 

아두이노 소스코드

 #include <NewPing.h>

 

// trigger and echo pins for each sensor

#define SONAR1 2

#define SONAR2 3

#define SONAR3 4

#define MAX_DISTANCE 1000 // maximum distance for sensors

#define NUM_SONAR 3 // number of sonar sensors

 

NewPing sonar[NUM_SONAR] = { // array of sonar sensor objects

  NewPing(SONAR1, SONAR1, MAX_DISTANCE),

  NewPing(SONAR2, SONAR2, MAX_DISTANCE),

  NewPing(SONAR3, SONAR3, MAX_DISTANCE)

};

 

int distance[NUM_SONAR]; // array stores distances for each

                         // sensor in cm

 

void setup() {

  Serial.begin(9600);

}

 

void loop() {

  delay(50);

  updateSonar(); // update the distance array

  // print all distances

  Serial.print("Sonar 1: ");

  Serial.print(distance[0]);

  Serial.print("  Sonar 2: ");

  Serial.print(distance[1]);

  Serial.print("  Sonar 3: ");

  Serial.println(distance[2]);

}

 

// takes a new reading from each sensor and updates the

// distance array

void updateSonar() {

  for (int i = 0; i < NUM_SONAR; i++) {

    distance[i] = sonar[i].ping_cm(); // update distance

    // sonar sensors return 0 if no obstacle is detected

    // change distance to max value if no obstacle is detected

    if (distance[i] == 0)

      distance[i] = MAX_DISTANCE;

  }

}

메카리워즈 Image Map


모바일 버전으로 보기