IT/아두이노

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

크몽 '경매하는 개발자' 님의 경매/부동산/IT/사업 채널 2021. 12. 26. 20:36
반응형

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

반응형

 


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

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

 

<초음파센서 원리>

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

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

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

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

초음파센서

반응형

 

<회로도>

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

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

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

- GND : (-)극 GND에 연결

반응형

 

<소스코드>

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를 실행

반응형