DIY 주차 레이더 센서: 아두이노 우노 & HC-SR04 초음파 센서 3개
부품 및 소모품
| 부품명 | 수량 |
| 아두이노 우노 | 1 |
| 초음파 센서 HC-SR04 (일반) | 3 |
| 미니 배터리 디스플레이 (TM1651 칩 기반) | 2 |
프로젝트 소개
HC-SR04 초음파 센서 3개(좌/중/우)와 미니 배터리 디스플레이 2개로 만드는 DIY 주차 레이더 센서입니다. 배터리 디스플레이는 원래 배터리 잔량 표시용이지만, 여기서는 각 센서와 장애물 간 거리를 표시하는 용도로 활용합니다. 최대 거리 임계값을 코드에서 설정해, 그 이상이면 '충분한 공간'으로 간주해 디스플레이 최대 밝기로 표시하고, 미만이면 거리에 비례해 디스플레이 레벨이 변합니다.
부품 사진
점퍼 와이어와 브레드보드 추가 필요. 배터리 디스플레이는 TM1651 칩 기반.
작동 원리
3개 초음파 모듈: 오른쪽(R), 중앙(M), 왼쪽(L). 2개 디스플레이: 오른쪽, 왼쪽.
- 중앙 센서는 양쪽 디스플레이 모두에 영향
- 좌/우 센서는 각자 해당 측 디스플레이에만 영향
예: 오른쪽과 중앙에 장애물이 있으면 더 가까운 쪽을 해당 디스플레이에 표시. 중앙이 가장 가까우면 양쪽 디스플레이 모두 중앙 거리 반영. 오른쪽이 가장 가까우면 오른쪽 디스플레이는 낮게(가까움), 왼쪽은 높게(멂) 표시.
코드에서 설정 가능한 최대 거리(기본 20cm) 이상이면 안전 → 디스플레이 레벨 7(최대). 미만이면 0-20cm 거리를 0-7 레벨로 매핑해 표시.
시나리오 예시
여러 장애물 조합에 따른 디스플레이 동작 예시는 원본 프로젝트 이미지 참조. 마지막 케이스는 중앙+오른쪽(오른쪽 더 가까움), 왼쪽+오른쪽(오른쪽 더 가까움), 전방위(오른쪽 가장 가까움) 등에서 발생.
개선 아이디어
- 센서 추가로 커버 영역 확대
- 거리 수치 표시용 화면 추가
- 방수 센서(JSN-SR04 등)로 교체
- 경고음 추가
코드
Parking_sensor_v1.ino (아두이노)
/* HC-SR04 x3, TM1651 배터리 디스플레이 x2용 주차 센서 코드
최대 거리 이상이면 안전 표시, 미만이면 거리에 비례해 레벨 변경
자세한 건 www.SurtrTech.com 참조 */
#include <TM1651.h>
#define CLK 3 // 오른쪽 디스플레이
#define DIO 2
#define CLK2 5 // 왼쪽 디스플레이
#define DIO2 4
#define trigPin 6 // 중앙 초음파
#define echoPin 7
#define trigPinR 8 // 오른쪽 초음파
#define echoPinR 9
#define trigPinL 10 // 왼쪽 초음파
#define echoPinL 11
#define Maxdistance 20 // 최대 거리 20cm
long duration;
int distance;
TM1651 DisplayR(CLK, DIO);
TM1651 DisplayL(CLK2, DIO2);
void setup() {
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
pinMode(trigPinR, OUTPUT); pinMode(echoPinR, INPUT);
pinMode(trigPinL, OUTPUT); pinMode(echoPinL, INPUT);
DisplayR.init(); DisplayR.set(BRIGHTEST);
DisplayL.init(); DisplayL.set(BRIGHTEST);
}
void loop() {
int distanceM = CDistance(trigPin, echoPin);
int distanceR = CDistance(trigPinR, echoPinR);
int distanceL = CDistance(trigPinL, echoPinL);
int R = min(distanceM, distanceR); // 오른쪽 디스플레이: 중앙/오른쪽 중 최소
int L = min(distanceM, distanceL); // 왼쪽 디스플레이: 중앙/왼쪽 중 최소
if (R > 0 && R < Maxdistance) {
short LevelR = map(R, 0, Maxdistance, 0, 7);
DisplayR.displayLevel(LevelR);
}
if (R >= Maxdistance) DisplayR.displayLevel(7);
if (L > 0 && L < Maxdistance) {
short LevelL = map(L, 0, Maxdistance, 0, 7);
DisplayL.displayLevel(LevelL);
}
if (L >= Maxdistance) DisplayL.displayLevel(7);
delay(50);
}
int CDistance(int trig, int echo) {
digitalWrite(trig, LOW); delayMicroseconds(2);
digitalWrite(trig, HIGH); delayMicroseconds(10);
digitalWrite(trig, LOW);
duration = pulseIn(echo, HIGH);
distance = duration * (0.034 / 2);
return distance;
}
TM1651 배터리 디스플레이 라이브러리
GitHub 라이브러리 - 작업이 훨씬 수월해집니다.
회로도
회로도 이미지는 원본 프로젝트 페이지에서 확인 가능.