-
아두이노 레시피 : 초음파센서 - 기본편아두이노 레시피 2025. 2. 24. 09:16
# Recipe 10. 초음파 거리센서(HC-SR04)
초음파센서 및 적외선 거리센서로 만든 라이다 모듈 by arduinochef
(ps. 여러분은 이런 짓 하지 마요..ㅎ)
안녕하세요~ 아두이노 셰프입니다. 아두이노로 자동차를 만들면 대부분 두 가지였던 것 같아요. 블루투스 자동차. 아님 장애물회피 자동차.(얘들은 이걸 자율주행이라고 불렀지만요ㅋㅋㅋ) 위의 사진은 제가 고등학교 때 만들었던 자율주행자동차의 눈이 되어준 모듈이에요. 라이다센서가 너무 비싸서 말이죠.. 아무튼 프로젝트를 하다 보면, 실시간으로 물체와의 거리를 측정해야 하는 경우가 있어요. 물이 차오르는 수면의 높이라던지, 장애물과 자동차와의 거리 등 말이죠. 오늘은 거리센서 중 제일 유명한 초음파센서를 사용해 볼게요. 생각보다 정확하고 구현하기 꽤 쉬워요. 한번 따라와 보실까요?
오늘의 재료 Ingredient
<메인 재료>
초음파 거리센서(모델명 : HC-SR04)
<그 외 재료>
아두이노 우노
암-수 점퍼케이블(4개)
메이킹 방법 Steps
Step 1. 선 연결하기 Wiring
a. 센서의 VCC는 아두이노의 5V에,
b. 센서의 GND는 아두이노의 GND에,
c. 센서의 Trig는 아두이노의 D9번에,
d. 센서의 Echo는 아두이노의 D10번에 연결해 주세요.
- - - - - - - - - -
Step 2. 라이브러리 포함하기 pre setting
코드를 동작시키려면 라이브러리를 설치해줘야 해요.
Sketch -> Include Library -> Manage Libraries에 들어가서 라이브러리 매니저를 실행해 줍니다.
검색창에 newping을 검색해 주시고 설치해 주세요.
이제 모든 준비가 끝났으니 코드를 실행시켜 볼까요?
Step 3. 아두이노 코드 Code review
여러분의 요리가 훨씬 간편해질 수 있도록, 숙성이 필요한 코드는 언제나 제가 준비할게요ㅎㅎ
#include <NewPing.h> //센서를 사용하기 위해서 라이브러리를 가져올게요. #define TRIGGER_PIN 9 //9를 TRIGGER_PIN 이라고 정의할게요. #define ECHO_PIN 10 //10을 ECHO_PIN이라고 정의할게요. #define MAX_DISTANCE 400 //400을 MAX_DISTANCE라고 정의합니다. NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); //SimpleDHT11 라이브러리에서 제공하는 클래스로 dht11이라는 객체를 생성하는거에요. //역시 아직은 몰라도 좋아요. 뜻만 설명하자면 센서를 동작할 수 있는 라이브러리의 코드를 여기 이 소스코드와 연결하는 코드랄까요;; //아주 쉽게, "내가 사용할 센서의 핀은 9,10번이고 400cm가 최대범위야" 끝!ㅎㅎ float duration, distance; //duration, distance 라는 이름으로 실수 형식의 두 변수를 만들어줄게요. void setup() { Serial.begin(9600); //시리얼모니터를 써야되니까, 시리얼통신을 9600의 통신속도로 시작합니다. } void loop() { duration = sonar.ping(); // 초음파를 한번 보내고 받을때까지의 시간을 측정합니다. distance = (duration / 2) * 0.0343; //측정된 시간에 소리속력을 곱하고 2로 나눠줍니다. = 물체까지의 거리 Serial.print("Distance = "); //시리얼모니터에 값을 출력해볼까요? if (distance >= 400 || distance <= 2) //이 센서는 2~400cm의 범위를 가집니다. 그러니 만약 이 범위를 벗어난다면, 모니터로 알려줄게요. { Serial.println("Out of range"); } else //값이 범위안에 있다면 { Serial.print(distance); //시리얼모니터에 출력해줄게요. Serial.println(" cm"); } delay(500); //0.5초간 기다립니다. }
Step 4. 동작시키기 Working
● 코드를 아두이노 우노에 업로드해 주세요.(업로드 완료 후에도 USB선은 뽑지 않고 유지합니다.)
● 시리얼 모니터를 열어주세요.(값이 표시될 거예요.)
● 센서를 잘 고정하고 손이나, 물체를 가까이 가져가보세요. 거리가 잘 측정되나요?
오늘의 레시피는 여기까지입니다~ 더 깊은 맛을 원하시는 분은 아래 과학시즈닝을 참고해 주세요!
“과학으로 양념하기” Seasoning
센서에 대한 과학적 원리와 세부내용으로 레시피에 더 깊은 맛을 넣어봅시다.
- - - - - - - - - -
센서에 대하여
과학원리
소리 즉, 음파가 1초 동안 진동하는 횟수를 주파수라고 하는데요.
주파수에 따라 음파를 아래와 같이 나눌 수 있어요.
오늘은 그중 초음파에 대해서 간략하게 소개해볼게요.
1초에 20,000번 이상 진동하는 이 초음파는
다른 음파들과 다른 특성을 가지고 있어요.
초음파의 강한 에너지 덕에
일정한 방향으로 신호를 보낼 수 있고
(어려운 말로 지향성이 강하다고 해요)
매질이 다르면 빛처럼 반사, 굴절하는 성질이 있습니다.
이런 다양한 특성 덕분에
초음파영상, 리모컨, 배의 소나장비, 세척기 등
다양하게 사용된답니다~
(자, 과학시간 끝!ㅎ)
동작원리
이 초음파거리센서는
지향성이 강한 초음파의, 반사하는 성질을 이용합니다.
(뭔가 말이 어렵나요?ㅎㅎ)
측정원리를 알려드릴게요.
센서를 보면 ‘두 개의 스피커’(transducer)가 튀어나와 있죠?
그중 하나가 초음파를 보내면
나머지 하나가 반사되는 초음파를 받아요.
그리고 아두이노가 보내고 받기까지
얼마나 시간이 걸렸는지 계산해서
거리를 알아낸답니다.
어떻게 시간을 가지고 거리를 아냐고요?
간단한 물리공식을 알려드릴게요.
우리는 거리를 알고 싶죠?
소리의 이동시간은 센서 덕분에 알고 있고
속력만 알면 되는데...
소리의 속력은 이미 잘 알려져 있죠ㅋ
340m/s
센서는 마이크로초 단위로 처리하니까
우리도 그에 맞춰 값을 대입하자고요.
340m/s = 0.034 cm/µs
자, 그럼 정리하면
센서와 물체사이의 거리는
(0.034 x 시간[µs])/2이 되겠네요.
왜 2로 나누냐고요?
실제 센서가 읽은 시간은 ‘오고’, ‘간’ 시간이니까요.
구한 거리를 반으로 나눠줘야
물체까지의 거리가 되겠죠?
만약 초음파의 이동시간이 총 500 µs 라면
(0.034 cm/µs x 500 µs) / 2 = 8.5cm
물체까지의 거리는 8.5cm가 되겠네요.
이해 안 되면 원리는 몰라도 돼요~
어차피는 우리는 센서만 잘 사용하면 되니깧ㅎ
- - - - - - - - - -
코드의 동작 알고리즘
(주석을 참고해 주세요.)
알고리즘은 쉬운 말로 ‘진행절차’라고 할 수 있습니다.
코드가 어떻게 동작되는지 알아볼까요?
오늘도 간단하게
“읽고” “출력한다.” 에요.
위의 원리에서 나온
복잡한 처리과정들은 모두
라이브러리가 해주니까,
우리의 알고리즘은 어려울 게 없답니다~ㅋ
sonar.ping() 함수로
초음파가 오고 간 시간을 구하고
이를 공식에 대입해서 거리를 구해봤어요~
끝!
- - - - - - - - - -
센서요약 카드
이름 : 초음파 거리센서
설명 : 초음파를 이용해 거리를 측정하는 센서이다. 최소 2cm 최대 4m의 감지거리를 가졌으며, 오차범위는 3mm이다. 40KHz의 초음파를 사용한다.
센서의 구성 : VCC, GND, (초음파를 보내는) Trig, (초음파를 받는) Echo핀으로 구성되어 있다.
'아두이노 레시피' 카테고리의 다른 글
아두이노 레시피 : 온습도를 LCD로 출력하기 - 초중급편 (0) 2025.02.24 아두이노 레시피 : LCD 모니터 - 기본편 (0) 2025.02.24 아두이노 레시피 : 온도센서 - 기본편 (0) 2025.02.23 아두이노 레시피 : 블루투스 사용하기 - 기본편 (0) 2025.02.23 아두이노 레시피 : 온습도센서 사용하기 - 기본편 (0) 2025.02.23