본문 바로가기

메이킹/아두이노

초음파 센서(HC-SR04) 활용하기

반응형

오늘은 초음파센서와 LED를 제어해보겠습니다.

준비물

- 아두이노 우노

- 저항 : 220옴

- LED 소자

- 초음파 센서 : 귀에 들리지 않을 정도의 높은 주파수(약 20MHz)소리인 초음파를 발신 및 수신할 수 있는 센서이며

                         초당 340m의 속도를 갖고 있습니다. 주로 거리측정, 사물감지 등에 많이 활용됩니다.

 

초음파센서는 VCC와 GND핀을 통해 5V, 15mA의 전원을 입력받아 작동하여 Trig핀에서 초음파를 발신하고 발신된 초음파가 장애물에 부딪혀 수신부에 돌아오면 Echo핀에서 5V를 출력합니다. 이러한 원리로 거리=시간 X 속도 의 식을 이용하면 거리를 측정할 수 있습니다.

 

초음파센서

VCC : 5v 전압 연결

GND : 그라운드 핀

Trig :  초음파 발신

Echo : 초음파 수신

거리 구하는 공식

거리 = ((초음파속도 * 센서시간값) / 10000) / 2

따라서 속도가 초당 340m이므로

((float)(340 * duration) / 10000) / 2; 

소스코드에서 마이크로초 단위를 사용하는데 1초=1000밀리초, 1초=1000000마이크로초이며

10000으로 나눈 이유는 cm단위로 변환하기 위해서이며 2로 나눈 이유는 왕복거리이기 떄문입니다.

초음파 센서의 원리

 

1) 거리측정하기

회로도

초음파센서 연결하기

소스코드

#define trigPin 5
#define echoPin 6

void setup(){  
  Serial.begin(9600);       // 9600 보드레이트로 시리얼 통신 설정
  pinMode(trigPin, OUTPUT);  // 트리거 핀을 출력으로 설정
  pinMode(echoPin, INPUT);   // 에코 핀을 입력으로 설정
}

void loop(){

  float duration, distance;
  
  digitalWrite(trigPin, HIGH);  
  delay(10);  
  digitalWrite(trigPin, LOW);
  // Trig핀 10ms 동안 HIGH상태 유지

  
  // duration = echoPin 이 HIGH를 유지한 시간
  // = 초음파가 발사되었다가 반사되고 다시 돌아오기까지 걸린 시간
  duration = pulseIn(echoPin, HIGH);
  distance = ((float)(340 * duration) / 10000) / 2;  
  
  // distance = speed(음속 340m/s) * time(duration(μs))
  // m->cm *10^2, μs->s *10^-6, 단위환산을 위해 10^4을 나눠줌
  // 왕복거리이므로 다시 2로 나눔
  

  Serial.print("DIstance: ");  
  Serial.print(distance);  
  Serial.println("cm"); 

  delay(500);
}

센서에 움직임이 감지되면 아두이노에서 HIGH신호를 입력받아 LED를 켜고, 반대로 움직임이 감지되지 않으면 아두이노는 LOW신호를 입력받아 LED가 꺼지게 됩니다. 신호가 정상적으로 작동하는지 확인하려면 시리얼모니터를 확인해가며 센서의 가변부를 조절하여 딜레이 및 감지범위를 조절해주면 됩니다.

 

2) 거리측정하여 LED제어하기

회로도

초음파센서로 LED제어하기

소스코드

/*
초음파센서로부터 10cm 이내로 물체가 감지되었을때 LED가 켜지도록 만들어 봅시다.
 */
 
// 초음파센서의 송신부를 8번핀으로 선언하고 수신부는 9번핀으로 선언합니다.
int trig = 5;
int echo = 6;
 
// LED를 12핀으로 설정합니다.
int led = 12;
 
void setup() {
  Serial.begin(9600);
  pinMode(trig, OUTPUT);
  pinMode(echo, INPUT);
  pinMode(led, OUTPUT);
}

void loop() {
  digitalWrite(trig, LOW);
  digitalWrite(echo, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
 
  unsigned long duration = pulseIn(echo, HIGH);
 
  float distance = duration / 29.0 / 2.0;
 
  Serial.print(distance);
  Serial.println("cm");
 
  if (distance < 10) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }

  delay(200);   // 0.2초 동안 대기
  }

 

2) 거리측정하여 LED 여러개 제어하기

회로도

소스코드

int trig = 5, echo = 6;
int red = 12, green = 10, blue = 8;

void setup() {
  Serial.begin(9600);
  // 핀모드 설정
  pinMode(trig, OUTPUT);  // 초음파 발사하는 trig 핀은 OUTPUT
  pinMode(echo, INPUT);   // 초음파 받아들이는 echo 핀은 INPUT
  pinMode(red, OUTPUT);   // 빨간 LED
  pinMode(blue, OUTPUT);  // 파란 LED
  pinMode(green, OUTPUT); // 초록 LED
}

void loop() {
  float duration, distance; // 초음파 갔다가 돌아오는 시간과 거리 변수

  // 초음파 발사 
  digitalWrite(trig, HIGH); // 초음파 발사
  delay(1);   // 초음파 발사가 계속되지 않도록 제한
  digitalWrite(trig,LOW);

  // 초음파가 갔다가 돌아온 시간 저장
  duration = pulseIn(echo, HIGH); // trig 핀 HIGH ~ echo 핀 HIGH 사이의 시간 측정

  // 시간 → 거리(cm)로 환산
  distance = ((float)(duration * 340) / 10000) / 2;

  // 시리얼 모니터에 거리 출력
  Serial.print("Distance: ");
  Serial.print(distance);
  Serial.println("cm");

  // 거리에 따라 LED 제어
  if (distance <= 10){  // 10cm 이내
    digitalWrite(blue, LOW);
    digitalWrite(green, LOW);
    digitalWrite(red, HIGH);  // 빨간 LED on
  }else if(distance <= 20){ // 20cm 이내
    digitalWrite(blue, LOW);
    digitalWrite(green, HIGH); // 초록 LED on
    digitalWrite(red, LOW);
  }else {
    digitalWrite(blue, HIGH);  // 파란 LED on
    digitalWrite(green, LOW);
    digitalWrite(red, LOW);
  }
}
반응형