초음파 거리 센서, 아두이노 - cho-eumpa geoli senseo, adu-ino

아두이노와 초음파센서를 활용한 초음파거리계

By scipia 0 Comments

초음파란

소리는 일종의 파동입니다. 소리의 진동은 공기의 분자를 진동시키며 공기를 압축 또는 확장 시킴으로써 파동을 갖게 되는 음파입니다. 사람이 들을 수 있는 소리의 주파수는 20Hz~20kHz입니다.
초음파(ultrasound)란 음파 또는 진동의 주파수가 사람 귀가 들을 수 있는 범위를 초과하는 것을 말합니다. 초음파의 주파수가 너무 낮으면 노이즈가 증가하고 초음파의 주파수가 너무 높으면 감쇠가 증가하여 도달 거리가 짧아집니다. 측정 가능한 거리 범위 내에서는 최대한 측정주파수를 높여야만 반사파의 측정이 쉽고 높은 거리정확도를 얻을 수 있습니다. 
일반적으로 사용되는 초음파 주파수 범위는 20kHz~40kHz입니다. 초음파는 직선으로 발사하더라도 계속 퍼지므로 손실이 발생하게 되며 거리가 멀수록 손실은 커지게 됩니다. 일반적으로 초음파센서가 측정할 수 있는 최대 거리는 10미터이며, 대부분의 경우 최대 2~5미터의 초음파센서가 가장 많이 사용되고 있습니다.
초음파 모듈로 거리를 측정하는 원리는 다음과 같습니다. 초음파 센서에서 초음파를 발사함과 동시에 타이머를 동작시킵니다. 초음파는 공중으로 전파되어 장애물에 부딪히면 다시 반사되며, 초음파 수신기가 반사파를 수신하면 카운트를 멈추게 되는데, 측정된 시간은 초음파 모듈과 물체 사이의 왕복 시간이 됩니다. 초음파는 초당 약 340미터의 속도로 공기 중에서 이동하기 때문에 초음파 모듈과 물체 사이의 거리는 (왕복시간/2)*340미터가 됩니다

초음파 모듈과 동작원리

여기서는 HC-SR04 초음파 모듈을 사용합니다. HC-SR04는 VCC, TRIG, ECHO, GND의 4개의 핀을 가지고 있으며 5V로 구동됩니다. 검출 거리는 2cm~400cm이며 정밀도는 0.3cm입니다.
초음파 모듈의 동작 원리는 다음과 같습니다. 먼저 아두이노 보드에서 초음파 모듈의 Trig로 약 5μs의 짧은 펄스를 측정 시작 신호로 보냅니다. 초음파 모듈은 측정 시작 신호를 받자마자 8개의 40kHz 펄스(200μs)를 발사합니다. 이 초음파 신호가 물체에 반사되어 되돌아오면 초음파 모듈은 Echo 핀을 통해 1개의 PWM 신호를 아두이노 보드로 전달합니다. 이 PWM 신호는 초음파가 이동한 왕복 시간을 의미합니다. 초음파의 속도는 초당 340m이고 이는 29μs/cm와 같습니다. 따라서 초음파 모듈과 물체와의 거리는 (왕복시간μs/2)/29 cm가 됩니다.

초음파 거리 센서, 아두이노 - cho-eumpa geoli senseo, adu-ino

초음파 거리 센서, 아두이노 - cho-eumpa geoli senseo, adu-ino

소스코드

아래는 소스코드입니다. 아두이노 IDE에 붙여넣기 하여 컴파일하고 업로드합니다.

// 아두이노 초음파 거리 측정 실험
#include <LiquidCrystal.h>

LiquidCrystal lcd(7,8,9,10,11,12);//RS,E,DB4,DB5,DB6,DB7

#define TRIG 3
#define ECHO 4
#define DELAY 500

long duration, distance;

void setup()
{
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.write("WWW.SCIPIA.CO.KR");
  lcd.setCursor(0,1);
  lcd.write("LCD1602 TEST OK!");

  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);
}

void loop()
{
  delay(DELAY);

  digitalWrite(TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG, LOW);
  duration = pulseIn(ECHO, HIGH);

  distance = duration/58.2;

  String disp = String(distance);
  lcd.clear();
  lcd.write("Distance :");
  lcd.setCursor(0,1);
  lcd.print(disp);
  lcd.print(" cm");
}

초음파 거리 센서, 아두이노 - cho-eumpa geoli senseo, adu-ino

Topic: 

아두이노울티메이트키트

Author

초음파 거리 센서, 아두이노 - cho-eumpa geoli senseo, adu-ino

scipia

싸이피아

반응형

[아두이노기초-4] 초음파 센서로 거리 측정하기

초음파 거리 센서, 아두이노 - cho-eumpa geoli senseo, adu-ino

