아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

I, 생각하기

■ 초음파 센서 : HC-SR04

HC-SR04는 약 40KHz 정도의 주파수를 생성하며, 최대 4~5m정도까지의 거리를 측정할 수 있습니다.

Vcc, Trigger, Echo 및 GND를 위한 4개의 핀이 있습니다.

트리거는 초음파 신호를 보내고 Echo는 돌아온 후 해당 신호를 수신합니다.

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

초음파 센서 : HC-SR04

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

■ 초음파 센서 동작원리

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

초음파의 속도는 일반 공기중에서 약 340m/s 입니다.

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

■ 초음파 센서를 이용한 거리 계산하기

초음파속도: 340 m/s

복소요시간: duration (µs)

방법1)

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

int trigPin = 12; // 초음파센서 출력핀 int echoPin = 11; // 초음파센서 입력핀 void setup(){ Serial.begin(9600); // 시리얼 속도 설정 pinMode(trigPin, OUTPUT); // 트리거 핀을 출력으로 설정 pinMode(echoPin, INPUT); // 데코 핀을 입력으로 설정 } void loop(){ //초음파를 보내며, 다 보내면 echo가 HIGH(신호받기) 상태로 대기 digitalWrite(trigPin, HIGH); delay(10); digitalWrite(trigPin, LOW); // echoPin 이 HIGH를 유지한 시간 즉, 초음파가 보냈다가 다시 들어온 시간 float duration = pulseIn(echoPin, HIGH); // 마이크로 초 // HIGH 였을 때 시간을 가지고 물체와의 거리(distance)를 계산 한다. // 초음파(소리)의 속도: 340m/s // 초(second)와 미터(m)를 마이크로 초와 cm로 변환하기 위해서 10000으로 나눠 준다 // 왕복거리이므로 2로 나눠 준다 float distance = ((float)(340 * duration) / 10000) / 2; // 또는 distance = duration / 58.8 Serial.print("Duration: "); Serial.print(duration); Serial.print("\nDIstance: "); Serial.print(distance); Serial.println("cm\n"); delay(500); }

pulseIn(펄스인) 함수

pulseIn 함수는 아두이노로 들어오는 특정 신호의 길이를 읽어 들이는 함수입니다. 예를 들어서 다음 사진과 같은 신호가 들어오고있고 각 신호에서 HIGH 값이 몇 마이크로 초 동안 들어왔는지 읽을 수 있습니다.

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

pulseIn(pin, value);

pulseIn(pin, value, timeout);

pin : 펄스 신호를 받아들이는 핀 번호

value : 측정하려는 펄스의 형태(HIGH 또는 LOW)

timeout : 펄스 신호를 읽는데 제한시간을 초과하면 0을 출력

결과값 : 펄스의 길이를 unsigned long 형의 마이크로초[us] 단위로 반환한다. timeout을 지정하지 않으면 기본적으로 1초가 설정된다.

예) pulseIn(10, HIGH)

해당 핀의 입력이 LOW에서 HIGH로 변하는 순간부터 시간을 측정하여 다시 LOW로 바뀌는 시점까지의 시간을 마이크로초[us] 단위로 반환합니다.

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

delay()

매개변수에 정한 시간(밀리 초) 동안 프로그램 멈춤. (1초는 1000 밀리 초)

ms: 멈출 밀리 초 (unsigned long)

ex) delay(1000); // 1초 기다림

delayMicroseconds()

매개변수에 지정된 시간(마이크로 초)동안 프로그램을 멈춘다.

1밀리초는 1000 마이크로 초, 1초는 100만 마이크로 초

이 함수는 3 마이크로 초 이상 범위에서 매우 정확하게 돌아간다.

ex) delayMicroseconds(1000); // 1ms (= 0.001초) 기다림

■ 아두이노 보드로 업로드하기

업로드 버튼(→)을 눌러 스케치(소스)를 아두이노 보드로 업로드 한다.

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

IV. 연습하기

거리에 따라서 LED 켜기, 사운드(부저) 소리 내게 한다

1) 물체와의 거리가 100cm 이내인 경우 피에조부저의 소리를 출력하고 LED를 켠다

2) 물체와의 거리가 100cm 보다 큰 경우, 피에조부저의 소리와 LED를 끈다

if( 물체와의거리 <= 100 ) { // 예) 100cm 피에조부저 소리 출력 LED 켜기 } else { 피에조부저 소리 끄기 LED 끄기 }

아두이노 초음파센서 거리측정 - adu-ino cho-eumpasenseo geolicheugjeong

int trigPin = 12; // 초음파센서 출력핀 int echoPin = 11; // 초음파센서 입력핀 int piezo = 10; // 피에조부저 핀 int led = 13; // LED 핀 void setup(){ Serial.begin(9600); // 시리얼 속도 설정 pinMode(trigPin, OUTPUT); // 트리거 핀을 출력으로 설정 pinMode(echoPin, INPUT); // 데코 핀을 입력으로 설정 pinMode(piezo, OUTPUT); // 피에조 부저 핀을 출력으로 설정 pinMode(led, OUTPUT); // LED 핀을 출력으로 설정 } void loop(){ //초음파를 보내며, 다 보내면 echo가 HIGH(신호받기) 상태로 대기 digitalWrite(trigPin, HIGH); delay(10); digitalWrite(trigPin, LOW); // echoPin 이 HIGH를 유지한 시간 즉, 초음파가 보냈다가 다시 들어온 시간 float duration = pulseIn(echoPin, HIGH); // 마이크로 초 // HIGH 였을 때 시간을 가지고 물체와의 거리(distance)를 계산 한다. // 초음파(소리)의 속도: 340m/s // 초(second)와 미터(m)를 마이크로 초와 cm로 변환하기 위해서 10000으로 나눠 준다 // 왕복거리이므로 2로 나눠 준다 float distance = ((float)(340 * duration) / 10000) / 2; // 또는 duration / 58.8 Serial.print("Duration: "); Serial.print(duration); Serial.print("\nDIstance: "); Serial.print(distance); Serial.println("cm\n"); //시리얼모니터에 Echo가 HIGH인 시간 및 거리를 표시해준다. if(distance <= 100) { // 100cm 이내인 경우 tone(piezo, 262); // 도 digitalWrite(led, HIGH); // LED ON } else { noTone(piezo); // 소리를 끔 digitalWrite(led, LOW); // LED OFF } delay(500); }