회로도랑 똑같이 만들고 소스코드도 그대로 해줬는데 왜 시리얼 모니터에 아무것도 안뜨는건가요?
코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
2014-08-05 16:35:54
초음파 거리센서는 초음파를 대상에게 발사하여 반사되어 오는 반사파를 받을 때까지의 시간을 확인하여 거리를 측정하는 센서 입니다.
사진 출처 : DangerousPrototypes
초음파 거리센서를 이용해 거리측정을 하여 물체가 가까이 있을 경우 진동이 울리는 시각장애인들을 위한 장갑을 만들 수도 있고,
사진 출처 : MCU on Eclipse
로봇에 부착하여 로봇이 물체에 충돌하지 않도록 움직임을 제어 할 수 있습니다.
이 컨텐츠에서는 초음파 거리 센서를 아두이노와 연결해 보고, 물체와의 거리를 측정 해보겠습니다.
- 초음파는 사람의 귀로 들을 수 없는 주파수가 20Khz 이상의 음을 말합니다.
- 초음파 거리 센서는 초음파를 보내고 받는 시간을 측정하여 거리를 재는 센서입니다.
NO | 부품명 | 수량 | 상세설명 |
1 | 오렌지보드 | 1 | 아두이노 |
2 | 초음파 거리 센서 | 1 | 초음파 거리 센서 |
3 | 브레드보드 | 1 | 브레드보드 |
4 | 점퍼케이블 | 4 | 점퍼케이블 |
부품명 | 오렌지보드 | 초음파 거리 센서 | 브레드보드 | 점퍼케이블 |
파트 | ![]() |
![]() |
![]() |
![]() |
//초음파 센서의 핀번호를 설정한다.
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);
}
* 이 코드는 스케치를 사용하여 작성 / 업로드 합니다. 스케치에 대한 사용법은 링크를 참고하시기 바랍니다.
duration = pulseIn(echoPin, HIGH); // echoPin 이 HIGH를 유지한 시간을 저장 한다. distance = ((float)(340 * duration) / 10000) / 2; // HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.
위의 코드를 이해하기 위해서는 초음파 센서의 원리 알아야 합니다.
간단하게 설명하면 trig이 HIGH 가 되면 초음파를 보내게 됩니다. 초음파를 다 보내면 echo가 HIGH상태를 유지하면서 되돌아오는 초음파를 받을 준비를 합니다.
초음파가 앞에 물질에 부딪혀 다시 돌아오면 echo가 LOW 로 바뀌게 됩니다. HIGH 에서 LOW로 바뀔 동안의 시간을 측정하여 duration에 저장합니다.
(pulseIn(pin, state)은 어느 pin에서 어떤 상태(state)로 얼마나 유지되고 있는지를 구합니다.)
초음파는 340m/s의 속도로 날라갑니다.(온도가 25도 일 때)
이 때 속도와 센서가 보낸 시간을 이용하여 거리를 구합니다.(왕복해서 오는 것이므로 결과를 2로 나눠줘야 합니다)
kocoafabeditor
항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!
처음엔 거리측정(가까운곳) 이 잘 되다가 다른곳(먼곳)에 초음파를 보낸 이후 거리가 0cm 로 계속나오고 그 뒤엔 잘 나오던 거리도 계속 0cm 로 나오던데 소스에 버그가 있는건가요?
혹시 초음파 센서를 두개 사용하여 초음파센서 사이를 통과하는 시간을 구하고 싶은데, 한개의 초음파센서에서 초음파를 쏘고 다른 초음파센서로 받을 수도 있나요?
@Nlx
초음파 센서의 trig핀과 echo핀이 제대로 연결되었는지 확인해보시고, 시리얼 모니터에 통신속도가 9600으로 되어있는지 확인해보세요.
@ssagrl
지금은 딱히 구현할 방법이 생각나지 않네요..
@정동순
위 회로나 코드상은 딱히 문제가 없어보입니다. 전체 회로 연결을 다시 확인해보시고, 초음파센서를 움직일 때 선이 빠지는게 있는지 보세요.
@gkgk
직접 확인해본적이 없어서 정확히 말씀드리긴 힘들지만, 안되는 걸로 알고있습니다.
@이정록
가능합니다. 위코드에서 거리값이 구해지므로 이 거리값을 이용해서 조건문을 사용해서 원하시는 동작을 만드시면 됩니다.
//초음파 센서의 핀번호를 설정한다.
int echoPin = 12;
int trigPin = 13;
void setup() {
Serial.begin(9600);
// trig를 출력모드로 설정, echo를 입력모드로 설정
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
// 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
digitalWrite(trigPin, LOW);
digitalWrite(echoPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, 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);
}
판다마니아 2015-05-18 18:15:36
1. 초음파가 온도에 변화가 있다고는 하나 아주 미세한 차이라 무시해도 될 것 같습니다.
2. 위에서 사용한 초음파 센서 hc-sr04는 데이터 시트상 2cm ~ 4m의 범위에 오차범위가 3mm라고 하는데, 직접 사용해 본 결과 가까운 거리(최대 1m 안)까지는 정확한 값을 측정하지만 이 이상부터는 1cm단위로 측정하실꺼면 다른 센서를 찾아보시는게 좋을 것 같습니다.
HC-SR04 데이터시트 : http://www.micropik.com/PDF/HCSR04.pdf