보고서 + PPT 완성
자율주행 자동차 보조 안전 모듈
Arduino 기반 다중 센서 네트워크 시스템
─────────────────────────────────
팀명 : 1조
팀원 : 박선준, 길민준, 김아영
제출일 : [ 2026.03.06 ]
1. 프로젝트 개요
1.1 주제 및 선정 배경
최근 자율주행 및 첨단 운전자 보조 시스템(ADAS)이 빠르게 보급되고 있으나, 대부분의 상용 시스템은 거리 기반 충돌 회피에 집중되어 있다. 차량 주변의 급격한 조도 변화(터널 진입, 야간 골목), 실내 소음 급증, 온습도 이상과 같은 복합 환경 변화를 동시에 감지하고 경보하는 기능은 여전히 제한적이다.
또한 기존 ADAS는 위험 상황을 즉각 회피하는 데 초점을 두고 있어, 주행 중 발생한 근접 위험 이벤트나 환경 이상 데이터를 장기적으로 수집하고 분석하는 기능이 부족하다. 어느 구간에서, 어떤 환경 조건일 때 위험이 반복적으로 발생하는지를 파악하려면 별도의 데이터 레이어가 필요하다.
본 프로젝트는 이러한 한계를 보완하기 위해 Arduino + ESP8266 기반의 저비용 IoT 센서 모듈을 구성하였다. 4방향 초음파 센서로 근접 거리를 실시간 감지하는 동시에, 온도, 습도, 조도, 소음 데이터를 복합적으로 수집하여 이상 상황을 경보한다. 수집된 데이터는 WiFi(UDP)를 통해 PC로 전송되어 확인할 수 있다.
1.2 특화 포인트
거리 단독이 아닌 환경 데이터(조도, 소음, 온습도) 복합 감지 - 급격한 조도 저하, 경적, 충돌음 수준의 소음 급증 등 상황 인식 보조
감지된 이벤트를 PC로 실시간 전송하여 주행 데이터 수집 레이어 역할 수행
운전석 LCD, LED부저를 통한 즉각적인 물리 경보 출력
기존 차량 시스템과 독립적으로 동작하는 후장착 가능한 보조 모듈 구조
1.3 활용방안 및 기대 효과
수집된 근접 위험 이벤트 및 환경 데이터 분석을 통해 위험 발생 패턴 파악 가능
구형 차량 또는 ADAS 미탑재 차량에 저비용으로 보조 안전 기능 추가 가능
IoT 센서 네트워크 구조를 활용한 차량 환경 모니터링 시스템으로 확장 가능
1.4 시스템 구성 요약
| 모듈 | 역할 | 핵심 부품 |
| Board1 | 4방향 근접 거리 측정 + WiFi 전송 | HC-SR04 × 4, ESP8266 |
| Board2 | 환경 이상 감지 + WiFi 전송 | DHT11, 사운드 센서, LDR, ESP8266 |
| Board3 | 물리 경보 출력 + 버튼 입력 | LCD I2C, RGB LED × 3, 부저, ESP8266 |
| Python GUI | 실시간 데이터 수신 및 시각화 | PyQt5, UDP 소켓, requests |
| 장애물 회피 로봇 | 자율 주행 + 장애물 회피 | AF Motor Shield, DC모터 × 4, 서보, HC-SR04 |
2. 설계
2.1 전체 시스템 아키텍처
본 시스템은 4개의 Arduino 보드와 PC가 WiFi(UDP/HTTP) 프로토콜로 연결된 분산 IoT 구조로 설계되었다.
| 통신 방향 | 프로토콜 | 포트 | 데이터 포맷 |
| Board1 -> PC | UDP | 5000 | B1,F:23,B:45,L:12,R:67,MIN:12,LV:CLOSE |
| Board2 -> PC | UDP | 5000 | B2,T:28.5,H:65.0,L:420,S:300,LV:SAFE |
| Board3 -> PC | UDP | 5000 | EVT,BTN,7 / EVT,BTN,8 |
| PC -> Board3 | HTTP GET | 80 | http://{IP}/?code={코드번호} |
2.2 Board1 설계 - 초음파 센서 모듈
2.2.1 회로 설계
HC-SR04 초음파 센서 4개를 전, 후, 좌, 우측에 배치하고, 각 센서의 TRIG/ECHO 핀을 Arduino 디지털, 아날로그 핀에 직결하였다. ESP8266 ESP-01은 SoftwareSerial을 통해 AT 명령으로 제어한다.
| 부품 | 핀 | Arduino 연결 | 비고 |
| HC-SR04 전방 | TRIG / ECHO | A0 / A1 | 직결 |
| HC-SR04 후방 | TRIG / ECHO | A2 / A3 | 직결 |
| HC-SR04 좌측 | TRIG / ECHO | D2 / D4 | 직결 |
| HC-SR04 우측 | TRIG / ECHO | D7 / D8 | 직결 |
| RGB LED R | 신호 | D11 (PWM) | 220Ω 직렬 |
| RGB LED G | 신호 | D10 (PWM) | 220Ω 직렬 |
| RGB LED B | 신호 | D6 (PWM) | 220Ω 직렬 |
| ESP8266 TXD | -> Arduino RX | D3 (SoftSerial RX) | 직결 (3.3V->5V 허용) |
| ESP8266 RXD | <- Arduino TX | D5 (SoftSerial TX) | 직결 |
| ESP8266 VCC / CH_PD | 전원 | 3.3V | CH_PD 반드시 3.3V 연결 |
2.2.2 소프트웨어 설계
동작 흐름은 다음과 같다.
- 100ms마다 4방향 거리 측정 (pulseIn() 이용, 타임아웃 30ms)
- 최솟값 기준 등급 분류 -> RGB LED 색상 및 밝기 자동 제어
- 500ms 주기 또는 등급 변화 시 즉시 UDP 패킷 전송
- ESP8266 AT 명령 시퀀스: AT -> ATE0 -> AT+CWMODE=1 -> AT+CWJAP -> AT+CIFSR -> AT+CIPSTART -> AT+CIPSEND
| 등급 | 조건 (최솟값) | LED 동작 |
| SAFE | ≥ 60 cm | 초록 점등 |
| MID | 30 ~ 60 cm | 파랑 점등 |
| CLOSE | 10 ~ 30 cm | 주황 점등 |
| DANGER | < 10 cm | 빨강 300ms 주기 점멸 |
2.2.3 시스템 모델

