로보테크AI

융합_로보테크 AI 자율주행 로봇 개발자 과정-26/03/05

steezer 2026. 3. 5. 18:30

자율주행 자동차

AFMotor.cpp, AFMotor.h 깃허브에서 다운로드

#include "AFMotor.h"
#include <Servo.h>

#define echopin A4 // echo pin
#define trigpin A5 // Trigger pin

Servo myservo;

const int MOTOR_1 = 1; 
const int MOTOR_2 = 2; 
const int MOTOR_3 = 3; 
const int MOTOR_4 = 4; 

AF_DCMotor motor1(MOTOR_1, MOTOR12_64KHZ); // create motor object, 64KHz pwm
AF_DCMotor motor2(MOTOR_2, MOTOR12_64KHZ); // create motor object, 64KHz pwm
AF_DCMotor motor3(MOTOR_3, MOTOR12_64KHZ); // create motor object, 64KHz pwm
AF_DCMotor motor4(MOTOR_4, MOTOR12_64KHZ); // create motor object, 64KHz pwm
//===============================================================================
//  Initialization
//===============================================================================

int distance_L, distance_F, distance_R;
long distance;

int set = 20;
 
void setup() {
  Serial.begin(9600);           // Initialize serial port
  Serial.println("Start");

  myservo.attach(10);
  myservo.write(90);

  pinMode (trigpin, OUTPUT);
  pinMode (echopin, INPUT );
  
  motor1.setSpeed(180);          // set the motor speed to 0-255
  motor2.setSpeed(180);
  motor3.setSpeed(180);
  motor4.setSpeed(180);
}
//===============================================================================
//  Main
//=============================================================================== 
void loop() {
 distance_F = data();
 Serial.print("S=");
 Serial.println(distance_F);
  if (distance_F > set){
   Serial.println("Forward");
  motor1.run(FORWARD);         // turn it on going forward
  motor2.run(FORWARD); 
  motor3.run(FORWARD); 
  motor4.run(FORWARD);
    }
    else{hc_sr4();}
}


long data(){
  digitalWrite(trigpin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigpin, HIGH);
  delayMicroseconds(10);
  distance = pulseIn (echopin, HIGH);
  return distance / 29 / 2;
}


void compareDistance(){
  if (distance_L > distance_R){
  motor1.run(BACKWARD);   // turn it on going left
  motor2.run(BACKWARD);
  motor3.run(FORWARD); 
  motor4.run(FORWARD); 
    delay(350);
  }
  else if (distance_R > distance_L){
  motor1.run(FORWARD);  // the other right
  motor2.run(FORWARD); 
  motor3.run(BACKWARD); 
  motor4.run(BACKWARD);
    delay(350);
  }
  else{
  motor1.run(BACKWARD);  // the other way
  motor2.run(BACKWARD);
  motor3.run(BACKWARD); 
  motor4.run(BACKWARD); 
   delay(300);
  motor1.run(BACKWARD);   // turn it on going left
  motor2.run(BACKWARD);
  motor3.run(FORWARD); 
  motor4.run(FORWARD); 
    delay(500);
  }
}

void hc_sr4(){
    Serial.println("Stop");
    motor1.run(RELEASE);         // stopped
    motor2.run(RELEASE);
    motor3.run(RELEASE);
    motor4.run(RELEASE);
   
    myservo.write(0);
    delay(300);
    distance_R = data();
    delay(100);
    myservo.write(170);
    delay(500);
    distance_L = data();
    delay(100);
    myservo.write(90);
    delay(300);
    compareDistance();
}

 

전체 완성

 

 

보고서 내용

 





프로젝트 결과 보고서

자율주행 자동차 보조 안전 모듈

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.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.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.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.6 장애물 회피 로봇 설계

 AF Motor Shield 기반 4륜 DC 모터와 서보모터 탐색으로 장애물을 자율 회피하는 로봇을 설계하였다.

 

부품 연결 비고
DC 모터 × 4 (M1~M4) AF Motor Shield 64KHz PWM, 속도 180/255
서보모터 D10 좌우 탐색용 (50° / 90° / 130°)
HC-SR04 TRIG=A5 / ECHO=A4 전방 거리 측정

 

 회피 알고리즘: 전방 거리 > 20cm → 직진 / ≤ 20cm → 정지 → 서보 좌우 탐색 → 더 먼 방향으로 회전 → 직진 재개

 

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 스레드로 실행된다.

 

4. 테스트 결과

4.1 Board1 테스트

ㅁㅁㅁ

4.2 Board2 테스트

ㅁㅁㅁ

4.3 Board3 테스트

ㅁㅁㅁ

4.4 Python GUI 통합 테스트

ㅁㅁㅁ

4.5 장애물 회피 로봇 테스트

ㅁㅁㅁ

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 소감

 

박선준

ㅁㅁㅁ

 

길민준

ㅁㅁㅁ

 

김아영

ㅁㅁㅁ

 

 

소감 + 테스트 + 영상은 내일 오전 중 마무리