아두이노 HC-SR04 초음파 레이더: 서보와 프로세싱으로 실시간 시각화 구축
부품 및 소모품
| 아두이노 우노 |
× |
1 |
| HC-SR04 초음파 센서 |
× |
1 |
| 서보 모터 (SG90 등) |
× |
1 |
| 브레드보드 및 점퍼 와이어 |
× |
1 |
프로젝트 소개
HC-SR04 초음파 센서를 서보 모터에 장착해 180도 범위를 스캔하며, 거리 데이터를 실시간으로 PC의 프로세싱(Processing) 스케치에 전송해 레이더 화면처럼 시각화하는 프로젝트입니다.
회로 연결도
시스템 구성
- 아두이노 측: 서보 제어 + HC-SR04 거리 측정 → 시리얼 포트로 각도, 거리 전송
- PC 측 (Processing): 시리얼 데이터 수신 → 극좌표를 직교좌표로 변환 → 레이더 스윕 화면 그리기
아두이노 코드 핵심
#include <NewPing.h>
#include <Servo.h>
#define TRIGGER_PIN 2
#define ECHO_PIN 3
#define MAX_DISTANCE 150 // 최대 측정 거리 (cm)
#define SERVO_PWM_PIN 9
#define ANGLE_BOUNDS 80 // ±80도 범위
#define ANGLE_STEP 1 // 1도씩 이동
Servo myservo;
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
int angle = 0;
int dir = 1; // 1: 정방향, -1: 역방향
void setup() {
Serial.begin(9600);
myservo.attach(SERVO_PWM_PIN);
}
void loop() {
delay(50); // 측정 간격
// 서보 각도 설정 (-80~80 → 0~160 매핑)
myservo.write(angle + ANGLE_BOUNDS);
// 거리 측정 및 시리얼 전송
getDistanceAndSend2Serial(angle);
// 각도 업데이트 (경계에서 방향 반전)
if (angle >= ANGLE_BOUNDS || angle <= -ANGLE_BOUNDS) {
dir = -dir;
}
angle += (dir * ANGLE_STEP);
}
int getDistanceAndSend2Serial(int angle) {
int cm = sonar.ping_cm();
Serial.print(angle, DEC);
Serial.print(",");
Serial.println(cm, DEC);
}
핵심 포인트
- NewPing 라이브러리 사용으로 펄스 측정 간소화 및 타임아웃 처리
- 서보 각도:
myservo.write(angle + 80)로 -80°~+80°를 0°~160°로 매핑
- 시리얼 포맷:
각도,거리\n (예: 45,123\n)
delay(50)로 초당 약 20회 측정, 부드러운 스윕 구현
프로세싱(Processing) 측
GitHub 저장소에 전체 코드 제공:
- 아두이노:
Arduino_radar_server_arduino.ino
- 프로세싱:
Arduino_radar_client_processing.pde
프로세싱 코드는 좌우 왕복 2회 측정값의 평균을 내어 노이즈를 줄이고, 레이더 스윕 라인과 탐지 객체 점을 실시간으로 그립니다.
확장 아이디어
- 측정 각도/범위 조절 (ANGLE_BOUNDS, ANGLE_STEP 변경)
- OLED 디스플레이 추가로 독립형 장치화
- 다중 센서 융합으로 사각지대 해소
- 로봇 청소기나 보안 시스템에 적용
GitHub 저장소
https://github.com/faweiz/My-Arduino/tree/master/arduino_radar