2.3 Board2 설계 - 환경 위험 감지 모듈
2.3.1 회로 설계
DHT11 온습도 센서, 사운드 센서 모듈(아날로그 출력), LDR(포토레지스터)을 Arduino에 연결하였다. LDR은 10kΩ 저항과 전압 분배 회로를 구성하여 A0에 연결하고, 사운드 센서 아날로그 출력 핀(A0)은 A1에 연결하였다.
ESP8266 RXD 핀 보호를 위해 Arduino D3(TX) 출력을 10kΩ 저항 두 개로 전압 분배하여 ESP RXD에 2.5V를 인가하였다. (D3 -> 10kΩ -> 분압점(ESP RXD 연결) -> 10kΩ -> GND). ESP TXD는 D2에 직결하였다.
| 부품 | 핀 | Arduino 연결 | 비고 |
| DHT11 DATA | DATA | D4 | DHT 라이브러리 사용 |
| 사운드 센서 | AO | A1 | 직결 (아날로그) |
| LDR | 신호 | A0 | 10kΩ 전압 분배 회로 |
| ESP8266 TXD | -> Arduino RX | D2 (SoftSerial RX) | 직결 |
| ESP8266 RXD | <- Arduino TX | D3 (SoftSerial TX) | 10kΩ+10kΩ 분압 (5V->2.5V) |
| ESP8266 VCC / CH_PD | 전원 | 3.3V | CH_PD 반드시 3.3V 연결 |
2.3.2 소프트웨어 설계
- 2초 주기로 온도, 습도, 조도, 소음 측정
- 임계값 기준 초과 항목 존재 시 LV:ALERT, 모두 정상 시 LV:SAFE로 UDP 전송
- WiFi 연결 여부와 관계없이 Serial 모니터에 실시간 출력
| 센서 | 임계값 | 초과 조건 | 등급 |
| 온도 (DHT11) | > 30 °C | 초과 시 | ALERT |
| 습도 (DHT11) | > 70 % | 초과 시 | ALERT |
| 조도 (LDR) | < 300 / 1023 | 미만 시 | ALERT (어두움) |
| 소음 (사운드 센서) | > 550 / 1023 | 초과 시 | ALERT |
2.3.3 시스템모델

