1. 초음파 센서?
음파를 쏘아서 반향되어 수집되는 음파까지의 시간차로 거리를 계산해 내는데 사용되는 센서입니다. 음속이 340m/s 정도 되니까 센서를 통해 응답이 오는 시간만 알면 초음파 센서 앞에 있는 사물까지의 거리를 잴 수 있습니다.
측정거리 : 2cm ~ 5m, 측정각도 : 15', 측정 해상도 : 3mm
2. 연결방법
초음파 센서를 보시면 4개의 핀이 있습니다. VCC, Trig, Echo, GND 입니다. 아두이노에 다음과 같이 연결합니다.
초음파 센서 | 아두이노 |
VCC | 5V |
Trig | D2 |
Echo | D3 |
GND | GND |
3. 동작방법
아두이노에서 Trig(트리거) 핀으로 HIGH를 입력하면 초음파 모듈에서 40KHz 음파를 발사합니다.(10us 이상 HIGH 유지를 권장) 이때부터 Echo 핀은 High 상태가 되고, 음파가 되돌아와 수신되면 echo 핀이 다시 Low 상태가 됩니다. 이 간격에서 거리를 구하고 다시 2로 나누면 됩니다. (왕복이므로)
음파속도가 340m/s 이고 1cm 가는데 29us 가 걸립니다. 거리를 구하는 공식은
Distance = time / 29 / 2;
4. 코드 (스케치)
void setup()
void loop()
digitalWrite(2,HIGH); // 센서에 Trig 신호 입력
duration = pulseIn(3,HIGH); // Echo pin: HIGH->Low 간격을 측정
Serial.print(cm);
delay(300); // 0.3초 대기 후 다시 측정
long microsecondsToInches(long microseconds)
long microsecondsToCentimeters(long microseconds) |
예제에 사용된 스케치는 아래에서 받으세요.메뉴 > 도구 > 시리얼 모니터 : 실행하셔서 측정된 거리 확인해보세요.
31 thoughts on “초음파 센서로 거리재기 예제”
박연용
(2014년 5월 21일 - 2:43 오후)귀한 자료 잘 모았습니다.
덕분에 센서로 거리의 값을 찾는데까지 성공을해서 기쁘기 그지 없습니다.
궁금한 점이 하나 생겼는데, 만약 2개 이상의 센서를 하나의 아듀이노에서 작동을 시킬 경우에는 코드를 어떻게 해야하는지 궁금합니다.
TORTUGA
(2014년 5월 22일 - 10:07 오전)테스트 해보지는 않았는데 아마도 아래처럼 될 것입니다.
void setup()
{
Serial.begin(9600);
pinMode(2,OUTPUT); // 센서 Trig 핀
pinMode(3,INPUT); // 센서 Echo 핀
pinMode(4,OUTPUT); // 센서2 Trig 핀
pinMode(5,INPUT); // 센서2 Echo 핀
}
void loop()
{
long duration, cm;
long duration2, cm2;
//—– 센서 1
digitalWrite(2,HIGH); // 센서에 Trig 신호 입력
delayMicroseconds(10); // 10us 정도 유지
digitalWrite(2,LOW); // Trig 신호 off
duration = pulseIn(3,HIGH); // Echo pin: HIGH->Low 간격을 측정
cm = microsecondsToCentimeters(duration); // 거리(cm)로 변환
//—– 센서 2
digitalWrite(3,HIGH); // 센서에 Trig 신호 입력
delayMicroseconds(10); // 10us 정도 유지
digitalWrite(3,LOW); // Trig 신호 off
duration2 = pulseIn(4,HIGH); // Echo pin: HIGH->Low 간격을 측정
cm2 = microsecondsToCentimeters(duration2); // 거리(cm)로 변환
Serial.print(cm);
Serial.print(“cm”);
Serial.println();
Serial.print(cm2);
Serial.print(“cm”);
Serial.println();
delay(300); // 0.3초 대기 후 다시 측정
}
박연용
(2014년 5월 23일 - 12:50 오전)정말 감사합니다.
이걸 스위치로 해야하나 한참을 고민했는데 ㅎ 역시 초보라 항상 다음 스탭에서 발만 동동거리네요
최봉재
(2014년 5월 27일 - 9:23 오전)거리는 잘 재는데 계속 0cm만 출력할땐 어떡해야할까요
TORTUGA
(2014년 5월 28일 - 12:16 오전)0cm만 출력한다면 거리를 못재는 상태인것 같네요. 위 코드에서 duration 값을 Serial.print() 함수로 찍어보세요.
HWANG
(2014년 7월 28일 - 1:09 오전)저도 같은 문제가 발생해서 duration 값을 찍어봤더니 2, 3의 값이 반복되어서 찍히네요.. 어떤 문제인지 알 수 있을까요 ?
SUSAN
(2014년 6월 1일 - 12:53 오전)좋은자료 감사합니다.
Echo가 있는 4PIN은 어찌해야 하나 했는데 똑같이 digital이였네요.
제가 초음파 센서를 이용해서 장애물에 따른DC모터를 제어할려고 제어부분 소스를
U_SENSOR() >= 30? STOP() : FORWORD();
delay(1000);
이렇게 작성했는데 거리와 상관없이 계속 회전하는 문제가 발생하네요…
전달인자도 사용했지만 제어가 안되는데 어떻게 접근을 해야 정상적으로 제어가 가능할까요?
초음파 센서는 시리얼 모니터를 통해 출력되는 것을 확인했습니다.
woojin
(2014년 6월 23일 - 1:06 오전)이모델이랑 다른모델인 ultrasonic Ranger 이라는 제품을 사용중인데요
센서에 echo 랑Trig 이 없고 vcc 랑 gnd 랑 nc sig 이렇게 4개의 핀이있는데요 어떻게 설계해야되나영 ??
TORTUGA
(2014년 6월 23일 - 4:50 오후)아마도 주기적으로 거리를 자체 즉정해서 결과만 보내주나봅니다. 정확한건 판매처에서 제공하는 문서를 확인해봐야 알것 같네요.
Art
(2014년 9월 10일 - 4:45 오후)측정값을 pc로 전달해서 웹캠으로 촬영하게 하려면 어떻게 해야하나요
TORTUGA
(2014년 9월 11일 - 6:22 오후)질문이 너무 어렵습니다;; 일단 PC로 전달할 방법부터 선택하셔야 할 듯. USB-Serial / BT / WiFi 등등요.
미콩
(2014년 10월 30일 - 11:27 오전)좋은 자료 감사합니다^^
혹시 일정거리 안이면 어떤 단일 값을 출력하고 밖이면 다른 값을 출력하는,
예를 들어 10cm 이내 일때는 “유효거리 안입니다” 라고 출력하고 그 외에는 “유효거리 밖입니다” 라고 출력하는 식의 소스도 만들 수 있나요?
TORTUGA
(2014년 11월 7일 - 10:49 오전)물론 가능합니다. 아래 소스코드를 보시면
cm = microsecondsToCentimeters(duration); // 거리(cm)로 변환
cm 값에 따라 유효거리인지 판단하면 됩니다.
미콩
(2014년 11월 15일 - 4:27 오후)감사합니다. 과제 중에 초음파센서를 사용하게 되어 질문했었습니다. if문을 사용해서 해보니깐 되네요^^
학생탈출
(2014년 12월 1일 - 7:58 오후)초음파센서 1개만 연결했을 때는 잘 작동하는데 2개를 연결하면 둘중 하나만 작동합니다 ㅠㅠ
위에 댓글에 있는 소스도 써보고 직접 프로그래밍 짜보기도 했는데 안되는데 이유가 뭘까요??
TORTUGA
(2015년 1월 26일 - 1:06 오전)집에 센서가 하나 뿐이네요;;; 서로 간섭이 발생하지 않게 배치해서 한번 해보시겠어요?
초음파 센서로 거리를 재보자 | 이방인
(2015년 1월 25일 - 4:16 오후)[…] 브레드 보드에 초음파 센서를 끼우고, 점퍼로 보드와 연결했다. (참조: 초음파, […]
Froggy
(2015년 2월 16일 - 8:31 오후)아주 기본적인 문제입니다.
노트북과 아두이노를 연결했는데 노트북이 아두이노를 인식하지 않습니다.
어떻게 해야 하는지요.
TORTUGA
(2015년 2월 21일 - 9:01 오후)드라이버부터 확인해봐야 합니다. 아두이노 설치하면 기본 드라이버가 깔립니다. 아두이노 정식보드는 이 드라이버로 잡힙니다. 호환보드일 경우는 보드에 맞는 드라이버를 깔아줘야 합니다.
Froggy
(2015년 2월 24일 - 12:31 오후)초음파 센서의 구동원리를 좀 더 잘 이해하기 위해서 측정된 거리에 따른 echo 신호 변화를 오실로스코프로 보려고 합니다.
첫번째 질문은 이를 위해 echo 신호를 오실로스코프와 공유했더니 거리 측정값이 0cm로 고정됩니다. 그 이유가 무엇인지 궁금합니다.
두번째 질문은 echo 핀이 High 상태에서 Low로 전환될 때까지 걸리는 시간을 측정하여 거리를 측정한다고 하셨는데, 오실로스코프 상에서 echo 신호를 보면 두 개의 peak가 10us 간격으로 일정하게 나타납니다. delayMicroseconds()에서 괄호 안의 숫자를 변경하면 두 peak간의 간격도 동일한 크기로 변합니다. 센서에서 전달해 주는 echo 신호의 성격은 어떤 것인지요?
초센
(2015년 4월 22일 - 2:02 오후)안녕하세요
DYP-ME007Y라는 4개핀짜리 방수형초음파센서를 통해 거리를 재려고하는데
오차값이 1.5cm나 생깁니다. 교수님이 필터를 사용하여야한다고 하는데 어떤 필터를 말하는건지는 알려주시지 않아서요..
황규남
(2015년 9월 21일 - 10:53 오후)자료는 정말 도움이 되었습니다. 감사합니다.
다름이 아니라 피에조 부저를 사용하여 후방감지를 표현하고 싶은데
소스를 혹시 부탁드려도 될까요 ㅠㅠ..
진윤태
(2015년 11월 4일 - 8:25 오후)아두이노 초음파센서 실험을 하고있는데요 duration 값을 Serial.print로 찍으라는 말이 이해가 안되는데 코드를 직접 적어주실수 있나요? 일부분만…???
태윤진
(2015년 11월 4일 - 8:41 오후)저도 같은 현상인데 cm = microsecondsToCentimeters(duration); // 거리(cm)로 변환 이부분에서 duration안에 cm = microsecondsToCentimeters(Seiral.print(duration)); 으로 변환 시키는거 아닌가요?? 정말 궁금합니다..
TORTUGA
(2015년 11월 10일 - 12:37 오후)Serial.println(duration);
이런식으로 변수를 println() 함수안에 넣어주면 값이 PC로 전송되어 출력됩니다.
TORTUGA
(2015년 11월 10일 - 12:38 오후)println() 함수는 값을 PC로 전송해주는 역할을 합니다. microsecondsToCentimeters() 함수는 단위를 변환하는 함수므로 일단 단위를 변환해서 cm로 바꾼 다움에 println(cm) 처럼 출력해주셔야 합니다.
jhkim
(2015년 12월 16일 - 11:02 오전)안녕하십니까, 저는 초음파센서로 측정거리값을 받아서 그 값을 c++(아두이노 스케치 프로그램이아닌 visual studio)에서 다루고싶은데 그렇게 할 수 있는 방법을 알고싶습니다. //만약, 그 측정값을 direct로 c++에서 받을수없고, 아두이노 스케치 프로그램을 거쳐서 받을 수 있다면 그 방법또한 알고싶습니다.
TORTUGA
(2015년 12월 22일 - 10:13 오전)스케치는 아두이노에서 동작하는 코드입니다. 따라서 초음파센서로 측정한 값은 아두이노가 가지고 있고, 이걸 PC로 보내줘야 합니다.
PC로 보내줄때 아두이노는 시리얼 통신을 통해 USB로 전달합니다. PC에서는 아두이노가 COM 포트로 잡히게 되는데 이 COM 포트를 통해 아두이노가 보내주는 데이터를 받을 수 있습니다.
결론은, 아두이노에서 측정한 거리값을 Serial 로 전송하세요. PC에서는 COM 포트를 열어 데이터를 받아서 처리하세요.
김현우
(2016년 5월 4일 - 6:09 오후)거리의 제한을 두고 싶은데 어떻게 해야하나요 몇 미터 부터 몇미터 까지만 측정하고 나머지는 측정안되게 하고싶어요
임한별
(2016년 6월 18일 - 10:55 오전)코드를 입력하고 업로드한뒤에 시리얼 모니터를 열면
“시리얼 포트 ‘COM6’ 를 여는데 에러 발생 (Port busy)”
라는 빨간 문구가 뜨면 열리지 않는데 이유를 알려주실 수 있을까요
임한별
(2016년 6월 18일 - 10:56 오전)포트는 COM6이 확실합니다