패스파인더: 아두이노 우노 기반 장애물 회피 로봇 키트 - 부품 및 제작 가이드
필요한 부품 및 소모품
- 아두이노 우노 (Arduino UNO) × 1 - 메인 컨트롤러
- 초음파 거리 센서 HC-SR04 × 1 - 전방 장애물 감지
- 리튬이온 배터리 1000mAh × 2 - 전원 공급
- RGB 확산형 공통 캐소드 LED × 1 - 상태 표시
- 부저 × 1 - 경보음
- 330Ω 저항 × 3 - LED 전류 제한
- USB A-B 케이블 × 1 - 프로그래밍/충전
- 점퍼 와이어 × 20개 - 배선
필요한 도구 및 장비
- 아두이노 마테리아 101 (3D 프린터) - 섀시 출력용
- 드라이버 세트 - 조립용
필요한 앱 및 온라인 서비스
- 아두이노 IDE - 코드 작성/업로드
- 오토데스크 퓨전 360 - 3D 모델링/수정
프로젝트 개요
자율 주행 장애물 회피 로봇 '패스파인더'의 설계 및 구현입니다. 아두이노 우노와 아다프루트 모터 쉴드 기반으로 아두이노 IDE에서 프로그래밍했습니다.
핵심 특징
- 초음파 센서를 마이크로 서보 모터에 장착해 180도 범위 스캔으로 정밀 장애물 탐지
- 자기 부저와 RGB LED로 감지 상황 및 모터 속도 4단계 시각/청각 표시
- 외부 제어 없이 완전 자율 내비게이션 수행
- 군사 작전 지원, 시각/청각 장애인 보조 기기 등으로 확장 가능
하드웨어 핀 매핑
#define BuzzPIN A0 // 부저 +
#define TrigPIN A1 // 초음파 Trig
#define EchoPIN A2 // 초음파 Echo
#define LEDBPIN A3 // RGB Blue
#define LEDGPIN A4 // RGB Green
#define LEDRPIN A5 // RGB Red
#define DCMROFF 25 // 좌/우 모터 속도 보정 오프셋
동작 알고리즘
전방 거리 측정 후 4구간으로 나누어 반응:
| 거리 구간 | LED 색상 | 부저 | 모터 속도 | 동작 |
| < 30cm | 빨강 | ON | 100 (저속) | 후진 → 좌/우 스캔 → 빈 쪽으로 회전 |
| 30~60cm | 파랑 | OFF | 150 (중저속) | 전진 |
| 60~90cm | 초록 | OFF | 200 (중고속) | 전진 |
| ≥ 90cm | 흰색 (RGB 모두 ON) | OFF | 250 (최고속) | 전진 |
장애물 발견 시(<30cm): 정지 → 후진 → 서보를 우측(12°)/좌측(160°) 회전해 거리 측정 → 더 먼 쪽으로 회전 → 동일 거리면 180도 회전.
전체 소스 코드
#include <AFMotor.h> // 아다프루트 모터 쉴드 라이브러리
#include <Servo.h> // 서보 라이브러리
#define BuzzPIN A0
#define TrigPIN A1
#define EchoPIN A2
#define LEDBPIN A3
#define LEDGPIN A4
#define LEDRPIN A5
#define DCMROFF 25
AF_DCMotor M1(1, MOTOR12_64KHZ); // 좌측 모터
AF_DCMotor M2(2, MOTOR12_64KHZ); // 우측 모터
Servo SER1; // 초음파 센서 서보
int Search() {
float duration = 0, cm = 0;
digitalWrite(TrigPIN, LOW); delayMicroseconds(2);
digitalWrite(TrigPIN, HIGH); delayMicroseconds(10);
digitalWrite(TrigPIN, LOW);
duration = pulseIn(EchoPIN, HIGH);
cm = duration / 58.8;
return (int)cm;
}
int RightDistance, LeftDistance;
float Distance = 0;
void setup() {
pinMode(BuzzPIN, OUTPUT);
pinMode(TrigPIN, OUTPUT);
pinMode(EchoPIN, INPUT);
pinMode(LEDBPIN, OUTPUT);
pinMode(LEDGPIN, OUTPUT);
pinMode(LEDRPIN, OUTPUT);
SER1.attach(10); // 모터 쉴드 서보 핀
}
void loop() {
SER1.write(80); delay(100); // 전방 정면
Distance = Search();
if (Distance < 30) { // 위험 구간
digitalWrite(BuzzPIN, HIGH);
digitalWrite(LEDBPIN, LOW); digitalWrite(LEDGPIN, LOW); digitalWrite(LEDRPIN, HIGH);
M1.setSpeed(100); M2.setSpeed(100);
ChangePath();
}
else if (Distance >= 30 && Distance < 60) { // 주의 구간
digitalWrite(BuzzPIN, LOW);
digitalWrite(LEDBPIN, HIGH); digitalWrite(LEDGPIN, LOW); digitalWrite(LEDRPIN, LOW);
M1.setSpeed(150); M2.setSpeed(150);
Forward();
}
else if (Distance >= 60 && Distance < 90) { // 양호 구간
digitalWrite(BuzzPIN, LOW);
digitalWrite(LEDBPIN, LOW); digitalWrite(LEDGPIN, HIGH); digitalWrite(LEDRPIN, LOW);
M1.setSpeed(200); M2.setSpeed(200);
Forward();
}
else { // 안전 구간
digitalWrite(BuzzPIN, LOW);
digitalWrite(LEDBPIN, HIGH); digitalWrite(LEDGPIN, HIGH); digitalWrite(LEDRPIN, HIGH);
M1.setSpeed(250); M2.setSpeed(250);
Forward();
}
}
void ChangePath() {
Stop(); Backward(); Stop();
SER1.write(12); delay(500); RightDistance = Search(); delay(500);
SER1.write(160); delay(1000); LeftDistance = Search(); delay(500);
SER1.write(80); delay(500);
CompareDistance();
}
void CompareDistance() {
if (RightDistance > LeftDistance) TurnRight();
else if (LeftDistance > RightDistance) TurnLeft();
else TurnAround();
}
void Forward() { M1.run(FORWARD); M2.run(FORWARD); }
void Backward() { M1.run(BACKWARD); M2.run(BACKWARD); delay(500); }
void TurnRight() { M1.run(BACKWARD); M2.run(FORWARD); M1.setSpeed(100+DCMROFF); delay(300); }
void TurnLeft() { M1.run(FORWARD); M2.run(BACKWARD); M2.setSpeed(100+DCMROFF); delay(300); }
void TurnAround(){ M1.run(FORWARD); M2.run(BACKWARD); M2.setSpeed(100+DCMROFF); delay(700); }
void Stop() { M1.run(RELEASE); M2.run(RELEASE); delay(100); }
커스텀 파트 및 회로도
- 섀시 3D 모델: 아두이노 마테리아 101로 출력 (퓨전 360 파일 별도 제공)
- 회로도: 아다프루트 모터 쉴드 기반 배선도 참조
청소년 창의 프로젝트 쇼케이스 출품작
이 프로젝트는 청소년 메이커 페어 'Youth Zest Project Showcase' 출품작으로, 자율 로봇의 기초 원리를 학습하기에 적합한 교육용 키트입니다.