프로그래밍 / C++ / 언리얼

Programming/Arduino

[Arduino] 아두이노 초음파 센서(HC-SR04) 3가지 예제를 통해 거리를 감지해보자

아트성 2020. 7. 19. 15:32

 

 

   초음파센서의 개요

 

초음파 센서는 20kHz이상의 높은 주파수의 소리를 내보내어 물체를 맞고 돌아오는 시간을 측정하여 물체의 유무감지, 감지거리 등을 측정하는센서다.

물체를 향해 내보내진 초음파는 물체에 따라서 일부물질은 초음파를 흡수하는 경우도 있기때문에 100% 정확하다고 할 수는 없다. 하지만 대부분의 고체성 물질은 신뢰도가 높은 편이다.

우리 실생활에서 흔히보는 식당의 자동문, 주차장의 차단기, 로봇청소기 이런것들이 초음파 센서를 이용한 사례들이다.

 

그럼 다음 예제를 통해서 초음파센서로 거리측정을 진행해보도록하자.

 

 

 

 

   초음파센서 라이브러리 NewPing 설치

 

먼저 초음파 센서를 아두이노 프로그램을 통해서 작동을 시키려면 프로그램 내에서 라이브러리를 설치를

해야된다. 

 

 

먼저 스케치 - 라이브러리 포함하기 - 라이브러리 관리로 들어간다.

 

 

그리고 초음파센서를 작동시키기위한 라이브러리인 "Newping"을 검색창에 입력을 한다.

 

 

초음파센서 라이브러리를 다운받은뒤에 다시 아두이노 창으로 넘어온다.

예제를 실행시키기 위해서 파일 - 예제 - NewPing을 차례대로 클릭한뒤 NewPingExample를 실행시킨다.

 

 

 

 

   예제실습 - 초음파센서 작동확인

 

#include <NewPing.h>

#define TRIGGER_PIN  12  
#define ECHO_PIN     11  
#define MAX_DISTANCE 200 

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

void setup() {
  Serial.begin(9600); // 
}

void loop() {
  delay(50);
  Serial.print("Distance : ");
  Serial.print(sonar.ping_cm());
  Serial.println("cm");       
}

 

초음파센서 라이브러리 예제를 실행시키고 나면 위 코드와 비슷하게 나올것이다. (위 필자의 코드와는 조금 다를 수 있다.) 위 코드는 시리얼 모니터를 통해서 초음파센서의 주파수값을 읽어들이는데 활용될것이다.

초기 Serial 통신값은 115200으로 설정되어있을텐데 이 값을 9600으로 바꾸어준다. 이 점만 주의해서 코드를 다시 재작성 하면된다. 

 

GND - GNDVCC- 5vEcho - D11 Trig - D12

 

회로구성은 위와 같이 하면된다.

초음파 센서는 VCC, TRIG, ECHO, GND 총4개의 포트로 구성되어있고, Echo포트는 디지털 11번핀에다가 설치해주면되고, TRig포트는 디지털12번 핀에다가 설치해주면된다.

 

 

컴파일을 진행시키고, 초음파센서에 손을 가져다 대면, cm값으로 위와같이 결과값이 나오는것을 확인할 수 있다.

 

 

 

 

   예제실습 - LCD를 이용해서 초음파센서의 거리값 나타내보기

 

우리가 시리얼 모니터로 일일이 거리값을 측정하는것은 매번 곤란한 일이므로, LCD를 활용한다면 언제어디서든 값을 읽어들일 수 있다. 이번에는 초음파센서와 LCD를 이용해서 거리감지를 LCD화면에 출력하는 예제를 알아보도록 하자.

 

GND(공통) - GND

VCC(초음파센서)- 5vEcho(초음파센서) - D11 Trig(초음파센서) - D12
VCC(LCD)- VinSDA(LCD) - A4 SCL(LCD) - A5

 

LCD도 초음파센서와 같이 총4개의 포트로 구성되어있고, 추가로 SDA는 아날로그4번핀에, SCL은 아날로그5번핀에 설치하도록 한다. LCD에 관한 설명은 아래 링크를 참조하도록 한다.

 

[아두이노]LCD 다양한 예제로 무한 응용하기(16x2_I2C방식)

위의 LCD(16x2)는 특이하게 아두이노 쉴드처럼 남땝처리가 되어있는데, 핀 구성이 기존의 LCD의 회로방식과는 다르게 되어있다. 이 방식은 I2C통신방식이다. SPI통신은 핀 연결만 10번을 진행하게 되�

artsung410.tistory.com

#include <NewPing.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

#define TRIGGER_PIN  12 
#define ECHO_PIN     11 
#define MAX_DISTANCE 200 

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {
  Serial.begin(9600); // 
  lcd.init();
  lcd.backlight();    
}

void loop() {
  lcd.setCursor(4,0);
  lcd.print("Distance");  
  lcd.setCursor(5,1);
  lcd.print(sonar.ping_cm());   
  lcd.setCursor(8,1);
  lcd.print("cm");      
  delay(300);
  lcd.clear();
}

 

LCD는 16x2타입으로 진행했다. 초음파센서로부터 신호를 받게되면 시리얼 모니터를 거치지 않고 아두이노 회로에서 바로  LCD로 출력하게끔 만든다.

 

 

컴파일을 진행시키면 위와같이 손을 가져다댈때마다 LCD화면에 거리값이 달라지는것을 확인할 수 있다.

다음 예제는 초음파 센서와 자동부저(Auto buzzer)를 이용해서 특정 거리값에 도달했을때 소리가 나도록 코딩을 해보도록 하자.

 

GND(공통) - GND

VCC(초음파센서)- 5vEcho(초음파센서) - D11 Trig(초음파센서) - D12

VCC(Buzzer)- D8

회로 구성은 LCD에 비해서 단순하다. 초음파센서의 회로에서 부저를 추가해서 디지털8번핀에 연결시켜주도록 한다.

 

#include <NewPing.h>

#define TRIGGER_PIN  12  
#define ECHO_PIN     11  
#define MAX_DISTANCE 200 

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 

void setup() {
  Serial.begin(9600);
  pinMode(8, OUTPUT);
}

void loop() {
  Serial.print("Distance : ");
  Serial.print(sonar.ping_cm());
  Serial.println("cm");
  if (sonar.ping_cm() < 5) {
    digitalWrite(8, HIGH);
  }
  else{
    digitalWrite(8, LOW);    
  }
  delay(300);
}

 

위의 코드에서 조건문을 활용해서 초음파센서에 손을 가까이 했을때 특정 값에 도달하면 부저가 울리도록 설정을 한다.

여기 조건문에서는 초음파센서 감지가 5cm미만일때 부저가 울리도록 설정을 해보았다.

위으 실험을 통해서 부저가 울리는지 파악해보도록 한다. 

 

초음파 센서를 잘 활용한다면,  위 사진과같이 로봇청소기의 원리인 장애물을 회피하는 로봇을 만들 수도 있다. 위의 키트도 여러가지 센서를 이용해서 제작이 되었는데 나중에 초음파센서를 활용해서 RC카 만드는법에 대해서 자세하게 다루어 보도록 한다.

 

반응형