상세 컨텐츠

본문 제목

거미 로봇 만들기 #2

프로그래밍/Arduino & IoT

by ryujt 2015. 12. 19. 07:19

본문

거미로봇 프로토타입을 완성하였습니다.  다리가 너무 미끄러워서 끝 부분에 글르건으로 신반을 신겨주었더니 한 결 걸음 걸이가 나아졌습니다 ^^*





소소 코드는 다음과 같습니다.  (코드 설명은 아이들을 위해서 최대한 전문 용어를 피하고 쉬운 용어를 사용하려고 노력하였습니다)

#include <Servo.h> 

#define servo_count 8

Servo servos[servo_count];

int start_pos[servo_count] = {
   90,   90,   90,  90,
   40, 140, 155,  40
};

void setup() {
  for (int i=0; i<servo_count; i++) {
    servos[i].attach(i+2); 
    servos[i].write(start_pos[i]); 
    
    delay(500);
    servos[i].detach(); 
  }
}

void loop() {
  go_forward();
}

void set_angle(int no, float angle) {
    servos[no].attach(no+2); 
    servos[no].write(angle); 
    delay(100);
    servos[no].detach(); 
}

void set_start_position() {
  for (int i=0; i<4; i++) {
    servos[i].attach(i+2); 
    servos[i].write(start_pos[i]); 
  }
}

void right_front_start() {
  set_angle(5, start_pos[5]);
  set_angle(1, start_pos[1]);
}

void right_back_start() {
  set_angle(7, start_pos[7]);
  set_angle(3, start_pos[3]);
}

void right_front_forward() {
  set_angle(5, start_pos[5] - 40);
  set_angle(1, start_pos[1] + 40);
  set_angle(5, start_pos[5]);
}

void right_back_forward() {
  set_angle(7, start_pos[7] + 40);
  set_angle(3, start_pos[3] + 40);
  set_angle(7, start_pos[7]);
}

void left_front_start() {
  set_angle(4, start_pos[4]);
  set_angle(0, start_pos[0]);
}

void left_back_start() {
  set_angle(6, start_pos[6]);
  set_angle(2, start_pos[2]);
}

void left_front_forward() {
  set_angle(4, start_pos[4] + 40);
  set_angle(0, start_pos[0] - 40);
  set_angle(4, start_pos[4]);
}

void left_back_forward() {
  set_angle(6, start_pos[6] - 40);
  set_angle(2, start_pos[2] - 40);
  set_angle(6, start_pos[6]);
}

void go_forward() {
  right_front_forward();
  left_front_forward();
  
  right_back_forward();
  left_back_forward();

  right_front_start();
  left_front_start();

  right_back_start();
  left_back_start();
}
  • 7번에서 10번 라인에서는 각 서보 모터의 최초 위치(각도)를 정수(int)를 담는 박스 여러 개를 만들어서 저장하고 있습니다.  (5번 라인에서도 []를 통해서 여러 개의 박스를 한 거번에 만드는데 이것을 배열이라고 부릅니다.  박스는 변수라고 부릅니다)
  • 13번에서 19번 라인은 이미 http://ryulib.tistory.com/394 에서 다룬 코드와 비슷합니다.  다만, 최초 위치를 담아 놓은 start_pos 배열에 저장 된 각도로 모터를 움직이도록 합니다.  최초 위치가 모터마다 조금씩 다른 이유는 3D 프린트 된 결과물의 오차와 모터의 위치 때문입니다.
  • 23번에서는 go_forward() 함수를 호출하고 있습니다.  go_forward()는 84번에서 95번 라인까지입니다.
  • 85번부터 95번까지에서는 각 네 개의 다리를 앞으로 이동 또는 뒤로 이동하는 함수들을 호출하여 걷는 동작을 흉내내고 있습니다.  (동영상을 참고하시기 바랍니다)
  • 85번에서는 오른쪽 앞의 다리를 앞으로 보냅니다.
  • 86번에서는 왼쪽 앞의 다리를 앞으로 보냅니다.
  • 88번에서는 오른쪽 뒤의 다리를 앞으로 보냅니다.
  • 89번에서는 왼쪽 뒤의 다리를 앞으로 보냅니다.
  • 91번에서는 오른쪽 앞의 다리를 최초 위치로 보냅니다.  앞으로 갔다가 다시 뒤로 돌아오는 동작이 되면서 앞으로 전진하게 됩니다.  이후 다른 3개의 다리도 같은 원리로 동작하게 됩니다.
  • 다리를 원하는 위치로 이동하는 동작을 위해서 계속 반복해서 작성해야 하는 코드들을 set_angle() 함수로 묶어서 코드를 좀 더 간결하게 만들었습니다.





'프로그래밍 > Arduino & IoT' 카테고리의 다른 글

RC Car #2  (0) 2015.12.21
거미 로봇 만들기 #3  (0) 2015.12.19
거미 로봇 만들기 #1  (0) 2015.12.18
쿼드콥터 제작 #5 - IRL540  (0) 2015.12.17
WS2812 아두이노 연동  (0) 2015.12.08

관련글 더보기