2.4 Board3 설계 - 출력 제어 보드
2.4.1 회로 설계
| 부품 | 핀 | Arduino 연결 | 비고 |
| I2C LCD (16×2) | SDA / SCL | A4 / A5 | 주소 0x27, LiquidCrystal_I2C 라이브러리 |
| 부저 | 신호 | D12 | tone() 함수 사용 |
| LED 빨강 | 신호 | D9 | 직결 |
| LED 노랑 | 신호 | D10 | 직결 |
| LED 초록 | 신호 | D11 | 직결 |
| 버튼 BTN7 | 신호 | D7 | 디지털 입력 |
| 버튼 BTN8 | 신호 | D8 | 디지털 입력 |
| ESP8266 TXD | -> Arduino RX | D2 (SoftSerial RX) | 직결 |
| ESP8266 RXD | <- Arduino TX | D3 (SoftSerial TX) | 직결 |
2.4.2 소프트웨어 설계
ESP8266을 AT+CIPMUX=1(멀티 링크) + AT+CIPSERVER=1,80(HTTP 서버) 모드로 초기화하는 동시에, AT+CIPSTART=0로 UDP 송신 소켓도 함께 유지하여 HTTP 수신과 UDP 전송을 병행한다.
| 수신 코드 | 의미 | LCD 표시 | LED |
| 20 | Board1 SAFE | SAFE | 초록 ON |
| 21 | Board1 MID | WARN | 노랑 ON |
| 22 | Board1 CLOSE | DANGER | 노랑 ON |
| 23 | Board1 DANGER | GOOD BYE | 빨강 ON |
| 30 | Board2 SAFE | ENV: SAFE | 초록 ON |
| 31 | Board2 WARN | ENV: WARN | 노랑 ON |
| 32 | Board2 DANGER | ENV: DANGER | 빨강 ON |
2.4.3 시스템모델

2.5 Python GUI 설계
PyQt5 기반 데스크탑 GUI로 UDP 수신 스레드(daemon)를 분리하여 메인 스레드 블로킹 없이 실시간 데이터를 수신한다. 스레드 간 통신은 PyQt5 Signal/Slot 패턴을 적용하였다.
- 초음파 페이지: 4방향 SensorBar 위젯, 중앙 등급 라벨, 색상 범례, LCD 전송 버튼
- 환경 페이지: 온도, 습도, 조도, 소음 QProgressBar 게이지, 상태 라벨, LCD 전송 버튼
- 페이지 전환: Board3 버튼 이벤트(EVT, BTN, 7/8) 수신 시 QStackedWidget 인덱스 변경
- HTTP 전송: requests.get() + 최대 5회 재시도, daemon 스레드로 실행하여 UI 블로킹 방지
2.5.1 시스템 모델

2.6 장애물 회피 로봇 설계
2.6.1 회로 설계
AF Motor Shield를 Arduino에 직접 적층하여 DC 모터 4개를 M1~M4 단자에 연결하였다. HC-SR04 초음파 센서 1개로 전방 거리를 측정하며, 서보모터는 D10에 연결하여 좌우 탐색에 활용한다.
| 부품 | 핀 | 연결 | 비고 |
| DC 모터 × 4 (M1~M4) | - | AF Motor Shield M1~M4 |
Shield가 D4, D7, D8, D12 사용 |
| 서보모터 | 신호 | D10 | Servo 라이브러리 사용 |
| HC-SR04 | TRIG / ECHO | TRIG=A5 / ECHO=A4 | 전방 단방향 측정 |
2.6.2 소프트웨어 설계
전방 거리 > 20cm 시 직진, 이하 시 정지 후 서보로 좌우 탐색하여 더 먼 방향으로 회전 후 직진을 재개한다. 좌우 거리가 동일한 경우 후진 후 좌회전하여 탈출을 시도한다.
| 조건 | 동작 |
| 전방 > 20cm | 4륜 FORWARD (직진) |
| 전방 ≤ 20cm | 정지 -> 서보 우(0°)/좌(170°) 탐색 -> 회전 |
| 좌 > 우 | 좌회전 350ms |
| 우 > 좌 | 우회전 350ms |
| 좌 = 우 | 후진 300ms -> 좌회전 500ms |
2.6.3 시스템 모델

