로보틱스/physical device

초음파 센서 (Ultrasonic Sensor) 및 예제 코드 (아두이노)

행복한 감자 형아 2025. 3. 30. 23:17

* 개인 학습 목적으로 작성되었습니다.

1. 초음파 센서 (Ultrasonic Sensor) 

초음파의 특성을 이용하거나 초음파를 발생시켜 가까운 거리에 있는 물체 혹은 사람의 유무, 거리 및 속도 측정 등에 사용

초음파 소자는 고유 진동에 상당하는 교류전압을 가하면 압전 효과에 의해서 효율이 좋게 진동해서 초음파를 발생 시킵니다.

 

- 광학 센서 및 IR 센거와 달리 색상에 독립적으로 작동합니다. 

즉, 물체의 색상이 측정 정확도에 영향을 미치지 않음을 의미합니다.

- 유리 및 물과 같이 반투명하거나 투명한 타겟도 측정에 영향을 미치지 않습니다.

- 넓은 범위의 물체 감지 및 거리 측정을 제공합니다.

 

 

2. 동작 원리

물체에 반사된 음파를 그대로 센서로 입력 (진동) 시켜서 발생된 전압을 회로에서 처리해 측정 거리를 계산합니다.

- 파장과 분해능: 파장이 짧으면 거리 방향의 분해능이 높고 정밀도가 높아집니다.

- 파장의 반사: 물체의 유/무 감지를 위해 초음파가 물체에 닿으면 반사됩니다.

- 온도 영향: 물체까지의 거리를 정밀하게 측정하기 위해서는 온도에 따른 보정이 필요합니다.

* MCU에서 초음파 센서의 정밀도를 확보하기 위해서 온도센서를 같이 사용하기도 함.

 

 

 

3. 초음파 센서 기술

 

3.1. 초음파 센서 종류

- 아날로그 센서:

초음파 처프를 생성하고 해당하는 에코를 수신하며, 이후 디지털 형식으로 변환이 필요

* 시스템 설계자는 계산 시, 아날로그 --> 디지털 변환 지연을 고려해야함.

 

- 디지털 센서:

디지털 센서 모듈에는 통신 버스를 통해 마스터 시스템 MCU로 수치를 전송하기 전에,

거리를 수행하는 슬레이브 MCU를 포함하고 있습니다.

 

 

4. 어플리케이션

- 물체, 장애물, 사람 감지

- 레벨 측정

- 두께 측정

- 투명 물체 감지

- 릴 (Reel) 감지

- 바람 제어

- 건설 기계, 자동 도어 및 산업용 도어 감지

 

 

5. 장단점

장점 단점
물체 색상 및 투명도에 영향 없음
(유리, 물, 투명/반투명 타겟)
온도 및 습도에 영향을 받음
물체 감지 및 거리 측정을 위한 뛰어난 유연성 제공 물체의 위치를 나타내거나 모양이나 색상에 대한 정보를 얻을 수 없음
산업용 및 자동차용 제품에 적합 컴팩트한 제품에 적합하지 않음
전기적 잡음에 대한 높은 내성을 가지고 있음 진공 상태에서는 사용할 수 없음
배경 음향 잡음의 영향을 적게 받기 위해 처프를 전송하도록 설계 가능  
초당 여러번의 특정이 요구되는 제품에서 사용 가능  
구하기 쉽고 상대적으로 저렴함  

 

출처: https://www.freecon.co.kr/?act=board&bbs_code=solu&page=2&bbs_mode=view&bbs_seq=10

 


 

 

 

 

Vcc = 5VDC

Trig = 10us TTL신호를 전달 (MCU --> Sensor)

Echo = Echo back 신호 , pulse의 길이가 , 거리를 의미함

 

라이브러리 코드는 아래와 같다.

10us GPIO OUT High 유지구간에 따라서 출력이 나간다.

 

 

에코핀을 PulseIn이라는 아두이노 내부 함수로 읽는다. 해당 함수 원형은 밑에 첨부하였다.

이는 us단위로 해당 값을 반환해준다.

그 후 데이터시트처럼 값을 cm단위로 반환 받을 수 있도록 한다.

/*
  Ultrasonic.cpp - Library for HC-SR04 Ultrasonic Ranging Module.library

  Created by ITead studio. Apr 20, 2010.
  iteadstudio.com
*/

#include "Arduino.h"
#include "Ultrasonic.h"

Ultrasonic::Ultrasonic(int TP, int EP)
{
   pinMode(TP,OUTPUT);
   pinMode(EP,INPUT);
   Trig_pin=TP;
   Echo_pin=EP;
}

long Ultrasonic::Timing()
{
  digitalWrite(Trig_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  duration = pulseIn(Echo_pin,HIGH);
  return duration;
}

long Ultrasonic::Ranging(int sys)
{
  Timing();
  distacne_cm = duration /29 / 2 ;
  distance_inc = duration / 74 / 2;
  if (sys)
  return distacne_cm;
  else
  return distance_inc;
}