레고 월-E 로봇 아두이노 나노로 만들기: 단계별 완벽 가이드
부품 및 소모품
| 부품 |
수량 |
비고 |
| 레고 월-E (21303, 단종으로 중고 구매 필요) |
1 |
|
| 아두이노 나노 R3 |
1 |
|
| DC 모터 (범용) |
2 |
|
| L298N 듀얼 모터 드라이버 |
1 |
|
| 바이컬러 LED (3핀, 적/녹) |
1 |
|
| 적외선 장애물 센서 |
1 |
거리 조절 나사 있음 |
| 부저 (멜로디 재생 가능) |
1 |
|
| 9V 건전지 |
1 |
|
| 저항 330Ω |
3 |
LED, 부저용 |
| 점퍼 와이어 |
20개 |
|
필요 도구
앱 및 온라인 서비스
프로젝트 소개
영화 <월-E>의 노란 주인공이 지구를 청소하는 모습을 모두 아실 겁니다. 이 프로젝트에서는 레고 월-E에 장애물 회피 기능을 심어줬습니다. 제 첫 전자공학 프로젝트이자 훌륭한 학습 경험이었습니다.
1단계: 코드 설계
소프트웨어 개발자 출신이라 원하는 동작을 먼저 코드로 구상했습니다.
- 평상시 전진 (최대 속도 255 PWM)
- 적외선 센서 감지 시 정지 → "으악" 소리 재생 → 좌/우 회전하며 경로 탐색
- 양쪽 다 막힘 → 후진하며 비프음 5회 → 랜덤 방향 회전 후 재출발
- 한쪽만 막힘 → 반대쪽으로 회전
- 둘 다 뚫림 → 랜덤하게 한쪽 선택
- 주기적으로 랜덤 턴 수행 (상호작용성 부여)
모터 정지 시 역기전압 스파이크로 부품 손상 우려가 있어, 리셋 후 2초 대기 후 동작 개시하도록 했습니다. 부팅 멜로디(C-E-G-C5) 재생 후 시작합니다.
적외선 센서는 뒷면 나사로 감지 거리 조절 가능해 별도 거리 계산 로직 불필요. 초음파 센서를 처음 고려했으나 눈 부분에 안 들어가 적외선으로 대체했습니다.
전체 스케치 (Wall_e_control.ino)
#define INFRA_RED 9
#define GREEN_LED 7
#define RED_LED 8
#define BUZZER 10 // PWM 핀 필수
#define MR_1 A1 // 오른쪽 모터 방향 1
#define MR_2 A2 // 오른쪽 모터 방향 2
#define MR_ENABLE 5 // 오른쪽 모터 속도 (PWM)
#define ML_1 A3 // 왼쪽 모터 방향 1
#define ML_2 A4 // 왼쪽 모터 방향 2
#define ML_ENABLE 6 // 왼쪽 모터 속도 (PWM)
const int NORMAL_SPEED = 255;
void setup() {
delay(2000); // 전압 스파이크 방지용 대기
pinMode(GREEN_LED, OUTPUT);
pinMode(RED_LED, OUTPUT);
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
pinMode(MR_ENABLE, OUTPUT); pinMode(MR_1, OUTPUT); pinMode(MR_2, OUTPUT);
pinMode(ML_ENABLE, OUTPUT); pinMode(ML_1, OUTPUT); pinMode(ML_2, OUTPUT);
pinMode(INFRA_RED, INPUT);
randomSeed(analogRead(0));
playHello();
}
void loop() {
driveForwards(NORMAL_SPEED);
digitalWrite(RED_LED, LOW); digitalWrite(GREEN_LED, HIGH);
if (digitalRead(INFRA_RED) == LOW) { // 장애물 감지 (LOW=감지)
digitalWrite(GREEN_LED, LOW); digitalWrite(RED_LED, HIGH);
stopDriving(); playUhOh();
// 좌측 확인
turnLeft(500);
boolean obstacleLeft = (digitalRead(INFRA_RED) == LOW);
delay(100); turnRight(500); delay(500);
// 우측 확인
turnRight(500);
boolean obstacleRight = (digitalRead(INFRA_RED) == LOW);
delay(100); turnLeft(500);
// 탈출 로직
if (obstacleLeft && obstacleRight) {
driveBackwards(NORMAL_SPEED/3);
for(int i=0;i<5;i++){ tone(BUZZER,1000,500); delay(1000); }
randomTurn(800,1600);
} else if (obstacleLeft) turnRight(1000);
else if (obstacleRight) turnLeft(1000);
else randomTurn(1000,1800);
}
// 랜덤 상호작용
if (random(100) == 0) randomTurn(200,2000);
}
// --- 모터 제어 함수들 ---
void driveForwards(int s) { digitalWrite(MR_1,LOW); digitalWrite(MR_2,HIGH); digitalWrite(ML_1,HIGH); digitalWrite(ML_2,LOW); setSpeed(s); }
void driveBackwards(int s){ digitalWrite(MR_1,HIGH); digitalWrite(MR_2,LOW); digitalWrite(ML_1,LOW); digitalWrite(ML_2,HIGH); setSpeed(s); }
void turnLeft(int d) { digitalWrite(MR_1,HIGH); digitalWrite(MR_2,LOW); digitalWrite(ML_1,HIGH); digitalWrite(ML_2,LOW); setSpeed(NORMAL_SPEED/2); delay(d); stopDriving(); }
void turnRight(int d){ digitalWrite(MR_1,LOW); digitalWrite(MR_2,HIGH); digitalWrite(ML_1,LOW); digitalWrite(ML_2,HIGH); setSpeed(NORMAL_SPEED/2); delay(d); stopDriving(); }
void stopDriving(){ digitalWrite(MR_1,LOW); digitalWrite(MR_2,LOW); digitalWrite(ML_1,LOW); digitalWrite(ML_2,LOW); digitalWrite(MR_ENABLE,LOW); digitalWrite(ML_ENABLE,LOW); }
void setSpeed(int s){ s=constrain(s,0,255); analogWrite(MR_ENABLE,s); analogWrite(ML_ENABLE,s); }
void randomTurn(int mn,int mx){ int d=random(mn,mx); if(millis()%2) turnRight(d); else turnLeft(d); }
void playHello(){ tone(BUZZER,262,250); delay(300); tone(BUZZER,330,250); delay(300); tone(BUZZER,392,250); delay(300); tone(BUZZER,523,500); delay(550); }
void playUhOh(){ tone(BUZZER,523,250); delay(300); tone(BUZZER,415,500); delay(600); }
2단계: 배선 및 조립
눈(적외선 센서) 장착
센서 분해 → 레고 핀을 센서에 순간접착제로 고정 (눈 위아래 움직임 가능) → 블루택(Blu-Tack)으로 레고 부품 재조립해 센서 감싸기