3. 구현
3.1 개발 환경
| 항목 | 내용 |
| MCU | Arduino Uno R3 |
| WiFi 모듈 | ESP8266 ESP-01 (AT 펌웨어v0.9.2.2) |
| IDE | Arduino IDE 2.3.8 |
| 언어 (MCU) | C++ (Arduino Framework) |
| 언어 (PC) | Python 3.14 |
| GUI 프레임워크 | PyQt5 |
| 주요 라이브러리 (Arduino) | SoftwareSerial, DHT, LiquidCrystal_I2C, AFMotor, Servo |
| 주요 라이브러리 (Python) | socket, threading, PyQt5, requests |
| 통신 프로토콜 | UDP (센서 데이터 전송), HTTP (코드 수신) |
3.2 Board1 구현
3.2.1 거리 측정 함수
pulseIn()으로 ECHO 핀의 HIGH 지속 시간을 측정하고 음속(0.034 cm/μs)을 적용하여 거리를 산출한다. 타임아웃은 30,000μs(약 5m)로 설정하며, 타임아웃 시 999cm를 반환한다.
3.2.2 RGB LED 제어
analogWrite()를 사용한 PWM 출력으로 등급 구간 내에서 거리에 비례하여 밝기를 조절하고, 등급 전환 시 색상을 변경한다. DANGER 등급에서는 millis()를 이용한 논블로킹 점멸을 구현하여 loop() 블로킹을 방지하였다.
3.2.3 ESP8266 AT 명령 처리
espFlush()로 수신 버퍼를 200ms간 비운 후 AT 명령을 전송하고, atCmd()에서 기대 문자열 포함 여부를 타임아웃 내에 확인한다. udpSend()는 AT+CIPSEND로 '>' 프롬프트 획득 후 데이터를 전송하고 SEND OK를 대기한다.
3.3 Board2 구현
3.3.1 센서 데이터 수집
DHT 라이브러리의 readTemperature() / readHumidity()로 온습도를 수집하고, isnan() 검사로 읽기 실패 시 재시도 처리를 한다. LDR과 사운드 센서는 analogRead()로 0~1023 범위의 원시값을 직접 사용한다.
3.3.2 UDP 전송 포맷
전송 문자열 예시: "B2,T:28.5,H:65.0,L:420,S:300,LV:SAFE" - snprintf()로 구성하며 2초 간격으로 전송한다. LV 필드는 4개 임계값 중 하나라도 초과 시 ALERT, 모두 정상이면 SAFE로 결정된다.
3.4 Board3 구현
3.4.1 HTTP 서버 + UDP 동시 운용
AT+CIPMUX=1로 멀티 링크 모드를 활성화한 뒤 AT+CIPSERVER=1,80으로 HTTP 서버를 열고, 별도로 AT+CIPSTART=0으로 UDP 링크(링크 ID=0)를 생성하여 두 통신을 병행한다.
3.4.2 HTTP 요청 파싱
+IPD 수신 버퍼에서 'code=' 이후 두 자리를 파싱하여 정수 코드로 변환하고, 해당 코드에 맞는 LCD 메시지, LED 상태, 부저음을 출력한다.
3.5 Python GUI 구현
3.5.1 UDP 수신 및 파싱
별도 daemon 스레드에서 sock.recvfrom(2048)으로 패킷을 수신하고 첫 번째 필드 (B1 / B2 / EVT)로 분기한다. 파싱된 데이터는 pyqtSignal을 통해 메인 스레드 UI로 안전하게 전달한다.
3.5.2 시각화 위젯
SensorBar: QLabel을 색상으로만 표현하는 방향별 거리 표시 위젯. EnvGauge: QProgressBar + 수치 라벨 조합의 환경 센서 게이지. 색상은 dist_color() 함수로 거리 구간에 따라 결정된다.
3.5.3 HTTP 코드 전송
send_code() 함수는 requests.get()으로 Board3에 HTTP GET 요청을 전송하고, 실패 시 1초 간격으로 최대 5회 재시도한다. UI 블로킹 방지를 위해 daemon 스레드로 실행된다.
3.6 장애물 회피 로봇 구현
3.6.1 모터 및 거리 측정
AF_DCMotor 객체 4개를 MOTOR12_64KHz PWM으로 생성하고 속도를 180/255으로 고정한다. run()에 FORWARD / BACKWARD / RELEASE를 전달하여 방향을 제어하며, 좌우 회전은 양측 바퀴의 방향을 반대로 설정하는 차동 방식으로 구현한다. 거리 측정은 pulseIn() 반환값(μs)을 29로 나누고 2로 나누어 cm로 환산한다.
3.6.2 회피 알고리즘
장애물 감지 시 hc_sr4()로 모터를 정지하고 서보를 우(0°) -> 좌(170°) 순으로 회전하며 각 방향 거리를 측정한다. compareDistance()에서 두 값을 비교해 회전 방향을 결정하고 직진을 재개한다.
4. 테스트 결과
4.1 터미널(요약)
[UDP] 수신 대기중 192.168.0.133:5000
[UDP] B1,F:999,B:58,L:228,R:65,MIN:58,LV:MID
[UDP] B1,F:999,B:58,L:228,R:26,MIN:26,LV:CLOSE
[UDP] B2,T:23,H:49,L:625,S:30,LV:SAFE
[UDP] B2,T:23,H:49,L:696,S:31,LV:SAFE
[UDP] B1,F:999,B:58,L:229,R:126,MIN:58,LV:MID
[UDP] EVT,BOOT,OK
[UDP] B2,T:23,H:48,L:736,S:30,LV:SAFE
[UDP] B1,F:999,B:57,L:230,R:60,MIN:57,LV:MID
[UDP] B2,T:23,H:48,L:718,S:30,LV:SAFE
[UDP] B2,T:23,H:48,L:731,S:30,LV:SAFE
[UDP] EVT,BTN,8
[PAGE] 환경센서 페이지
[UDP] B1,F:999,B:58,L:230,R:64,MIN:58,LV:MID
[UDP] B2,T:23,H:49,L:722,S:30,LV:SAFE
[UDP] B1,F:999,B:57,L:230,R:61,MIN:57,LV:MID
[UDP] EVT,BTN,7
[PAGE] 초음파 페이지
[UDP] B2,T:23,H:49,L:727,S:56,LV:SAFE
[UDP] B1,F:999,B:57,L:230,R:64,MIN:57,LV:MID
[UDP] B2,T:23,H:49,L:738,S:30,LV:SAFE
[UDP] EVT,BTN,8
[PAGE] 환경센서 페이지
[UDP] B1,F:999,B:58,L:230,R:65,MIN:58,LV:MID
[UDP] B1,F:999,B:58,L:230,R:64,MIN:58,LV:MID
[UDP] EVT,BTN,7
[PAGE] 초음파 페이지
[UDP] B2,T:23,H:49,L:722,S:55,LV:SAFE
[UDP] B2,T:23,H:49,L:735,S:30,LV:SAFE
[UDP] B1,F:999,B:57,L:230,R:63,MIN:57,LV:MID
[UDP] EVT,BTN,8
[PAGE] 환경센서 페이지
[UDP] B2,T:23,H:48,L:723,S:31,LV:SAFE
[UDP] B1,F:999,B:58,L:231,R:53,MIN:53,LV:MID
[UDP] B1,F:999,B:58,L:230,R:54,MIN:54,LV:MID
[UDP] B2,T:23,H:48,L:740,S:31,LV:SAFE
[전송] SAFE → code=30
[UDP] B2,T:23,H:48,L:737,S:31,LV:SAFE
[UDP] B1,F:999,B:58,L:231,R:47,MIN:47,LV:MID
[UDP] B1,F:24,B:58,L:231,R:42,MIN:24,LV:CLOSE
4.2 GUI
4.2.1 초음파 화면


