아두이노 초음파센서(Ultrasonic Sensor)

 

 

초음파 센서는 약 20kHz이상의 높은 주파수의 소리를 보낸후 반사되어 돌아오는 시간차를 측정해서 거리를 알 수 있는 센서로. 초음파 센서를 이용하면 농도나 수위, 적설량 계측기, 후방감지 센서 등 다양한 콘텐츠를 만들어 볼 수 있습니다.

 


 

 

이번 포스팅에서 사용된 초음파 센서는 HC-SR04로 최대 측정 거리는 4m, 최소 측정거리는 2cm입니다. 

 

 

 

 

 

 

 

초음파 센서는 Trig핀에 연결된 압전소자에 전압을 가해서 초음파를 발생시키고 전방의 물체에 반사되서 돌아오는 음파를 Echo핀으로 받아서 전압을 발생시키는 구조 입니다. 목재, 콘크리트, 종이, 유리등의 단단한 물체는 초음파를 거의 100% 반사하지만 옷감과 같이 물질은 초음파를 흡수하기 때문에 정확한 측정값을 알기 어렵습니다.

 

그리고 초음파는 온도의 변화에도 결과값이 달라질 수 있기 때문에 정밀한 측정을 위해서는 온도에 따른 보정이 필요 합니다.

 

초음파를 거리로 계산하는 방법은 거리 = 속력 X 시간 공식을 이용합니다.

 



 

_____________________________________________​________________________

 

int trig = 2;

int echo = 3;

float duration;

float distance;

 

void setup() 

{

  Serial.begin(9600);

  pinMode(trig,OUTPUT);

  pinMode(echo,INPUT);

}

 

void loop() 

{

  digitalWrite(trig,HIGH);

  delay(10);

  digitalWrite(trig,LOW);

  duration = pulseIn(echo,HIGH);     //pulseIn함수의 단위는 ms(마이크로 세컨드)

  distance = ((34000*duration)/1000000)/2;

  Serial.print(distance);

  Serial.println("cm");

  delay(100);

}

 

_____________________________________________​________________________

 

  pinMode(trig,OUTPUT);
  pinMode(echo,INPUT);

초음파 센서의 핀모드는 Trig핀에서 초음파를 내보내기 때문에 OUTPUT으로 설정 하고 Echo핀으로 반사되는 음파를 받아들여 전압으로 변환 시키기 때문에 INPUT으로 설정해 줍니다.


duration = pulseIn(echo,HIGH); 

pulsIn함수는 pulsIn(핀번호핀상태)의 형태로 이루어져 있으며 핀 상태가 바뀌면 그때까지 경과한 시간을 ms(마이크로 세컨드)단위로 반환시켜줍니다. 다시말해서 pulsIn함수의 핀의 상태값을 HIGH로 지정하면 핀의 상태가 HIGH가 되는 순간부터 음파가 되돌아와 수신되면 Echo핀이 다시 LOW상태가 됩니다. 이때 HIGH 상태에서 LOW상태로 변경되기 까지의 시간을 리턴해주는것 입니다.

 

이를 바탕으로 위 코드를 해석해보면 아래와 같이 진행된다는 것을 알 수 있습니다.

trig(HIGH) - 초음파 발사 - trig(LOW) - 발사중지 - 물체에 맞고 돌아온 초음파를 echo(HIGH)핀으로 받음 - echo(LOW) - 거리계산 - 반복


 distance = ((34000*duration)/1000000)/2;

거리를 cm단위로 측정하기 위해서 소리의 속도(340m/s)와 초음파가 돌아온 시간(마이크로세컨드)를 계산한 식 입니다. 그리고 초음파가 발사되서 돌아오는 시간에 나누기 2를 해주어서 편도 거리를 계산합니다.

음파가 1cm 이동하는데 약 29us이기 때문에 distance = duration / 29 / 2; 로 계산 하게도 합니다.

 

아래는 초음파센서와 피에조부저, LED를 이용한 간단한 경보기를 만들어 보았습니다.

 

  

 

_____________________________________________​________________________

 

int trig = 2;

int echo = 3;

int buzzer = 8;

int LED = 9;

float duration;

float distance;

 

void setup() 

{

  Serial.begin(9600);

  pinMode(echo,INPUT);

  pinMode(trig,OUTPUT);

  pinMode(buzzer,OUTPUT);

  pinMode(LED, OUTPUT);

}

 

void loop() 

{

  digitalWrite(trig,HIGH);

  delay(10);

  digitalWrite(trig,LOW);

  duration = pulseIn(echo,HIGH);

  distance = ((34000*duration)/1000000)/2;

  Serial.print(distance);

  Serial.println("cm");

 

  if(distance < 20)

  {

    analogWrite(LED,255-(distance*12));

    

    tone(buzzer,1000,100);

    delay(100);

    tone(buzzer,1000,100);

    delay(100);

  }

  else

  {

    digitalWrite(LED,LOW);

  }

  

  delay(100);

}

 

_____________________________________________​________________________

 

if 문을 이용해서 거리에 따라 buzzer로는 경보음, LED로는 시각적인 경고 메세지를 표현했습니다. 

 

  •  21,810
  •  3
  •  0

... 2019-09-30 15:33:38

실험 해보고싶은데 실례가 안된다면 저항이랑 무슨 부저좀 알수있을 수 있을까요???

... 2019-09-30 15:34:27

댓글 달아주실수 있으신가요

. 2021-12-09 16:07:29

.


댓글을 남겨 주세요.