newPing 라이브러리로 초음파센서 제어(아두이노)

in #kr-arduino6 years ago

newPing 라이브러리로 초음파센서 제어(아두이노)



이제까지 초음파센서를 이용하여 거리를 구하기 위해서 직접 공식에 대입하여 코딩을 했었습니다. 직접 코딩하는 것이 불편하신 분들을 위해 newPing이라는 라이브러리를 소개할까 합니다. newPing이라는 라이브러리를 통해서 초음파센서를 쉽게 제어하여 원하는 거리측정 값을 얻을 수 있습니다. newPing 라이브러리를 이야기하기전에 우선 초음파센서 거리측정에 대해서 복습해야겠죠.

초음파센서 거리를 구하는 공식은 다음과 같습니다.

duration = 초음파 센서를 통해 읽은 거리 시간값
distance = ((float)(340 * duration) / 10000) / 2;

위 공식은 복습차원으로 봐주세요. duration을 구하는 코딩 로직은 참고 자료 post를 한번 읽고 와주세요.

여기까지 복습이 완료 된 상태라면 newPing 라이브러리로 실제 실험을 해봅시다.

1. 초음파센서 회로도



공개회로도는 3핀 초음파센서로 직접 측정 로직을 코딩하고 직접 측정한 시간값을 거리를 구하는 공식에 대입하여 구한 예제입니다. 실제 실험에서는 4pin으로 구성된 초음파 센서를 실험하기 때문에 회로도를 표현하면 아래 회로도와 같습니다.

2. newPing 라이브러리 설치


라이브러리 매너저 창에서 "newPing"이라고 검색하시면 자동으로 검색되고 해당 라이브러리를 설치하시면 됩니다.

3. 코딩



NewPing

#include <NewPing.h>
  • NewPing sonar(TrigPin, EchoPin, MaxDistance) : TrigPin과 EchoPin과 최대제한거리(MaxDistance)의 값을 선언합니다.
  • sonar.ping_cm() : 센서 거리를 'cm'로 계산된 값을 출력한다.
  • 다수의 초음파센서 사용 :
NewPing sonar[센서수] = { 
  NewPing(trigPin1, echoPin1, 최대제한거리1), 
  NewPing(trigPin2, echoPin2, 최대제한거리2), 
    ...
};
  • 다수의 초음파센서 접근 :
  • sonar[0].ping_cm() : 0번째 sonar에서 측정된 거리를 'cm'로 계산된 값을 출력한다.

그외 함수는 newPing 라이브러리가 링크된 아두이노 공식 사이트에 가시면 함수들에 대해 자세히 설명되어 있으니깐 가셔서 한번 읽어 주시기 바랍니다.

[소스] : NewPingExample 소스(출처: newPing 라이브러리 예제)

#include <NewPing.h>

//sonar(TrigPin, EchoPin, MaxDistance);
NewPing sonar(2, 3, 200);

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay(50);          
  Serial.print("Ping : ");
  Serial.print(sonar.ping_cm());
  Serial.println("cm");
}

sonar.ping_cm() 함수를 통해서 초음파 센서의 거리를 'cm'로 출력된 값을 시리얼모니터로 출력하는 코딩입니다. 딱 한줄입니다. sonar.ping_cm() 함수 이 한줄의 명령을 실험하는 내용입니다. 그걸 시리얼모니터에 출력하기 위해서 3줄의 시리얼 출력문을 코딩했을 뿐 실제 초음파센서를 제어하는 명령은 딱 한줄입니다.

void loop() {
 delay(50);          
 sonar.ping_cm();
}

이렇게 0.05초 간격으로 초음파센서는 거리측정 값을 'cm'을 반환합니다. 어렵지 않죠.

라이브러리를 이용하면 이 함수 한개로 복잡하게 코딩을 생각하지 않고 거리를 'cm'로 만들 수 있지만 직접 거리를 계산하는 공식 코딩은 단순하기 때문에 구지 라이브러리를 사용 안해도 됩니다.

그런데, 왜! 라이브러리를 사용하는지 궁금하실 꺼에요. 거리 측정하는 거리 공식도 별로 어렵지 않은데 그냥 코딩하면 되지 라이브러리를 사용할 필요가 있냐고 생각하실 꺼에요. 그 이유는 초음파 센서를 한개 사용할 때는 상관 없는데 다중 초음파센서를 사용할 때 newPing 라이브러리 사용하면 효율적으로 코딩을 할 수 있습니다. 표현도 배열로 간단히 하나의 묶음으로 표현 할 수 있고, 여러개를 측정하려면 시간 관련한 문제도 고려해서 코딩해야 하는데 라이브러리를 사용하면 좀 더 정교하게 코딩이 가능하기 때문에 사용합니다. 위에 링크 된 아두이노 공식 홈페이지에서 소개하는 newPing 라이브러리 관련 내용을 보시면 15개 초음파센서를 한번에 제어하는 예제가 있는데 가셔서 살펴 봐주세요. 물론 라이브러리를 설치하면 아두이노 IDE에 예제로 나와 있어 설치하고 나서 예제를 열어보시고 어떻게 코딩되어 있는지 살펴보셔도 됩니다.

3. 결과


4. 2개 초음파 센서 사용


이제 2개의 초음파를 한번에 측정하여 그 결과를 출력해 보는 실험을 해보겠습니다.

1) 2개 초음파 센서 회로도


  • 준비물 : 초음파센서 2개, 아두이노우노
  • 내용 : 왼쪽 초음파센서는 tragPin 2, echoPin 3 에 연결하고, 오른쪽 초음파센서는 tragPin 4, echoPin 5 에 연결하시오.

2) 코딩


배열로 초음파센서 객체를 선언합니다.