4.2.2 환경 센서 화면

5. 자체 평가
5.1 성과
- AT 명령만으로 ESP8266 WiFi 통신 완전 구현 (외부 WiFi 라이브러리 미사용)
- 3개 Arduino 보드와 Python GUI를 UDP/HTTP로 실시간 연동 성공
- PyQt5 Signal/Slot 패턴으로 멀티스레드 GUI 안정적 구현
- HTTP 서버 + UDP 클라이언트 동시 운용 (AT+CIPMUX=1 활용)
5.2 개선 방향
- 센서 데이터 DB 저장 및 시간대별 위험 패턴 분석 기능 추가
- Python GUI에 실시간 그래프(matplotlib) 추가로 데이터 시각화 강화
- ESP8266 대신 ESP32 사용 시 처리 속도 및 안정성 향상 기대
- HTTPS 적용으로 통신 보안 강화
5.3 소감
박선준
기존 esp모듈을 사용해서 통신할때 HTTP방식으로 통신을 하였으나 UDP 통신방식도 적용해보았다. 하지만 각 센서들이 pc서버에 통신을 보낼때 단일 스레드로 센서 데이터값을 받아 실시간성이 떨어졌다. 이러한 점을 극복하기위해 PC에서 따로 센서데이터값을 수신하는 기능들을 각 스레드로 분리하여 실시간성을 확보할 수 있었다. 초기에는 Git을 사용하여 형상관리를 하고싶었지만 Git에 관련한 기본지식이 아직까지 부족해 아쉬웠다. 또한 많은 센서들을 사용해보았지만 액추에이터를 많이 사용해보지 못한점도 아쉬웠다. 하지만 팀원들과 함께 문제를 해결해나아가는 과정에서 많은 것들을 배울 수 있었다. 특히 문제가 생기면 바로 소통을 한점이 가장 의미가 깊었다.
길민준
4방향 거리 측정과 ESP8266 AT 명령 기반 WiFi UDP 전송을 직접 구현하며 하드웨어와 소프트웨어가 맞물려 동작하는 IoT 시스템의 전체 흐름을 깊이 이해할 수 있었다. 장애물 회피 로봇은 센서와 모터, 서보가 유기적으로 연동되는 구조여서 디버깅 과정이 특히 흥미로웠다. 다만 시간적 여유가 부족하여 회피 알고리즘을 단순 좌우 비교 수준에서 마무리한 점이 아쉽다. 여유가 있었다면 거리 차이 임계값 조건을 추가하거나 전방 외 다방향 감지로 확장하여 완성도를 높일 수 있었을 것이다.
김아영
이번 프로젝트를 통해 센서와 통신 모듈을 활용한 시스템을 구현하는 과정이 즐거웠고 많은 것을 배울 수 있었다. 다만 시간이 더 있었다면 기능을 보완하여 더 좋은 프로젝트를 만들 수 있었을 것 같아 아쉬움이 남는다.
필기 시험(다음 조 배치를 위해, 불이익X)
9문제(객6, 단2,서1)
C++, SQL, Arduino 위주(이전 강사의 파이썬이나 데이터 시각화 등 관련 문제 안 나옴)
INSERT INTO users (name, age, city)
VALUES
('Kim', 25, 'Daegu'),
('Lee', 30, 'Seoul'),
('Park', 28, 'Busan');
//이런 형식으로 정답 적는 문제 있었는데 INSERT 생각 안나서 시작도 못함
C++, Arduino: 어느 정도 이해힌 상태(기초 수준) + 암기 필요
SQL: 제대로는 부트캠프 와서 처음이고, 이해는 됐는데 오히려 기초적인 부분도 암기 안됨 + SELECT, WHERE 같은 기본부터 외울것
다음주부터 리눅스, ROS 진행
'로보테크AI' 카테고리의 다른 글
| 융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/10 (0) | 2026.03.10 |
|---|---|
| 융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/09[Linux] (0) | 2026.03.09 |
| 융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/05 (0) | 2026.03.05 |
| 융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/04 (0) | 2026.03.04 |
| 융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/03 (0) | 2026.03.03 |