|
|
브레드보드 IO 3편, 아두이노, HC-SR04 초음파 센서로 거리 측정 + OLED 표시
민선생의 전자공방 ・ 2026. 5. 14. 21:21
브레드보드 활용 IO 인터페이스 3편
브래드보드로 구성해 실습하는 아두이노, HC-SR04 초음파 센서로 거리 측정 + OLED 표시
아두이노 + OLED(I2C) + HC-SR04 브레드보드 배선, [도면작성 툴: Wokwi]
민선생의 전자공방
blog.naver.com/hansikmin
초음파센서 구동회로
프롤로그: 25년 전 초음파 센서를 직접 만들었던 경험
초음파, 벌레 퇴치기는 초음파 발생기이다.
초음파(Ultrasonic)하면 흔히 초음파 세척기나 태아의 상태를 검사하는 초음파 검사를 먼저 떠올릴 것입니다.
사람의 가청 주파수는 약 20Hz~20kHz입니다. 초음파란 이보다 높은 주파수의 음파를 말합니다. 동물마다 들을 수 있는 주파수 범위가 다른데, 대개의 동물들은 자신의 최고 가청 주파수에 가까운 고주파음을 매우 싫어합니다. 초음파 벌레 퇴치기는 바로 이 원리를 이용한 것입니다.
| 동물 | 가청 주파수 | 비고 |
| 사람 | 20Hz ~ 20kHz | 초음파 기준점 |
| 개 | ~ 25kHz | 사람보다 높음 |
| 쥐 | ~ 25kHz | 초음파 퇴치 가능 |
| 다람쥐 | ~ 30kHz | 초음파 퇴치 가능 |
| 나방 | ~ 40kHz | 40kHz 초음파에 도망 |
| 박쥐 | 30 ~ 40kHz | 초음파로 방향 감지 |
| 돌고래 | 40 ~ 100kHz | 초음파로 소통 |
| HC-SR04 사용 | 40kHz | 사람에게 무음 |
예를 들어 나방의 경우 40kHz 대의 초음파를 내어주면 나방들이 도망갑니다. 모기나 벌레들도 최고 가청 주파수에 해당하는 초음파를 내어주면 접근하지 않습니다. 곤충에게 피해를 주지 않으려면 곤충의 가청 주파수보다 높은 주파수를 사용하면 됩니다. 25년 전 제가 만든 초음파 레이더 프로젝트에서도 44kHz로 발진하였으며, 이 주파수는 HC-SR04가 사용하는 40kHz와 거의 동일합니다.
25년 전 초음파 레이더를 만든 배경
지금으로부터 25년 전, 저는 학생들에게 마이크로프로세서 프로젝트 과제로 보여주려고 PIC 마이크로컨트롤러를 사용해 초음파 레이더를 만든적이 있습니다. 초음파로 장애물을 감지해서 포가 그쪽을 향하고, 레이더의 감지상태를 232 통신으로 PC에 전송해 비주얼베이직으로 화면에 정보를 표시하고 레이더를 제어하는 동작을 하게 만들었습니다. 단순한 LED 점멸이나 버튼 입력을 넘어, 초음파 거리 측정 + 서보모터 제어 + RS-232C 통신 + Visual Basic PC 모니터 프로그램까지 아우르는 종합 프로젝트 였습니다. 수업하며 학교일 하며 틈틈이 만들어 완성했었습니다.
당시 이 프로젝트는 지금과는 다르게 초음파 송파, 수파를 아날로그 IC를 사용해 구현했고, 수파기의 신호를 증폭하는 OP AMP 등 생각보다 완성하기 어려워서 오기로 완성했던 기억이 납니다.
| 📡 25년 전 초음파 레이더 프로젝트 구성 요소 |
① 초음파 발진부 : NE555 타이머 IC → 44kHz 초음파 8펄스 발생 ② 송파부 : 압전 세라믹 소자 + MC4069 NOT 게이트 구동 ③ 수파부 증폭 : JRC082 OP-앰프 → 미세 수신 신호 증폭 ④ 신호 정형 : LM324 비교기 → 아날로그 신호를 디지털로 변환 ⑤ MCU : PIC16F84 (4MHz 레조네이터) ⑥ 표시장치 : 시리얼 LCD (RS-232C 방식) ⑦ 서보모터 제어 : SMC(Servo Motor Controller) → 4개 RC 서보 동시 제어 ⑧ PC 인터페이스 : MAX232C → RS-232C → PC |
| ⑨ PC 모니터 프로그램: Visual Basic → 레이더 그래픽 표시 + 동작 제어 |
25년 전쯤(?), 제작한 초음파 레이더 시스템 완성 사진, 라인트레어서가 라인을 따라 돌때 초음파 센서로 감지해서 대공포가 가리키게 만들었습니다. 이 감지 상태와 목표와의 거리가 레이터처럼 컴퓨터에 표시되고 , 레이더 동작은 컴퓨터로 제어하게 만들었습니다... ㅎㅎ 그때 잘 동작하던 멋진 동작 영상을 찍어 놨어야 하는데.^^;.... 오래전이라 훗날 이렇게 블로그할 줄 알았으면 영상도, 사진도 많이 찍어 놓을걸 그랬습니다. ^^
비주얼 베이직으로 만든 초음파 레이더 감지 표시장치 및 제어 인터페이스 프로그램
시스템 전체 구성
초음파 레이더 시스템은 크게 5개 부분으로 나뉩니다. 마이컴 제어부, 초음파 레이더부, 대공포부, 디스플레이부, 컴퓨터 인터페이스부입니다. RC 서보모터를 구동원으로 하여 초음파 레이더를 회전시키고, 레이더에 포착된 물체를 대공포가 추적하며, 이 모든 데이터를 RS-232C를 통해 PC로 전송하고 PC에서 레이더를 제어하는 통합 시스템이었습니다.
자작 초음파 센서와 표시장치. 대공포 장치 ^^
당시 아크릴을 잘라 클로로포름(아크릴본드, 개구리 마취제) 사용해 아크릴을 붙여 구조물을 만들었습니다. 기판은 모든 연결에 커넥터를 사용해 나중에 정비가 가능하도록 제작하였습니다. 당시는 PCB설계에 능숙하지를 못해서(ㅎㅎ 지금도 마찬가지지만요) 납땜으로 회로를 제작하였습니다.
초음파 발생 및 수신회로
초음파 레이더 본체 후면 기판 납땜 작업 사진
완성된 기판이 장착된 사진
핵심 회로 구성과 동작 원리
회로는 동작에 비해 상당히 간단하게 구성되었습니다. LCD는 시리얼 LCD를 사용해 RS-232C 방식으로 명령코드와 데이터만 전달했고, TX선 하나만 연결하면 되었습니다. RC 서보모터는 컴파일사의 SMC(Servo Motor Controller)를 사용해 시리얼 통신선 하나로 최대 7개의 서보모터를 제어했습니다.
초음파 동작 순서는 다음과 같습니다. PIC16F84가 NE555의 4번 핀에 제어 신호를 보내 초음파를 발생시킵니다. MC4069 NOT 게이트로 위상을 반전시켜 송파 효율을 높입니다. 반사되어 돌아온 신호는 매우 미약하므로 JRC082 OP-앰프로 증폭한 후 LM324 비교기로 디지털 신호로 정형화하여 MCU에 입력합니다. MCU는 초음파를 쏜 시각과 수신한 시각의 차이로 거리를 계산하고, 이를 시리얼 LCD에 표시하는 동시에 MAX232C를 통해 PC로 전송합니다. 장애물이 감지되면 서보모터로 대공포를 해당 방향으로 향하게 합니다.
초음파 레이더 주회로도
당시 사용 부품 목록
| 부품명 | 용도 | 비고 |
| PIC16F84 | 메인 MCU | 4MHz 레조네이터, 마이크로컨트롤러 |
| NE555 | 초음파 발진 | 44kHz 발진회로, 4번핀으로 ON/OFF 제어 |
| MC4069 | NOT 게이트 | 송파기 위상 반전 → 송파 효율 향상 |
| JRC082 | OP-앰프 | 수신 미세신호 증폭 |
| LM324 | 비교기 | 아날로그→디지털 신호 정형 |
| MAX232C | RS-232C 변환 | PC 통신용 전압 레벨 변환 |
| SMC | 서보 컨트롤러 | 시리얼로 최대 7개 RC 서보 제어 |
| RC 서보모터 | 기계 구동 | 레이더 회전 + 대공포 추적 (4개) |
| 시리얼 LCD | 문자 표시 | RS-232C 방식 TX 1선 연결 |
| 압전 세라믹 | 송수파소자 | 직접 초음파 발생 및 수신 |
RC 서보모터와 스텝핑 모터의 차이 — 당시의 선택
레이더를 상하로 움직이는 틸팅 동작에 스텝핑 모터를 검토했지만 채택하지 않았습니다. 스텝핑 모터는 특정 각도 이동은 가능하지만 정지 토크가 부족해 레이더를 들어올린 상태에서 자중을 버티지 못해 적합하지 않습니다. 반면 RC 서보모터는 기동 토크가 크고 지정 각도를 유지하는 힘이 있어 레이더 틸팅, 수평 회전, 대공포 방향 제어 등 4개의 축을 안정적으로 제어할 수 있었습니다.
이 경험이 지금도 유효합니다. 위치를 유지해야 하는 부하가 있다면 스텝핑 모터보다 서보모터가 적합합니다. 서보모터의 강점이 위치제어와 위치 유지에 있습니다. 2편에서 다룬 SG90도 같은 원리입니다.
25년이 지난 지금 — HC-SR04 단 1개로
당시 수십 개의 부품으로 직접 구성했던 초음파 거리 측정 회로가 지금은 HC-SR04 모듈 하나로 완전히 대체됩니다. 모듈 내부에는 당시 필자가 외부 부품으로 구현했던 모든 회로가 집적되어 있습니다.
| 기능 | 25년 전 (직접 제작) | 현재 (HC-SR04 모듈 1개) |
| 초음파 발진 | NE555 + 외부 발진 회로 | 모듈 내장 자동 처리 |
| 송파 구동 | MC4069 NOT 게이트 | 모듈 내장 자동 처리 |
| 수신 증폭 | JRC082 OP-앰프 | 모듈 내장 자동 처리 |
| 신호 정형 | LM324 비교기 | 모듈 내장 자동 처리 |
| MCU 연결 | 복잡한 아날로그 회로 | Trig/Echo 디지털 2핀만 |
| 거리 계산 | PIC 어셈블리 코드 직접 작성 | pulseIn() 한 줄 |
| 총 부품 수 | 수십 개 | 모듈 1개 + 점퍼선 4개 |
| 비용 | 수만 원 | 약 500~1,000원 |
| 제작 기간 | 수일~수주 | 30분 |
| 💡 기술의 발전이 주는 교훈 25년 전 수십 개 부품으로 만들었던 회로가 지금은 모듈 하나로 해결됩니다. 하지만 원리는 하나도 변하지 않았습니다. 압전 효과 → TOF 방식 → 음속 340m/s → 거리 계산 원리를 알면 어떤 모듈이 나와도 바로 이해하고 활용할 수 있습니다. 이것이 기초 원리를 배우는 이유입니다 |
최신 초음파 센서 트렌드 (2024~2025)
HC-SR04 이후에도 초음파 센서 기술은 계속 발전하고 있습니다. 현재 시점에서 주목할 만한 최신 제품과 트렌드를 소개합니다.
| 모듈 | 특징 | 비고 |
| HC-SR04 | 2~400cm, 5V, 4핀 | 가장 널리 사용, 이 편 사용 모듈 |
| HC-SR04P | 2~400cm, 3~5V | 3.3V 시스템 호환 (라즈베리파이 등) |
| JSN-SR04T | 방수형, 2~600cm | 야외·수중 수위 측정 |
| VL53L0X | 레이저 ToF, ~2m | I2C, 초소형, 정밀도 높음 |
| TFMini Plus | LiDAR, ~12m | UART, 드론·로봇 활용 |
| 📌 초음파 vs 레이저 ToF — 언제 무엇을 쓸까? |
초음파 (HC-SR04): 저렴, 넓은 지향각, 부드러운 표면도 감지 → 근거리 장애물 감지 레이저 ToF (VL53L0X): 정밀, 빛 반사 재질에 유리, I2C → 정밀 거리 측정 LiDAR (TFMini): 장거리, 고속, 고가 → 드론/자율주행 이 콘텐츠에서는 가장 보편적이고 사용하기 쉬운 HC-SR04를 사용합니다. |
1장. 초음파 센서의 물리적 원리
1.1 압전 효과: 송파부와 수파부
송파부 (T) — 역압전 효과 (Inverse Piezoelectric Effect)
송파부는 전기 에너지를 기계적 진동(소리)으로 변환합니다. 압전 세라믹 소자에 40kHz의 고주파 전압을 가하면 소자가 수축과 팽창을 반복하며 진동하고, 이 진동이 공기를 매질로 초음파를 발생시킵니다. 25년 전에는 이 역할을 NE555 타이머 IC와 압전 소자 조합으로 직접 구성했습니다.
수파부 (R) — 압전 효과 (Piezoelectric Effect)
수파부는 반사되어 돌아온 기계적 진동을 전기 신호로 변환합니다. 물체에 반사된 초음파가 수파부의 진동판을 때리면 압전 소자에 미세한 압력 변화가 생기고 전위차가 발생합니다. 이 신호는 매우 작아 당시에는 JRC082 OP-앰프로 증폭해야 했습니다. HC-SR04 모듈에는 이 증폭 회로가 내장되어 있습니다.
| 📌 HC-SR04는 이 모든 과정을 모듈 내부에서 자동 처리합니다. 발진회로 + 증폭회로 + 신호 정형 회로가 모두 내장되어 여러분은 Trig핀과 Echo핀 2개만 다루면 됩니다. |
1.2 TOF(Time of Flight) 거리 측정 원리
초음파 센서는 소리가 발사되어 물체에 맞고 되돌아오는 시간(Time of Flight)을 측정하여 거리를 계산합니다. 음속은 공기 중에서 약 340m/s(상온 기준)입니다. 소리의 전파속도는 물 속에서 공기 중보다 약 5배 빠르고, 동일한 공기 중에서도 온도와 습도에 영향을 받지만, 일반 실내 환경에서는 340m/s를 기준으로 계산해도 실용상 충분합니다.
AI 활용
동작 순서
• ① 아두이노가 Trig 핀에 10μs 이상의 HIGH 신호를 줌
• ② HC-SR04 내부에서 40kHz 초음파 8펄스를 자동 송출
• ③ 초음파가 물체에 반사되어 돌아오면 수파부가 감지
• ④ Echo 핀이 HIGH 상태를 유지하며 왕복 시간을 알려줌
• ⑤ pulseIn() 함수로 Echo 핀의 HIGH 시간(μs) 측정
• ⑥ 거리 계산 공식으로 cm 단위 거리 산출
거리 계산 공식
| // 거리 계산 공식 // 음속 = 340 m/s = 34,000 cm/s = 0.034 cm/μs // // Echo HIGH 시간(μs) = 초음파 왕복 시간 // // 이론식: // distance(cm) = duration(μs) × 0.034 / 2 // = duration(μs) × 0.017 // // 실무 간략식 (나눗셈 한 번으로 연산 부하 최소화): // distance(cm) = duration(μs) / 58 // 이유: 2 / 0.034 = 58.8 ≈ 58 // // 계산 예시: // Echo = 580μs → 580 / 58 = 10cm // Echo = 1160μs → 1160 / 58 = 20cm // Echo = 2900μs → 2900 / 58 = 50cm |
| 💡 58로 나누는 이유 |
| distance = duration × 0.034 / 2 = duration / (2/0.034) = duration / 58.8 58.8을 반올림하여 58로 사용합니다. 정밀도가 필요하면 distance = duration * 0.017 을 사용하세요. |
2장. HC-SR04 센서 사양과 특징
2.1 핵심 사양표
| 항목 | 사양 | 비고 |
| 동작 전압 | DC 5V | 아두이노 5V 직접 연결 가능 |
| 동작 전류 | 15mA | 저전력 동작 |
| 동작 주파수 | 40kHz | 인체 비가청 영역 |
| 측정 거리 | 2cm ~ 400cm | 실무 권장 200cm 이내 |
| 측정 각도 | 15도 미만 | 지향성 주의 |
| 입력 신호 | 10μs TTL 펄스 | Trig 핀 트리거 신호 |
| 출력 신호 | TTL 레벨 펄스폭 | Echo 핀 수신 시간 |
| 측정 정밀도 | ±3mm | 근거리 정밀 측정 |
2.2 실전 주의사항
• 최솟값 2cm: 그보다 가까운 물체는 오동작. 센서 앞에 최소 2cm 여유 확보
• 지향성 15도: 센서 정면 기준 15도 이상 벗어난 물체는 Echo가 돌아오지 않을 수 있음
• 반사면 재질: 딱딱한 평면 잘 감지, 스펀지·솜 같은 흡음재는 감지 거리 급감
• 수평 배치: 센서가 기울어지면 초음파가 엉뚱한 방향으로 반사 → 오측정 발생
• GND 공통: 아두이노와 센서 GND 반드시 공통 연결
| ⚠️ 민선생 실전 팁 (주의사항) |
| 25년 전이나 지금이나 수평 배치와 GND 공통이 가장 중요합니다. 측정값이 튀거나 이상하면 먼저 센서 수평을 확인하세요. |
| 실내 벽 측정은 안정적이나, 사람·동물처럼 곡면+흡음 특성이 있으면 오차가 커집니다. |
3장. 회로 배선
3.1 준비물
• Arduino Uno R3
• SSD1306 OLED 모듈 (0.96인치, I2C, 4핀) — 1편 배선 그대로
• HC-SR04 초음파 센서
• 브레드보드
• 점퍼 와이어 (OLED 4개 + HC-SR04 4개, GND·5V 공유 가능)
3.2 핀 연결표
| 부품 | 부품 핀 | 아두이노 핀 | 비고 |
| OLED | VCC | 5V | 1편 배선 그대로 |
| OLED | GND | GND | 1편 배선 그대로 |
| OLED | SDA | A4 | 1편 배선 그대로 |
| OLED | SCL | A5 | 1편 배선 그대로 |
| HC-SR04 | VCC | 5V | 전원 |
| HC-SR04 | GND | GND | 접지 |
| HC-SR04 | Trig | D7 | 초음파 발사 트리거 (출력) |
| HC-SR04 | Echo | D6 | 왕복 시간 수신 (입력) |
3.3 회로 구성도
아두이노 + OLED(I2C) + HC-SR04 브레드보드 배선, [도면작성 툴: Wokwi]
아두이노 + OLED(I2C) + HC-SR04 브레드보드 배선
4장. 소스코드 (상세 주석 포함)
4.1 동작 설명
HC-SR04로 거리를 측정하고 OLED에 세 가지 정보를 동시에 표시합니다.
| 표시 항목 | 내용 |
| 숫자 거리 | 현재 거리(cm)를 큰 글자(TextSize 2)로 표시 |
| 막대 그래프 | 거리에 비례하는 수평 바 그래프 (0~40cm 기준) |
| 상태 메시지 | NEAR(10cm 이하) / OK(10~30cm) / FAR(30cm 초과) |
| 측정 주기 | 200ms마다 갱신 (초당 5회, millis() 비블로킹 방식) |
4.2 OLED 화면 레이아웃
| Y 위치 | 크기 | 표시 내용 |
| y=0 | TextSize(1) | ULTRA SONIC 타이틀 |
| y=10 | ───── | 가로 구분선 |
| y=14 | TextSize(1) | 상태 (NEAR / OK / FAR / OUT OF RANGE) |
| y=24 | TextSize(2) | 거리 숫자 (예: 25 cm) — 큰 글자 |
| y=44 | ───── | 구분선 |
| y=47 | 막대 그래프 | 거리 비례 바 그래프 (0~40cm) |
| y=57 | TextSize(1) | 스케일 표시 (0cm ~ 40cm) |
초음파센서 구동회로
4.3 전체 소스코드
// === // 민선생의 전자공방 - 브레드보드 IO 인터페이스 3편 // HC-SR04 초음파 센서 거리 측정 + OLED 표시 // 파일명:
의 소스를 참조해 주세요
브레드보드 IO 3편, 아두이노, HC-SR0.. : 네이버블로그
5장. 핵심 코드 해설
5.1 pulseIn() 함수
pulseIn()은 지정한 핀이 HIGH 또는 LOW 상태를 유지하는 시간을 마이크로초(μs) 단위로 측정하는 아두이노 내장 함수입니다.
// pulseIn(pin, state, timeout) // pin : 측정할 핀 번호 // state : HIGH or LOW // timeout : 최대 대기 시간(μs), 초과 시 0 반환 (선택) long duration = pulseIn(ECHO_PIN, HIGH, 30000); // Echo 핀이 HIGH로 유지된 시간(μs) 반환 // 30ms 내 신호 없으면 0 반환 → 측정 범위 초과
5.2 millis() 비블로킹 방식
delay() 대신 millis()를 사용하면 측정 대기 중에도 다른 작업이 가능합니다. 나중에 버저·LED 경보를 추가할 때 이 구조가 유용합니다.
// delay() 방식(블로킹)- 대기 중 아무것도 못함 // delay(200); ← 나쁜 예 // millis() 방식 (비블로킹) — 다른 처리와 병행 가능 if (now - prevTime >= MEASURE_MS) { prevTime = now; // 측정 코드 }
"정밀한 측정이 필요하다면 나중에 배울 온습도 센서로 음속을 보정하거나, 값이 튀는 현상을 소프트웨어적으로 잡아주는 필터링 기술이 필요하지만, 지금은 이 원리를 이해하는 것만으로도 충분합니다!"
다음 과제 예고
다음 4편에서는 DHT11 온습도센서로 측정한 데이터를 OLED에 대시보드 형태로 표시하는 프로젝트를 진행합니다.
• DHT11 온습도 센서 동작 원리
• DHT11 온습도 센서 연결 및 사용법
• OLED를 사용한 온습도 대시보드 화면 구성
태그#아두이노#아두이노기초#아두이노강좌#HCSR04#초음파센서#OLED#SSD1306#아두이노실습#아두이노코딩#메이커교육#전자공학#브레드보드#민선생의전자공방#거리측정#취미공학#include#define 태그수정
