상세 컨텐츠

본문 제목

거미 로봇 만들기 #1

프로그래밍/Arduino & IoT

by ryujt 2015. 12. 18. 17:59

본문

아두이노로 거미 로봇 만들기 프로젝트를 시작합니다.  아래 동영상은 모든 서보 모터를 랜덤(무작위)으로 움직여 본 것 입니다.




우선 3D 모델의 소스는 아래의 링크에서 참고하였습니다.


시행착오를 통해서 제가 수정한 버전은 아래의 파일에 있습니다.

3D Model.zip



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

#include <Servo.h> 

#define servo_count 8
Servo servos[servo_count]; void setup() { for (int i=0; i<servo_count; i++) { servos[i].attach(i+2); servos[i].write(90); delay(1000); servos[i].detach(); } } void loop() { srand(millis()); for (int i=0; i<servo_count; i++) { servos[i].attach(i+2); servos[i].write(rand() % 180); delay(100); servos[i].detach(); } }
  • 1번 라인에서는 서보 모터를 다루는 기능 담겨진 파일을 포함(include) 시키도록 합니다.  이제 여러분들이 직접 서보 모터를 다루는 방법을 알지 못하더라도 미리 만들어진 기능을 이용해서 서보 모터를 쉽게 제어 할 수 있게 됩니다.
  • 2번 라인에서는 servo_count를 8로 정의(define) 합니다.  2번 라인 뒤에서는 servo_count라고 쓰더라도 컴퓨터(정확하게는 컴파일러)가 8이라고 받아들입니다.  다시 말해서, servo_count이라고 쓰던 8이라고 쓰던 같은 의미가 됩니다.  8이라고 쓰는 것보다 servo_count라고 쓰는 것이 좋습니다.  그 이유는,
    • 나중에 로봇의 다리가 바뀌더라도 2번 라인에서만 수정해주면 나머지 코드 부분은 수정 할 필요가 없습니다. 
    • 8이라고 쓰면 의미를 이해하기 어렵지만, servo_count라고 쓰면 서보 모터의 개수라는 것을 바로 알아 볼 수 있어서, 나중에 코드를 이해하는데 도움이 됩니다.
  • 5번 라인에서 Servo는 Servo.h에 담겨져 있는 서보 모터를 다루는 기능이 포함 된 일종의 박스입니다.  그런 박스를 servo_count만큼 즉, 8개 만들고 박스 위에 이름을 servos라고 적어둡니다.  이름이 모두 같으면 헛갈릴 수 있기 때문에 이름 뒤에 []를 붙이고, 순서대로 servos[0]. servos[1].  servos[2].  servos[3].  servos[4].  servos[5].  servos[6].  servos[7] 이렇게 8개의 박스가 만들어집니다.
  • 8번과 14번 라이은 for 반복문입니다.  괄호 안의 i가 0부터 7까지(servo_count보다 작을 때까지) 하나씩 숫자가 늘어나면서 반복하게 됩니다.
  • 9번 라인에서 i 번째 박스에 있는 attach() 라는 기능을 사용합니다.  서보 모터를 아두이노와 연결합니다.  이때 괄호 안에는 i+2 라고 되어 있는데, 반복문이 처음 실행 될 때에는 i가 0이기 때문에 servos[0].attach(2)라는 의미가 되며, "0번째 모터를 아두이노 2번 핀에 연결하라"라는 의미가 됩니다.  (컴퓨터 프로그래밍에서는 첫 번째를 0번째로 시작하는 경우가 많습니다)
  • 10번 라인에서는 write() 기능을 사용합니다.  서보 모터에 숫자를 써넣습니다.  즉, 서보 모터에게 숫자를 보내게 됩니다.  해당 숫자만큼의 각도로 모터가 돌아가서 멈추게 됩니다.  (서보 모터는 일반적으로 180 이하까지만 동작합니다)
  • 12번 라인에서는 그 상태를 1초 동안 유지하도록 합니다.
  • 13번 라인에서는 서보 모터와 아두이노의 연결을 제거합니다.  모터에서 힘이 빠지게 됩니다.  모터가 연결 되어서 각도를 주면, 그 각도를 계속 유지하기 위해서 모터가 계속을 힘을 주면서 각도를 유지하지만, 연결을 제거하면 손으로 움직였을 때 움직일 수 있게 됩니다.
지금까지(setup)의 코드가 실행 되면 모터가 모두 90도 각도의 위치로 이동하여 준비 상태가 됩니다.
  • 18번 라인에서 srand()가 실행되면, 무작위로 숫자를 뽑아내는 명령어(함수)인 rand를 사용하기 위해서 준비를 합니다.  srand의 괄호 안에는 숫자를 입력하도록 되어 있는데, millis()라고 하면 아두이노가 켜진 이후 지난 시간을 준비하기 위해 필요한 숫자로 사용하게 됩니다.
  • 19에서 25번 라인은 8번에서 14번 라인과 거의 같습니다.  틀린 부분은 21번에서 write 안에 "rand() % 180"을 넣는다는 것입니다.  rand()는 무작위로 아무 숫자가 나오게 됩니다.  % 는 앞의 숫자를 뒤의 숫자로 나눠서 나머지를 구하게 됩니다.  따라서, "rand() % 180"는 0에서 179까지의 숫자 중에 어떤 숫자가 나올 지 알 수 없게 됩니다. 

이제 프로그램을 실행해보면 처음에는 모든 모터가 90도 각도로 하나씩 움직였다가, 모든 모터가 계속 무작위로 움직이면서 위의 동영상처럼 동작하게 될 것 입니다.








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

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

관련글 더보기