모터 및 휠 연결
모터에 납땜으로 와이어 연장 → 레고 테크닉 핀 대량 구매 → 모터 샤프트에 석고 붕대(플라스터 테이프) 감아 핀에 끼움 → 마찰로 풀리면 슈퍼글루로 보강

전자장치 수납
가슴 일부 개방해 LED 장착 → 모든 부품 배선 연결 → 모터 실드(L298N)가 배(복부)에 아슬아슬하게 수납됨


배선 다이어그램 (색상 코드)

- 빨강: 전원(+), 검정: 그라운드(-)
- 노랑: 적외선 센서 신호
- 주황/초록: 바이컬러 LED (적/녹)
- 보라: 모터 방향 제어
- 파랑: 모터 속도(PWM) — 프리칭 파트에 PWM 핀 없어 다이어그램상 떠 있는 것처럼 보임
전원 회로 설계 노하우
모터 실드에서 모터에 직접 전원 공급(최대 토크 확보)하면서 아두이노와 센서에도 5V 공급 필요 → 모터 실드의 5V 출력 핀을 아두이노 5V 핀에 입력으로 연결 (일반적으론 권장 안 하나, 이 실드는 정전압 5V 출력이라 안전). Vin 핀은 강압 레귤레이터가 있어 3.8V 정도로 떨어져 아두이노 구동 불충분. 대신 Vin으로 적외선 센서에 5V 공급.
3단계: 월-E 작동 영상
장애물 회피, 코너 탈출 테스트 영상 확인 (원문 링크 참조).
향후 개선 계획
- 케이블 정리 및 커넥터(분배기) 사용으로 배선 최적화
- 서보 모터 추가해 머리 회전 기능 구현
- 더 작은 모터 실드·보드로 교체해 복부 내 모든 부품 수납
그렇게 월-E는 영원히 행복하게 살았습니다. 끝.
회로도 (프리칭 파일)
wall-e2_3P6X71BCnP.fzz