부품설명

자주 사용하는 부품들의 사용법에 대하여 알아봅니다.

초음파 거리 센서 사용하기

2014-08-05 16:35:54

개요

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


사진 출처 : DangerousPrototypes

초음파 거리센서를 이용해 거리측정을 하여 물체가 가까이 있을 경우 진동이 울리는 시각장애인들을 위한 장갑을 만들 수도 있고, 



사진 출처 : MCU on Eclipse

로봇에 부착하여 로봇이 물체에 충돌하지 않도록 움직임을 제어 할 수 있습니다.


이 컨텐츠에서는 초음파 거리 센서를 아두이노와 연결해 보고, 물체와의 거리를 측정 해보겠습니다.

 

 

 

 

 
 

 

초음파 거리 센서(링크)

  - 초음파는 사람의 귀로 들을 수 없는 주파수가 20Khz 이상의 음을 말합니다.
  - 초음파 거리 센서는 초음파를 보내고 받는 시간을 측정하여 거리를 재는 센서입니다.

 

 

부품 목록

NO 부품명 수량 상세설명
1 오렌지보드 1 아두이노
2 초음파 거리 센서 1 초음파 거리 센서
3 브레드보드 1 브레드보드
4 점퍼케이블 4 점퍼케이블

 

 

부품명 오렌지보드 초음파 거리 센서 브레드보드 점퍼케이블
파트 x1 x1 x1 x4


 

 

하드웨어 making

 

회로도

 

 

브레드보드 레이아웃

 

 

 

소프트웨어 coding

 

//초음파 센서의 핀번호를 설정한다.
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

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

초음파 거리 센서, 아두이노, 오렌지보드

판다마니아 2015-05-18 18:15:36

1. 초음파가 온도에 변화가 있다고는 하나 아주 미세한 차이라 무시해도 될 것 같습니다.

2. 위에서 사용한 초음파 센서 hc-sr04는 데이터 시트상 2cm ~ 4m의 범위에 오차범위가 3mm라고 하는데, 직접 사용해 본 결과 가까운 거리(최대 1m 안)까지는 정확한 값을 측정하지만 이 이상부터는 1cm단위로 측정하실꺼면 다른 센서를 찾아보시는게 좋을 것 같습니다.

HC-SR04 데이터시트 : http://www.micropik.com/PDF/HCSR04.pdf

Nix 2015-12-13 19:48:25

회로도랑 똑같이 만들고 소스코드도 그대로 해줬는데 왜 시리얼 모니터에 아무것도 안뜨는건가요?

ssagri 2015-12-26 16:29:15

혹시 pulseIn을 엔트리에서 구현하는 방법이 있을까요?

정동순 2015-12-28 02:22:45

처음엔 거리측정(가까운곳) 이 잘 되다가 다른곳(먼곳)에 초음파를 보낸 이후 거리가 0cm 로 계속나오고 그 뒤엔 잘 나오던 거리도 계속 0cm 로 나오던데 소스에 버그가 있는건가요?

gkgk 2018-08-02 16:01:40

혹시 초음파 센서를 두개 사용하여 초음파센서 사이를 통과하는 시간을 구하고 싶은데, 한개의 초음파센서에서 초음파를 쏘고 다른 초음파센서로 받을 수도 있나요?

이정록 2018-10-29 17:19:24

혹시 초음파센서를 이용하여 크레인을 운전하는 운전자 안전모에 설치하여 일정거리에 근접하면 신호가 나오게 할수 있나요

kocoafab 2019-01-07 13:37:48

@Nlx
초음파 센서의 trig핀과 echo핀이 제대로 연결되었는지 확인해보시고, 시리얼 모니터에 통신속도가 9600으로 되어있는지 확인해보세요.

@ssagrl
지금은 딱히 구현할 방법이 생각나지 않네요..

@정동순
위 회로나 코드상은 딱히 문제가 없어보입니다. 전체 회로 연결을 다시 확인해보시고, 초음파센서를 움직일 때 선이 빠지는게 있는지 보세요.

@gkgk
직접 확인해본적이 없어서 정확히 말씀드리긴 힘들지만, 안되는 걸로 알고있습니다.

@이정록
가능합니다. 위코드에서 거리값이 구해지므로 이 거리값을 이용해서 조건문을 사용해서 원하시는 동작을 만드시면 됩니다.

김주현 2021-04-06 14:17:32

//초음파 센서의 핀번호를 설정한다.
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);
}