초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

초음파센서로 거리 측정하기

2015-01-16 15:02:29

개요

1) 초음파센서란 무엇인가?
 

인간의 들을 수 있는 영역 (가청영역) 은 약 20~20KHz이며, 이것보다 주파수가 더 높은 음을 초음파 (Ultrasonic)라고 합니다.
개인적인 차이가 있으나, 일반적인 성인은 20KHz 이상의 높은 소리는 듣지 못 합니다.
 

초음파의 속도는 약 340m/s이며, 확산, 흡수, 산란 등에 의해 감쇠하는 성질을 가지고 있어, 로봇 청소기 같은 가전제품에서부터 의료용, 산업용에 이르기까지 매우 다양한 분야에서 활용되고 있습니다.
 

이 예제에서 사용된 초음파 센서는 약 40KHz 정도의 주파수를 생성하여, 5~7m정도까지의 거리를 측정할 수 있습니다.
 

거리측정을 위한 초음파 센서는 송신부와 수신부로 나뉘어져 있으며, 송신부에서 일정한 시간의 간격을 둔 짧은, 초음파 펄스를 방사하고, 대상물에 부딪혀 돌아온 에코 신호를 수신부에서 받아, 이에 대한 시간차를 기반으로 거리를 산출합니다.
이를 통해 장애물의 유무, 물체의 거리 또는 속도 등을 측정할 수 있습니다.
 

초음파를 발생시키는 원리는 3.3 피에조 부저로 소리내기 에서 다룬 피에조효과 (압전효과)와 같습니다. 

 

 

 

2) 초음파센서 사용방법

초음파 센서의 송신부(Trig)에서 일정한 시간의 간격을 둔 짧은, 초음파 펄스를 방사하고, 대상물에 부딪혀 돌아온 에코 신호를 수신부(Echo)에서 받아, 이에 대한 시간차를 기반으로 거리를 산출합니다.

1cm를 이동하는데 걸리는 시간은 다음과 같이 구할 수 있습니다.



따라서, t = 2 * 0.01 / 340 = 58.824µs 로, 초음파가 1cm를 이동하는데 걸리는 시간은 약 29µs가 걸리며, 초음파가 반사된 물체와의 거리는 다음과 같이 구할 수 있습니다.
거리(cm) = duration (왕복에 걸린시간) / 29 / 2 (왕복).
 

 

 

부품 목록

NO 부품명 수량 상세설명
1 오렌지 보드 1  
2 초음파 센서 1 HC-SR04
3 LED 1 LED(RED)
4 330Ω 저항 1  
5 브레드 보드 1  
6 점퍼 케이블 8  

 

부품명 오렌지 보드 초음파 센서 LED
파트

 

 

부품명 330Ω 저항 브레드 보드 점퍼 케이블
파트

 

하드웨어 making

브레드 보드


1. 오렌지보드의  5V핀을 브레드보드의 +버스에 연결합니다.

2. 오렌지보드의 GND핀을 브레드보드의 -버스에 연결합니다.

3. 초음파센서를 그림과 같이 세로로 꽂습니다.

4. LED를 애노드(긴 단자)가 아래쪽으로 향하게하여 꽂습니다.

5. LED의 애노드에 330Ω 저항을 연결합니다.

6. 초음파센서의 Vcc단자를 +버스에 연결합니다.

7. 초음파센서의 Trig단자를 오렌지보드 8번핀에 연결합니다.

8. 초음파센서의 Echo단자를 오렌지보드 9번핀에 연결합니다. 

9. 초음파센서의 Gnd단자를 -버스에 연결합니다.

10. LED 애노드와 연결된 저항을 오렌지보드 A0번에 연결합니다.

11. LED 캐소드(짧은)를 -버스에 연결합니다.


 

전자 회로도




소프트웨어 coding

/*
 제목		: 초음파센서로 거리 측정하기
 내용		: 초음파센서로부터 10cm 이내로 물체가 감지되었을때 LED가 켜지도록 만들어 봅시다.
 */

// 초음파센서의 송신부를 8번핀으로 설정합니다.
int trig = 8;
// 초음파센서의 수신부를 9번핀으로 설정합니다.
int echo = 9;
// LED를 A0핀으로 설정합니다.
int led = A0;

// 실행시 가장 먼저 호출되는 함수이며, 최초 1회만 실행됩니다.
// 변수를 선언하거나 초기화를 위한 코드를 포함합니다.
void setup() {
	// 초음파센서의 동작 상태를 확인하기 위하여 시리얼 통신을 설정합니다. (전송속도 9600bps)
	// 메뉴 Tool -> Serial Monitor 클릭
	Serial.begin(9600);
	// 초음파센서의 송신부로 연결된 핀을 OUTPUT으로 설정합니다.
	pinMode(trig, OUTPUT);
	// 초음파센서의 수신부로 연결된 핀을 INPUT으로 설정합니다.
	pinMode(echo, INPUT);
	// LED가 연결된 핀을 OUTPUT으로 설정합니다.
	pinMode(led, OUTPUT);
}

// setup() 함수가 호출된 이후, loop() 함수가 호출되며,
// 블록 안의 코드를 무한히 반복 실행됩니다.
void loop() {
	// 초음파 센서는 송신부와 수신부로 나뉘어 있으며,
	// 송신부터 수신까지의 시간을 기준으로 거리를 측정합니다.
	// 트리거로 연결된 핀이 송신부를 담당하며, 에코로 연결된 핀이 수신부를 담당합니다.
	// 송신부에서 2마이크로초 정도 또는 그 이상의 시간동안 초음파를 발생시킵니다.
	// 초음파 발생 전후로, 잡음을 제거하기 위하여 전류를 보내지 않도록 설정합니다.
	digitalWrite(trig, LOW);
	digitalWrite(echo, LOW);
	delayMicroseconds(2);
	digitalWrite(trig, HIGH);
	delayMicroseconds(10);
	digitalWrite(trig, LOW);

	// 수신부의 초기 로직레벨을 HIGH로 설정하고, 반사된 초음파에 의하여 ROW 레벨로 바뀌기 전까지의 시간을 측정합니다.
	// 단위는 마이크로 초입니다.
	unsigned long duration = pulseIn(echo, HIGH);

	// 초음파의 속도는 초당 340미터를 이동하거나, 29마이크로초 당 1센치를 이동합니다.
	// 따라서, 초음파의 이동 거리 = duration(왕복에 걸린시간) / 29 / 2 입니다.
	float distance = duration / 29.0 / 2.0;

	// 측정된 거리 값를 시리얼 모니터에 출력합니다.
	Serial.print(distance);
	Serial.println("cm");

	// 측정된 거리가 10cm 이하라면, 아래의 블록을 실행합니다.
	if (distance < 10) {
		// LED가 연결된 핀의 로직레벨을 HIGH (5V)로 설정하여, LED가 켜지도록 합니다.
		digitalWrite(led, HIGH);
	}
	// 측정된 거리가 10cm 이상이라면, 아래의 블록을 실행합니다.
	else {
		// LED가 연결된 핀의 로직레벨을 LOW (0V)로 설정하여, LED가 꺼지도록 합니다.
		digitalWrite(led, LOW);
	}
	// 0.2초 동안 대기합니다.
	delay(200);
}

 

 

kocoafabeditor

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

오렌지 보드, 초음파 센서, LED

신재용 2015-11-13 14:18:21

초음파센서로 만드는게 재밌내요

4시55분 2017-07-25 19:20:04

초음파 센서 사용 시 항상 시리얼 통신이 필요한 것은 아니죠?