프로젝트 09: 📡 SF 영화 속 그 기술, 초음파 레이더
서보 모터와 초음파 센서를 결합하여 주변의 장애물을 180도 스캔하는 감시 시스템을 구축합니다.
1. 프로젝트 원리: 스윕(Sweep) & 스캔(Scan)
레이더는 한곳만 보지 않습니다. 고개를 좌우로 돌리며 전체를 살펴야 하죠. 아두이노가 서보 모터를 1도씩 정밀하게 회전시키고, 그때마다 초음파 센서가 거리를 측정하여 "몇 도 방향에 몇 cm 거리에 물체가 있음"이라는 데이터를 생성합니다.
▲ 작동 매커니즘: 서보 모터가 회전하며 초음파 센서의 시야각을 확보합니다.
📦 준비물
아두이노 우노 x 1
초음파 센서 (HC-SR04) x 1
서보 모터 (SG90) x 1
브레드보드 & 점퍼 와이어
서보 모터 위에 센서를 고정할 접착제/테이프
2. 상세 회로 결선도 (Wiring Diagram)
서보 모터는 9번(PWM) 핀에, 초음파 센서는 2번(Trig), 3번(Echo) 핀에 연결합니다. 두 부품 모두 전력을 많이 소모하므로 전원선 연결 시 주의하세요.
▲ 레이더 결선도: 서보 모터 위에 초음파 센서를 단단히 고정하는 것이 하드웨어 구축의 핵심입니다.
3. 코드 작성하기
C언어의 for 반복문을 사용하여 각도를 조절하고, 사용자 정의 함수를 만들어 거리를 측정합니다.
#include <Servo.h>
Servo myServo;
int trigPin = 2;
int echoPin = 3;
void setup() {
myServo.attach(9);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Serial.begin(9600);
}
void loop() {
// 1. 15도에서 165도까지 오른쪽으로 스캔
for (int i = 15; i <= 165; i++) {
myServo.write(i);
delay(30); // 서보가 움직일 시간
int distance = calculateDistance();
sendData(i, distance);
}
// 2. 165도에서 15도까지 왼쪽으로 다시 스캔
for (int i = 165; i > 15; i--) {
myServo.write(i);
delay(30);
int distance = calculateDistance();
sendData(i, distance);
}
}
// 거리를 측정하는 함수
int calculateDistance() {
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return duration * 0.034 / 2;
}
// 데이터를 시리얼 모니터로 전송하는 함수
void sendData(int angle, int distance) {
Serial.print(angle);
Serial.print(",");
Serial.print(distance);
Serial.println("."); // 데이터 끝 표시
}
4. 프로젝트 핵심 분석
💡 왜 시리얼 모니터에 특별한 형식으로 출력하나요?
위 코드에서 데이터를 120,35. 처럼 보내는 이유는 나중에 **'프로세싱(Processing)'**이라는 프로그램을 사용해 컴퓨터 화면에 실제 레이더 맵을 그리기 위해서입니다. 컴퓨터는 이 데이터를 받아 각도(120도)와 거리(35cm)를 해석해 점을 찍게 됩니다.
- 스캔 범위: 서보 모터의 부하를 줄이고 선 꼬임을 방지하기 위해 15도~165도 범위를 사용하는 것이 좋습니다.
- delay(30): 모터가 물리적으로 회전하고 센서가 안정적으로 값을 읽기 위한 최소한의 대기 시간입니다.
5. 🎯 심화 챌린지: 경보 기능 통합
4장에서 배운 **경보기 프로젝트**를 기억하시나요? 레이더가 스캔하던 중 특정 거리(예: 10cm) 이내에 장애물이 포착되면 부저를 울리고 LED를 깜빡이게 기능을 추가해 보세요. 진정한 지능형 감시 레이더가 됩니다!