[아두이노] newPing 라이브러리로 초음파센서 제어
[아두이노] newPing 라이브러리로 초음파센서 제어
- 온라인 가상시뮬레이터 : https://www.tinkercad.com
- 참고 : [아두이노] 초음파센서 제어
- 복습 공개회로도 : https://www.tinkercad.com/things/b4Em7hTXe8j (3핀초음파센서)
이제까지 초음파센서를 이용하여 거리를 구하기 위해서 직접 공식에 대입하여 코딩을 했었습니다. 직접 코딩하는 것이 불편하신 분들을 위해 newPing이라는 라이브러리를 소개할까 합니다. newPing이라는 라이브러리를 통해서 초음파센서를 쉽게 제어하여 원하는 거리측정 값을 얻을 수 있습니다. newPing 라이브러리를 이야기하기전에 우선 초음파센서 거리측정에 대해서 복습해야겠죠.
초음파센서 거리를 구하는 공식은 다음과 같습니다.
duration = 초음파 센서를 통해 읽은 거리 시간값
distance = ((float)(340 * duration) / 10000) / 2;
위 공식은 복습차원으로 봐주세요. duration을 구하는 코딩 로직은 참고 자료 post를 한번 읽고 와주세요.
여기까지 복습이 완료 된 상태라면 newPing 라이브러리로 실제 실험을 해봅시다.
1. 초음파센서 회로도
- 준비물 : 초음파센서 1개, 아두이노우노
- 내용 : tragPin 2, echoPin 3 에 연결하시오.
- 공개회로도 : https://www.tinkercad.com/things/b4Em7hTXe8j
공개회로도는 3핀 초음파센서로 직접 측정 로직을 코딩하고 직접 측정한 시간값을 거리를 구하는 공식에 대입하여 구한 예제입니다. 실제 실험에서는 4pin으로 구성된 초음파 센서를 실험하기 때문에 회로도를 표현하면 아래 회로도와 같습니다.
2. newPing 라이브러리 설치
라이브러리 매너저 창에서 "newPing"이라고 검색하시면 자동으로 검색되고 해당 라이브러리를 설치하시면 됩니다.
3. 코딩
- newPing 라이브러리 출처 :https://playground.arduino.cc/Code/NewPing (Tim Eckel)
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을 사용해 보셨으면 합니다.
'IOT > 아두이노' 카테고리의 다른 글
[아두이노] 초음파센서 아두이노 RC카 장애물 감지 방법 (0) | 2019.05.27 |
---|---|
[아두이노] 초음파센서 아두이노 RC카 자율주행 준비 입문자용 (0) | 2019.05.26 |
[아두이노] 2륜 RC카 원리를 가상시뮬레이터로 실험 (0) | 2019.05.24 |
[아두이노] 아두이노 RC카를 조정하는 다양한 코딩 접근법 (0) | 2019.05.23 |
[아두이노] 2륜 RC카 Bluetooth를 통해 스마트폰(무선) 조정하기 (0) | 2019.05.22 |