Back Ground

아두이노 - 초음파 센서 사용하기 본문

아두이노

아두이노 - 초음파 센서 사용하기

Back 2016. 6. 21. 14:04



1. 초음파 센서 사용하기


초음파센서 HC-SR04(초음파센서)



초음파 센서인 HC-SR04를 이용하여 거리를 측정해보자.

이 센서는 테스트 결과 1m 안의 물체에 대해서는 상당히 정확한 거리값을 구해 준다.

하지만 1m를 넘어가면 값이 별로 정확하지는 않은 것 같다.

초음파로 거리를 계산하는 원리는 다음과 같다.

초음파의 속도는 340m/s 이다.(일반적인 소리의 속도와 같다.) 초음파가 발생되어 대상물체에 부딪히게 되면 반사되어 돌아오게 된다. 이의 시간차를 계산하면 거리를 계산할 수 있다. 박쥐가 동굴에서 빛 없이도 장애물을 파악하고 피해가는 원리와 비슷하며, 번개가 치고 1초뒤 천둥소리가 들렸다면 번개가 친 곳과의 거리가 340m 인 것을 파악하는 원리와 같다고 생각하면 된다.


Trig 가 초음파를 발생하는 신호이며, Echo가 반사되어 오는 초음파를 받는 역할을 한다.







2.초음파 센서 와 삼색 LED (색깔이 초음파에 따라 변함)


삼색 LED를 9, 10, 11번 핀에 연결합니다. 초음파센서의

Trig를 2번 핀, Echo를 3번 핀에 연결해줍니다.



스케치

// 초음파센서의 Trig, Echo 핀을 매크로 상수로 선언합니다.

#define TRIG 2

#define ECHO 3

// 삼색 LEDR, G, B에 해당하는 핀들을 매크로 상수로 선언합니다.

#define RED 11

#define GREEN 10

#define BLUE 9

void setup() {

// 초음파센서의 Trig를 출력 모드로 설정합니다.

pinMode(TRIG, OUTPUT);

// 초음파센서의 Echo를 입력 모드로 설정합니다.

pinMode(ECHO, INPUT);

}

void loop() {

// 다음은 초음파센서의 Trig에서 초음파를 발사하는 코드입니다.

digitalWrite(TRIG, LOW);

delayMicroseconds(2);

digitalWrite(TRIG, HIGH);

delayMicroseconds(10);

digitalWrite(TRIG, LOW);

// pulseIn명령어를 통해 Echo핀에 초음파가 들어오는 시간을 계산합니다.

// pulseIn에서 반환된 값에 58.2를 나눈 이유는 시간을 cm로 변경하기 위해서입니다.

long distance = pulseIn(ECHO, HIGH)/58.2;

// 삼색 LEDR, G, B를 모두 0으로 설정해서 끕니다.

analogWrite(RED, 0);

analogWrite(GREEN, 0);

analogWrite(BLUE, 0);

if(distance < 10) {

// 거리가 10cm 이내이면 빨간색으로 표시합니다.

analogWrite(RED, 255);

}else if(distance < 20) {

// 거리가 10 ~ 20 이내이면 초록색으로 표시합니다.

analogWrite(GREEN, 255);

}else if(distance < 30) {

// 거리가 20 ~ 30 이내이면 파란색으로 표시합니다.

analogWrite(BLUE, 255);

}

// 0.1초간 멈춥니다.

delay(100);

}



함 수











3.초음파 센서 와 피에조 스피커 연결 (거리에 따라 스피커소리가 느려졌다.빨라졌다가 함)


피에조 스피커를 8번 핀에 연결합니다. 초음파센서의

Trig2번 핀, Echo3번 핀에 연결

스케치

// 초음파센서의 Trig, Echo 핀을 매크로 상수로 선언합니다.

#define TRIG 2

#define ECHO 3

void setup() {

// 초음파센서의 Trig를 출력 모드로 설정합니다.

pinMode(TRIG, OUTPUT);

// 초음파센서의 Echo를 입력 모드로 설정합니다.

pinMode(ECHO, INPUT);

}

void loop() {

// 다음은 초음파센서의 Trig에서 초음파를 발사하는 코드입니다.

digitalWrite(TRIG, LOW);

delayMicroseconds(2);

digitalWrite(TRIG, HIGH);

delayMicroseconds(10);

digitalWrite(TRIG, LOW);

// pulseIn명령어를 통해 Echo핀에 초음파가 들어오는 시간을 계산합니다.

// pulseIn에서 반환된 값에 58.2를 나눈 이유는 시간을 cm로 변경하기 위해서입니다.

long distance = pulseIn(ECHO, HIGH)/58.2;

// 피에조 스피커의 소리를 약 0.02초간 울립니다.

// 음의 주파수는 임의로 1000으로 설정했습니다.

tone(8, 1000, 20);

// 0.1초 멈춥니다.

delay(100);

// 앞에와 똑같이 피에조 스피커를 다시 울립니다.

tone(8, 1000, 20);

// 거리값만큼 멈춥니다.

delay(distance);

}






3.거리 측정기를 만들어 보자. (응용예제)


연결:

Vcc ---- 아두이노 5V

GND ---- 아두이노 GND

Trig ---- 아두이노 디지털 9번핀

Echo ---- 아두이노 디지털 8번핀

스케치

//출력핀(trig)과 입력핀(echo) 연결 설정, 다른 핀을 연결해도 됨.

int trigPin = 9;

int echoPin = 8;

//시리얼 속도설정, trigPin을 출력, echoPin을 입력으로 설정

void setup(){

Serial.begin(9600);

pinMode(trigPin, OUTPUT);

pinMode(echoPin, INPUT);

}

//초음파를 보낸다. 다 보내면 echo가 HIGH(신호받기) 상태로 대기

void loop(){

float duration, distance;

digitalWrite(trigPin, HIGH);

delay(10);

digitalWrite(trigPin, LOW);

// echoPin 이 HIGH를 유지한 시간을 저장 한다.

duration = pulseIn(echoPin, HIGH);

// HIGH 였을 때 시간(초음파가 보냈다가 다시 들어온 시간)을 가지고 거리를 계산 한다.

// 340은 초당 초음파(소리)의 속도, 10000은 밀리세컨드를 세컨드로, 왕복거리이므로 2로 나눠준다.

distance = ((float)(340 * duration) / 10000) / 2;

//시리얼모니터에 Echo가 HIGH인 시간 및 거리를 표시해준다.

Serial.print("Duration:");

Serial.print(duration);

Serial.print("\nDIstance:");

Serial.print(distance);

Serial.println("cm\n");

delay(500);

}



Comments