◆ 이번 시간에는 초음파 센서를 이용하여 거리를 구하는 방법을 알아보자

◆ 실생활 사용 예 : 거리측정기, 자동차 전/후방센서

 

<초음파센서 원리>

- 초음파 발신부에서 초음파를 쏴서 물체에 반사되어 돌아오는 시간을 측정하면 거리=속도X시간으로 거리측정이 가능

- 초음파는 사방으로 퍼지는 특성 때문에 거리가 멀어지면 반사되어 되돌아 오는 초음파의 양도 급속히 적어지게 됨

- 굴곡진 지형이거나 중간에 물체가 있을 경우는 정면에 보이는 물체외의 직진 거리가 아니고 중간에서 반사되어 오는 거리를 측정하게 되어 부정확한 거리측정이 된다. (정밀한 거리 측정을 위해서는 레이저처럼 직진성 빛을 사용하는 거리측정 방식 필요)

- 왕복이므로 거리 = (시간 X 속도) ÷ 2를 해줘야 한다.

초음파 거리 센서, 아두이노 - cho-eumpa geoli senseo, adu-ino
초음파 거리 센서, 아두이노 - cho-eumpa geoli senseo, adu-ino
초음파 거리 센서, 아두이노 - cho-eumpa geoli senseo, adu-ino
초음파센서

 

<회로도>

- VCC : (+)극 5V 전원 연결

- Trig : 입력단자. 2번핀(D2)에 연결

- Echo : 출력단자. 3번핀(D3)에 연결

- GND : (-)극 GND에 연결

초음파 거리 센서, 아두이노 - cho-eumpa geoli senseo, adu-ino

 

<소스코드>

int trig = 2;
int echo = 3;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);     // 시리얼포트 통신속도 9600 설정
  pinMode(trig, OUTPUT);  // trigger(발신부)를 출력모드로 설정
  pinMode(echo, INPUT);   // echo(수신부)를 입력모드로 설정
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(trig, HIGH); // trig핀(2)에 1입력
  delayMicroseconds(10);    // 10us 대기
  digitalWrite(trig, LOW);  // trig핀(2)에 0입력
  int distance = pulseIn(echo, HIGH)*340 / 2 / 10000; 
  // 거리=시간X속도/2(왕복이므로)
  Serial.print(distance);   // 거리 출력
  Serial.println("cm");     // "cm" 출력
  delay(100);               // 100ms=0.1s 지연
}

◆ 코드 설명

 Serial.begin(9600) : 시리얼 통신의 통신속도는 300~115200으로 설정가능하지만, 보통 9600으로 설정함

 pinMode(trig, OUTPUT) : 보드에서 사용할 디지털핀의 모드(입력, 출력) 설정.

  2번 핀을 출력을 위한 모드로 설정 (trigger, 초음파 발신부)

 pinMode(echo, INPUT) : 보드에서 사용할 디지털핀의 모드(입력, 출력) 설정.

   3번 핀을 입력을 위한 모드로 설정 (echo, 초음파 수신부)

 digitalWrite(trig, HIGH) : trig(2) 핀에 HIGH(1, ON)값을 부여 (10ms간 초음파 발신 ON)

 delayMicroseconds(10) : 10ms 대기

 digitalWrite(trig, LOW) : trig(2) 핀에 LOW(0, OFF)값을 부여 (초음파 발신 OFF)

 pulseIn(echo, HIGH) : 설정신호(echo)인 수신부가 다시 입력받을때까지 걸리는 시간을 측정

    반환값 - 설정 신호가입력될때까지의 시간을 반환, 신호 없으면 0 반환

     [단위 : us(마이크로초)]

거리 = 시간 X 속도 ÷ 2
       = (pulseIn(echo,HIGH) X 340) ÷ 2
※ cm = 1[us] X [m/s] / 10000이므로 10000을 나눠줘야 한다.

 Serial.print(distance) : 변수 distance 값을 출력, 한 줄 띄어쓰기 하지 않음

 Serial.println("cm") : 문자열 cm 값을 출력,  한 줄 띄어쓰기 함

 delay(100) : 100ms = 0.1초 후 다음 loop를 실행

반응형

공유하기

게시글 관리

구독하기Half Moon

'IT > 아두이노' 카테고리의 다른 글

[아두이노] 키보드 라이브러리 사용하기  (0)2022.01.08[아두이노] 라이브러리 추가하기  (1)2022.01.08[아두이노기초-3] 적외선 센서로 움직임 감지하기  (0)2021.12.26[아두이노기초-2] 문자열 / 정수 출력, LED 제어하기  (0)2021.12.26[아두이노기초-1] 시작 전 필수로 알아야 할 사항  (0)2021.12.25