안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊
오늘은 아두이노의 '눈'이 되어줄 초음파 센서에 대해 깊이 파고들어 볼 거예요. 박쥐가 어둠 속에서 자유롭게 날아다니는 원리를 아두이노에 적용해 보는 아주 흥미로운 시간이 될 겁니다. 이론 공부는 끝났으니, 이제 직접 회로를 만들고 코드를 작성하며 세상을 '보는' 아두이노를 만들어 봐요!
자, 그럼 시작해 볼까요?
02. 초음파 센서 회로 구성하기
앞서 배운 박쥐의 비행 원리와 '왕복 시간' 계산법, 모두 기억하시죠? 이제 그 이론을 아두이노에게 가르쳐 줄 시간이에요. 직접 회로를 연결하고 코드를 짜서 실제로 거리를 측정해 봅시다!
1. 회로 구성하기
가장 먼저 할 일은 아두이노와 초음파 센서를 연결하는 것이에요. 준비물부터 챙겨볼까요?
① 준비물
- 아두이노 UNO
- 초음파 센서 (HC-SR04)
- 브레드보드
- 점퍼선 4개
아주 간단하죠? 이 재료들로 아두이노에게 세상을 볼 수 있는 눈을 달아줄 거예요.
② 회로 구성
초음파 센서(HC-SR04)를 보면 다리가 4개 있어서 처음엔 조금 헷갈릴 수 있어요. 하지만 센서 앞면에 친절하게 각 핀의 이름이 적혀 있으니 걱정 마세요! 아래 그림을 보면서 차근차근 따라 해봅시다.
- 브레드보드에 센서 꽂기: 먼저 브레드보드 중앙에 초음파 센서를 꽂아주세요.
- 전원 연결:
Vcc핀은 아두이노의5V핀에 연결해요. 센서가 일할 수 있도록 밥(전원)을 주는 거예요.Gnd핀은 아두이노의GND핀에 연결해요. 전기 회로의 기준점이 되는 땅(Ground)이라고 생각하면 쉬워요.
- 신호선 연결:
Trig(Trigger, 방아쇠) 핀은 아두이노의 디지털 4번 핀에 연결해요. 아두이노가 센서에게 "지금이야, 소리 질러!" 하고 명령을 내리는 핀이에요.Echo(메아리) 핀은 아두이노의 디지털 3번 핀에 연결해요. 센서가 쏜 초음파가 어딘가에 부딪혀 돌아오는 소리(메아리)를 듣는 귀 역할을 하는 핀이죠.
잠깐! 🧐
"왜 하필 3번, 4번 핀인가요?" 좋은 질문이에요! 사실 다른 디지털 핀에 연결해도 괜찮아요. 하지만 우리가 앞으로 작성할 코드에서 "Trig는 4번, Echo는 3번이야!"라고 약속할 거기 때문에, 지금은 이 약속에 맞춰서 연결하는 거랍니다.
2. 소스 코드
회로를 완성했다면 이제 아두이노의 두뇌를 채워줄 코드를 작성할 차례예요. "4번 핀으로 초음파를 쏘고, 3번 핀으로 돌아오는 시간을 재서 알려줘!"라고 명령하는 코드죠. 이론 시간에 배운 '거리 = (속력 x 시간) / 2' 공식이 코드에 어떻게 녹아있는지 살펴보세요!
| 01 | // CODE 3.5 거리 측정기 코드 |
| 02 | |
| 03 | #define ECHO 3 |
| 04 | #define TRIG 4 |
| 05 | |
| 06 | void setup() { |
| 07 | pinMode(ECHO, INPUT); // 듣는 3번 핀은 '입력'으로 설정 |
| 08 | pinMode(TRIG, OUTPUT); // 보내는 4번 핀은 '출력'으로 설정 |
| 09 | Serial.begin(9600); // 컴퓨터와 통신 시작 |
| 10 | } |
| 11 | |
| 12 | void loop() { |
| 13 | // 1. 초음파 발사하기 (방아쇠 당기기) |
| 14 | digitalWrite(TRIG, LOW); |
| 15 | delayMicroseconds(2); |
| 16 | digitalWrite(TRIG, HIGH); // 4번 핀으로 초음파 발사! |
| 17 | delayMicroseconds(10); // 0.00001초 동안 유지 |
| 18 | digitalWrite(TRIG, LOW); // 발사 중지 |
| 19 | |
| 20 | // 2. 되돌아온 시간 재기 및 거리 계산 |
| 21 | long dist = (pulseIn(ECHO, HIGH)) / 58.2; |
| 22 | |
| 23 | Serial.println(dist); // 계산된 거리(cm) 출력 |
| 24 | delay(100); // 0.1초 잠깐 쉬기 |
| 25 | } |
[CODE 핵심 요약]
이 코드는 크게 발사, 측정, 계산의 3단계로 이루어져 있어요.
- 1-2줄: 헷갈리지 않게 3번 핀에는
ECHO라는 별명을, 4번 핀에는TRIG라는 별명을 붙여줬어요. - 5-7줄:
setup()함수에서 각 핀의 역할을 정해줘요. 소리를 보내는TRIG는 출력(OUTPUT), 소리를 듣는ECHO는 입력(INPUT)으로 설정하고, 결과를 컴퓨터 화면으로 보기 위해 시리얼 통신을 시작해요. - 12-16줄:
TRIG핀에 아주 짧은 시간(10마이크로초) 동안 전기를 "찌릿-" 하고 줘서 초음파를 발사시켜요. 이게 바로 방아쇠를 당기는 동작이에요. - 19줄: 이 코드의 핵심!
pulseIn()함수가 스톱워치처럼 초음파가 돌아올 때까지의 '왕복 시간'을 재요. 그리고 그 시간을 58.2라는 마법의 숫자로 나누면 바로 거리(cm)가 계산된답니다! - 20-21줄: 계산된 거리 값을
Serial.println()함수로 컴퓨터 화면(시리얼 모니터)에 보여주고, 0.1초마다 이 과정을 반복해요.
[RESULT]
코드를 업로드하고 아두이노 IDE의 오른쪽 위 돋보기 모양(🔍) 아이콘을 눌러 시리얼 모니터를 열어보세요. 센서 앞에 손바닥이나 책을 두고 앞뒤로 움직이면 거리에 따라 숫자가 실시간으로 변하는 걸 볼 수 있을 거예요! (단위는 cm랍니다.)
3. 아두이노 문법 : 초음파 센서 관련 함수
이번 실습에는 새로운 함수들이 등장했죠? pulseIn()과 delayMicroseconds(). 이 함수들이 어떻게 그렇게 정밀한 시간 측정을 가능하게 하는지, 그 비밀을 파헤쳐 볼게요.
① pulseIn() 함수 : "신호가 들어온 시간을 재줘!"
digitalRead()가 단순히 문이 열렸는지(HIGH) 닫혔는지(LOW) '상태'만 확인했다면, pulseIn() 함수는 한 단계 더 나아가 스톱워치를 들고 "문이 얼마나 오랫동안 열려 있었어?" 하고 '시간'을 정밀하게 재는 역할을 해요.
- 형식:
pulseIn(핀번호, 상태); - 동작: 지정한
핀번호의 신호가 특정상태(예: HIGH)로 바뀐 순간부터, 다시 원래 상태로 돌아올 때까지 걸린 시간을 마이크로초(µs, 100만 분의 1초) 단위로 측정해서 알려줘요. - 우리 코드에서는?:
pulseIn(ECHO, HIGH)는 ECHO(3번) 핀에 초음파가 돌아와서 신호가 HIGH로 바뀌고, 초음파가 지나가서 다시 LOW가 될 때까지의 시간을 측정해요. 이 시간이 바로 초음파의 '왕복 시간'인 거죠!
② delayMicroseconds() 함수 : "찰나의 순간을 멈춰라!"
우리가 평소에 쓰던 delay(1000)은 1초를 기다리라는 뜻이죠? 이 delay() 함수는 밀리초(ms, 1000분의 1초) 단위로 작동해요. 하지만 초음파를 제어하기엔 너무 긴 시간이랍니다.
delayMicroseconds() 함수는 이보다 1000배 더 정밀한 마이크로초(µs, 100만 분의 1초) 단위로 시간을 제어해요. 아두이노가 아주 정밀한 타이밍에 맞춰 동작할 수 있게 해주는 고마운 함수죠.
- 우리 코드에서는?:
delayMicroseconds(10)은 "정확히 0.00001초 동안만 신호를 유지해!"라는 뜻이에요. 초음파 센서(HC-SR04) 설명서에 "최소 10µs 동안 신호를 줘야 작동한다"고 쓰여 있거든요. 이 약속을 정확히 지키기 위해 이 함수를 사용한 거랍니다.
④ 거리 계산 공식 : "시간을 거리로 변환하라!"
long dist = (pulseIn(ECHO, HIGH)) / 58.2;
이 한 줄에 모든 과학이 담겨있어요. "왜 하필 58.2로 나누나요?" 하고 궁금했던 분들, 집중해 주세요!
- 단위가 안 맞아요!:
- 소리의 속도: 약 340 m/s (1초에 340미터)
pulseIn()이 잰 시간의 단위: 마이크로초(µs)- 우리가 원하는 거리의 단위: 센티미터(cm)
- 미터, 초, 마이크로초, 센티미터... 단위가 뒤죽박죽이라 바로 계산할 수가 없어요.
- 단위를 맞춰봅시다!: 소리의 속도를
cm/µs로 바꿔볼게요.- 340 m = 34,000 cm
- 1초 = 1,000,000 µs
- 소리 속도 = 34,000 cm / 1,000,000 µs = 0.034 cm/µs
- 즉, 소리는 1마이크로초 동안 0.034cm를 이동해요.
- 왕복이니까 반으로 나눠요:
pulseIn()이 잰 시간은 초음파가 '갔다가 돌아온' 왕복 시간이죠. 우리는 편도 거리만 필요하니까 속도를 미리 2로 나눠줘요.- 편도 속도 = 0.034 / 2 = 0.017 cm/µs
- 곱하기보다 나누기가 편해! (역수 취하기):
- 이제
거리 = 시간 × 0.017이라는 멋진 공식이 나왔어요! - 그런데 컴퓨터는 소수점 곱셈보다 나눗셈을 더 선호하는 경향이 있어요.
시간 × 0.017은시간 / (1/0.017)과 똑같죠?1 / 0.017을 계산해보면 약 58.8이 나와요.
- 이제
어? 책에는 58.2인데요?
맞아요! 그건 바로 온도 때문이에요. 소리의 속도는 온도가 높을수록 빨라져요. 우리가 보통 실습하는 실내 온도(약 20℃)를 기준으로 소리 속도(약 343m/s)를 다시 계산하면, 마법의 숫자 58.2가 딱 나온답니다!
Outro
어떠셨나요? 오늘은 초음파 센서를 이용해 아두이노로 거리를 재는 방법을 배워봤어요. 단순히 회로를 연결하고 코드를 복사하는 것을 넘어, pulseIn() 함수의 시간 측정 원리와 거리 계산 공식에 숨겨진 단위 변환의 비밀까지 파헤쳐 봤습니다.
이제 여러분의 아두이노는 세상을 '보는' 새로운 능력을 갖게 되었어요. 이 초음파 센서를 활용해서 장애물을 피하는 자동차, 가까이 다가오면 경고음을 내는 시스템 등 무궁무진한 프로젝트를 만들어 볼 수 있겠죠?
오늘 배운 내용이 조금 복잡하게 느껴졌더라도 괜찮아요. TRIG는 쏘는 핀(OUTPUT), ECHO는 듣는 핀(INPUT)이라는 것과, dist라는 변수에 최종 거리(cm)가 담긴다는 핵심만 기억하고 자유롭게 활용해 보세요!
궁금한 점이 있다면 언제든지 댓글로 질문해 주세요! 다음 시간에도 더 재미있는 아두이노 이야기로 돌아오겠습니다. 😊
이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초] **-** 페이지에 수록된 내용입니다.
댓글 없음:
댓글 쓰기