아두이노 기반 4족 보행 로봇! 4족(Quadruped)은 거미처럼 네 다리로 걷는 로봇입니다. 거미의 보행 원리를 분석해 아두이노로 구현해 봅시다.
1단계: 필요 부품
아두이노 메가 또는 우노
구멍 뚫린 PCB (또는 커스텀 실드)
서보 모터 12개 (9g급)
HC-SR04 초음파 센서 1개
RGB LED 4개 (또는 단색 LED 12개)
골판지 (바디 프레임용)
2단계: 무게중심(CG) 유지 원리
보행 시 무게중심(CG)이 몸체 중앙에 머물러야 균형을 잡습니다. CG가 일정 범위 밖으로 벗어나면 넘어집니다.
모든 다리가 45°면 CG가 정중앙에 옵니다. 한 다리를 움직이면 CG가 그쪽으로 쏠려 넘어질 위험이 있습니다. 이를 방지하려면 양끝 다리 각도를 45°보다 크게 벌려 삼각형 지지 기반을 만들고, 그 안에 CG가 들어오게 한 뒤 나머지 한 다리를 자유롭게 움직여야 합니다.
3단계: 보행 시퀀스
시작 자세: C,D 다리 바깥으로 뻗고, A,B 다리 안쪽으로 당김
우전다리(B) 들어 올려 전방으로 뻗음
모든 다리 후방으로 밀며 몸체 전진
좌후다리(D) 들어 올려 몸체 옆으로 전진 (시작 자세의 거울상)
좌전다리(A) 들어 올려 전방으로 뻗음
모든 다리 후방으로 밀며 몸체 전진
우후다리(C) 들어 올려 몸체 쪽으로 당김 → 시작 자세로 복귀
4단계: 설계 도면
LEGS.pdf, BODY.pdf 파일을 참고해 다리와 몸체 파트를 레이저 커팅 또는 3D 프린팅하세요.
5단계: 몸체 조립
PDF 도면에 따라 몸체 프레임 조립
6단계: 회로 연결
아두이노 메가는 15개 PWM 핀 보유. 12개는 서보용, 3개는 RGB LED용, 2개는 초음파 센서용으로 사용. 필요에 맞춰 직접 실드 제작 권장.
7단계: 서보 초기화 (캘리브레이션)
아래 코드 업로드 후, 각 서보를 90° 중앙값으로 맞춰 다리 조립 기준점 잡기
#include <Servo.h>
Servo servo[4][3];
const int servo_pin[4][3] = { {10,11,2}, {3,4,5}, {6,7,8}, {9,12,13} };
void setup() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
servo[i][j].attach(servo_pin[i][j]);
delay(20);
}
}
}
void loop() {
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 3; j++) {
servo[i][j].write(90);
delay(20);
}
}
}
8단계: 최종 조립 및 메인 프로그램
메인 코드는 역기구학(Inverse Kinematics) 기반으로 다리 끝단 좌표를 계산해 서보 각도로 변환, FlexiTimer2 라이브러리로 50Hz 주기 서보 제어 루프를 돌립니다. 전진, 후진, 좌/우 회전, 손 흔들기, 악수, 바디 댄스 등 다양한 동작 내장.
/* 주요 상수 */
const float length_a = 55; // 대퇴골 길이
const float length_b = 77.5; // 경골 길이
const float length_c = 27.5; // 고관절 오프셋
const float length_side = 71; // 몸체 폭
const float z_absolute = -28; // 최저 높이
const float z_default = -50, z_up = -30, z_boot = z_absolute;
const float x_default = 62, x_offset = 0;
const float y_start = 0, y_step = 40;
const float y_default = x_default;
/* 핵심 함수 개요 */
void servo_service(); // 50Hz 타이머 인터럽트: 목표 좌표 향해 직선 보간
void set_site(leg, x, y, z); // 다리 끝단 목표 좌표 설정 + 속도 계산
void wait_all_reach(); // 모든 다리 목표 도달까지 블로킹 대기
void cartesian_to_polar(); // 직교좌표 → 극좌표 (역기구학 1단계)
void polar_to_servo(); // 극좌표 → 서보 각도 (다리별 기하 보정)
/* 동작 함수 */
void stand(); // 일어서기
void sit(); // 앉기
void step_forward(n); // n보 전진
void step_back(n); // n보 후진
void turn_left(n); // 제자리 좌회전 n스텝
void turn_right(n); // 제자리 우회전 n스텝
void hand_wave(n); // 앞다리 흔들기
void hand_shake(n); // 앞다리 악수
void body_dance(n); // 바디 댄스
LED 핀 연결 후 메인 코드 업로드하면 4족 로봇 완성!
소스 코드
메인 코드 (spider)
위 개요에 해당하는 전체 구현 코드. FlexiTimer2 라이브러리 필요.
캘리브레이션 코드 (spider_fix.ino)
// 다리 초기 위치 잡기용 - RegisHsu 2015-09-09
#include <Servo.h>
Servo servo[4][3];
const int servo_pin[4][3] = { {10,11,2}, {3,4,5}, {6,7,8}, {9,12,13} };
void setup() {
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++) {
servo[i][j].attach(servo_pin[i][j]);
delay(20);
}
}
void loop() {
for (int i = 0; i < 4; i++)
for (int j = 0; j < 3; j++) {
servo[i][j].write(90);
delay(20);
}
}