WALTER: 아두이노 기반 4족 광향성 곤충 로봇
부품 및 소모품
| 부품 |
수량 |
| 스파크펀 아두이노 프로 미니 328 - 5V/16MHz |
1 |
| 초음파 센서 HC-SR04 (범용) |
3 |
| 포토다이오드 (광센서) |
4 |
| 저항 100kΩ |
4 |
| MG90S 메탈 기어 마이크로 서보 |
5 |
| 스마트폰용 휴대용 보조배터리 (2채널: 1A, 2.1A) |
1 |
필요 도구
앱 및 온라인 서비스
프로젝트 소개
[영어 실력 양해 바랍니다]
유튜브에서 인기 있는 '2 서보 아두이노 곤충 로봇'들을 보며, 그보다 훨씬 앞서 BEAM 로봇िक(아날로그 로봇) 창시자들이 더 자연스러운 보행(마이크로코어/바이코어 워커 등)을 구현했음을 떠올렸습니다. 하지만 그중에서도 마크 틸든(Mark Tilden)의 VBug1.5(워크맨)만큼 생동감 있어 보이는 로봇은 없었습니다. 5개 모터로 더 뛰어난 기동성을 보여주었기 때문입니다.
단순한 BEAM 로봇은 만들기 쉽지만, VBug1.5처럼 복잡한 구조는 전자 초보자(저 같은 공학도 지망생)에게 벅찬 일입니다. 그래서 아두이노 플랫폼을 선택했습니다. 비전공자에게 가장 접근하기 쉬운 길이니까요.
그 결과 탄생한 것이 WALTER입니다. 4족 보행에 서보 5개를 쓴 로봇이죠. "왜 8개나 12개 서보를 안 썼나?" 싶겠지만, 최소한의 부품으로 최대한의 기동성을 내는 게 목표였습니다. 프레임 가공 대신 글루건으로 조립하는 방식도 택했습니다.
주요 행동(Behaviors)
- 장애물 회피: HC-SR04 초음파 센서 3개(전면, 좌, 우)로 장애물 감지 및 회피
- 광향성(Photovore): 포토다이오드 4개(전면 좌/우, 후면 좌/우)로 빛을 감지해 빛 쪽으로 이동
- 자연스러운 동작: 랜덤 값으로 휴식 타이밍과 보행 속도(3단계)를 불규칙하게 변화시켜 생물 같은 느낌 연출
초기에는 각 발바닥에 택트 스위치를 달아 바닥 감지(표면 센서) 기능을 넣으려 했으나, 보조배터리 무게 때문에 서보가 버티기 힘들었고, 로봇 무게가 스위치를 누를 만큼 무겁지 않아 포기했습니다. 향후 버전 2에서는 더 강한 서보로 이 기능을 추가할 예정입니다.
회로도

소스 코드 (WALTER.ino)
서보 중앙값 캘리브레이션(**** 표시), 핀 할당(*** 표시), 튜닝 파라미터(** 표시) 등 수정 필요 지점을 주석으로 표시해 두었습니다. 주요 상수와 로직은 다음과 같습니다.
핵심 설정 상수
// 서보 중앙 위치(마이크로초 단위, writeMicroseconds 사용)
const int ANGLE_mid_Shaft = 1520; // 몸체 회전 서보
const int ANGLE_mid_FLeft = 1550; // 앞왼쪽 다리
const int ANGLE_mid_FRight = 1570; // 앞오른쪽 다리
const int ANGLE_mid_BLeft = 1450; // 뒤왼쪽 다리
const int ANGLE_mid_BRight = 1450; // 뒤오른쪽 다리
const int ANGLE_sweep = 250; // ** 서보 스윕 폭(보폭)
const int ANGLE_res = 10; // ** 서보 이동 해상도(마이크로초)
// 보행 속도 3단계 (값이 작을수록 빠름)
int sweepSPEED_Rand[3] = {4, 6, 8};
// 회전/회피 각도 제한
const int ANGLE_turnMAX = ANGLE_sweep * 1.5; // 빛 방향 최대 회전
const int ANGLE_turnNARROW = ANGLE_sweep * 0.25; // 좁은 공간 회피 회전
// 초음파/광센서 핀 할당 ***
const int PIN_trig[3] = {13, 11, 8}; // 전면, 좌, 우 Trig
const int PIN_ec[3] = {12, 10, 7}; // 전면, 좌, 우 Echo
const int PIN_PHOTO[4] = {2, 3, 1, 0}; // 전면좌, 전면우, 후면좌, 후면우 (아날로그)
// 장애물 회피 거리 임계값 **
const int distRotate = 25; // 회피 회전 거리(cm)
const int distRetreat = 10; // 후진 회피 거리(cm)
const int distTurn = 20; // 선회 회피 거리(cm)
주요 동작 로직
setup(): 서보 초기화, 초음파 센서 핀 설정, 랜덤 시드 생성, 초기 소나 읽기, 보행 시작 자세 랜덤 결정
loop(): 랜덤하게 REST()(휴식) 또는 RUN()(활동) 선택. 활동 시 3단계 속도 중 랜덤 선택
RUN(): 전방 거리 기준으로 FORWARD()(전진), ROTATE_LEFT/RIGHT_AVOID()(회피 회전), RETREAT_AVOID()(후진) 분기
SHAFT(): 몸체 서보(샤프트) 왕복 운동으로 보행 리듬 생성. 이동 중 초음파/광센서 읽기 및 회피 보정 수행
WALK() / ROTATE(): 4개 다리 서보 각도를 샤프트 위상에 맞춰 계산·구동
LIGHT_COMPARE_EXECUTE(): 전면/후면 포토다이오드 값 비교해 빛 방향 결정, 회전 보정량 산출
SIDE_AVOID(): 좌/우 초음파 거리로 측면 장애물 회피 보정량 산출
코드 사용 시 주의사항
- 서보 중앙값(****)은 실제 조립 후 반드시 캘리브레이션하세요.
- 핀 할당(***)은 본인의 배선에 맞게 수정하세요.
- 튜닝 파라미터(**)는 로봇 특성에 맞게 조정하세요.
- 제공 코드는 '있는 그대로' 제공되며, 사용 시 발생하는 문제에 대해 제작자는 책임지지 않습니다.
— 요하네스 마르테디 (Yohanes Martedi), 2015