NewPing sonar[2] = { 
  NewPing(2, 3, 200), 
  NewPing(4, 5, 200), 
};

이렇게 선언하시면 초음파센서 측정은 sonar[0].ping_cm(), sonar[1].ping_cm() 함수로 해서 2개의 초음파 센서의 거리를 측정하여 'cm'로 출력하게 됩니다. 초음파 센서들 간의 시간 딜레이는 0.05 초로 간격을 두어 측정하게 됩니다. 너무 빠르게 두개의 초음파센서의 값이 시리얼모니터로 출력되기 때문에 딜레이를 loop()함수 안에 마지막 라인에 0.5초의 딜레이를 줌으로서 좀 천천히 2개의 초음파센서 값이 시리얼모니터로 출력되게 코딩했네요.

코딩은 따로 설명할 필요 없이 방금 앞에서 코딩한 소스에서 한번 더 초음파센서 sonar[위치].ping_cm()함수로 출력하는 명령만 추가한 것 뿐이니 구지 설명하지 않겠습니다.

[소스]

#include <NewPing.h>

//sonar(TrigPin, EchoPin, MaxDistance);
NewPing sonar[2] = { 
  NewPing(2, 3, 200), 
  NewPing(4, 5, 200), 
};

void setup() {
  Serial.begin(9600);
}

void loop() {
  delay(50);          
  Serial.print("A Ping : ");
  Serial.print(sonar[0].ping_cm());
  Serial.println("cm");
  
  delay(50);          
  Serial.print("B Ping : ");
  Serial.print(sonar[1].ping_cm());
  Serial.println("cm");

  delay(500);
}

3) 결과


위 사진을 보시면 A초음파센서와 B초음파센서로 나뉩니다. 여기서, B초음파센서는 Servo Motor에 테이프로 감겨 있고 Servo Motor 같이 아두이노 RC카에 테이프로 부착되어 있어서 어쩔 수 없이 RC카에 부착된 B초음파센서랑 A초음파센서를 실험하다 보니깐 보시는 것처럼 좀 불편하게 실험 되었습니다. 감안하시고 동영상을 보시기 바랍니다.

마무리


오늘 post는 초음파센서를 직접 코딩하는 방법도 있지만 이렇게 라이브러리를 이용하여 쉽게 코딩할 수 있는 것을 보여드리기 위해서 다뤘습니다. 그리고, 왜! 갑자기 초음파센서를 이 시점에 다시 post를 했냐면 아두이노 RC카에서 거리측정을 통해 장애물을 감지하는데 사용하기 위해서 사전 학습으로 거론하게 되었네요. 직접적으로, 측정 로직을 코딩하는 것도 좋지만 새로운 것을 소개하는 것이 좋을 것 같아서 초음파센서에 대한 post를 하면서 newPing에 대해 이야기 하면 좋을 것 같아 이렇게 이야기를 하게 되었네요.

오늘 이야기한 post를 보기전 사전학습으로 직접 거리를 측정하는 방법에 대한 링크된 post 글을 찾아가셔서 복습을 한 뒤에 newPing을 사용해 보셨으면 합니다.

Sort:  

아 이게 라이브러리가 있군요. 쓸 줄 알면 매번 안 만들어도 되겠습니다.

직접 코딩을 하나의 함수로 만들어 놓고 계속 복사해서 쓰면 되기 때문에 라이브러리를 구지 안써도 되지만 newPing은 좀 더 정교하게 제어할 수 있게 구성되어 있어서 newPing 라이브러리가 좋아 보이더군요. 우선 다중 초음파센서를 다룰 때 특화 된 것 같아요.

아 또 newPing이 그런 장점이 있군요. 저는 아두이노로 초음파 센서 다룰 때 생각보다 오차가 너무 큰 것 같아서 이걸 과연 실제로 쓸 수 있을까 그런 생각이 들더라구요. 비싼 센서는 다를 수도 있을 것 같은데, 제꺼는 기본 아두이노 세트 센서라서요. 제가 못 다뤄서 저만 그렇게 느낀건지 ㅋㅋ

그 오차는 초음파센서 자체 부품에 따라 달라요.
공식 : distance = ((float)(340 * duration) / 10000) / 2;
인데요 340이라는 수치가 초음파센서 4핀짜리 실험에 사용한 부품의 사양이에요.
부품마다 이 수치가 다르거든요. 그래서 오차가 발생하고요.
참고로 아두이노 자체의 노이즈 전류값도 있기 때문에 몇차례 측정해보고 30cm 자같은걸로 그 오차율 거리를 보정하셔야 해요.
백프로 무조건 읽은 값이 거리다라고 생각하시면 안돼요.

아, 부품 자체에 스펙이 있군요. 노이즈 전류값도 영향을 줄 줄이야. 전기 속도가 거의 빛의 속도랑 5~6배 정도 밖에 차이 안 난다고 들어서 별 영향 없을 줄 알았는데... 그렇군요. 아, 하긴 직접 측정하면서 해보면 제일 정확하겠네요.

원래 초음파센서 뿐 아니라 모든 부품이 정확하게 원하는 값이 출력되지 않습니다. 근사값을 출력하고 그 값을 기반으로 보정작업을 하시면 원하는 결과를 얻게 되는데 어쩔 수 없는 부분인 것 같아요.^^

좋은 정보감사합니다
^^^^뿅뿅

감사합니다.

@resteemator is a new bot casting votes for its followers. Follow @resteemator and vote this comment to increase your chance to be voted in the future!

짱짱맨 호출에 출동했습니다!!

짱짱맨 방문에 감사합니다.

Coin Marketplace

STEEM 0.30
TRX 0.12
JST 0.034
BTC 64058.80
ETH 3150.15
USDT 1.00
SBD 3.99