모터를 따로 따로 움직이는 기능 만들기

모터가 지금까지는 동시에 움직였습니다. 하지만 이제는 모터를 따로 따로 움직이도록 하겠습니다. 우리가 드럼을 칠 때 양손을 동시에 치는 것이 아니라 따로 따로 한 박씩 치는 것을 알 수 있습니다. 아주 가끔 강하게 치는 상황을 제외하고는 번갈아 가면서 연주하지요. 이 것처럼 로봇도 양 팔을 번갈아 가면서 연주를 할 수 있도록 하겠습니다.

우리가 C언어를 공부하지 않고 이렇게 로봇을 만드는 것은 어쩌면 무리일 수도 있습니다. 하지만 이 책에서는 최대한 프로그래밍 언어 설명 없이도 일단 로봇을 만들어 볼 수 있게끔 하는 것이 목표입니다. 그렇지만 이번에는 약간의 설명을 드려야 할 것 같습니다.

어떤 일을 할 때 몇 몇 일 단위를 묶어서 하나의 업무로 만들 수 있습니다. 예를 들어, 세탁기는 여러 기능들이 들어 있습니다. 그 기능들을 순차적으로 하나씩 동작하면서 결국 “빨래” 라는 업무를 마칠 수 있는 것이지요. “빨래”라는 업무에는 헹굼, 세탁, 헹굼, 탈수, 건조 등의 세부적인 기능의 집합이라고 할 수 있습니다. 하지만 우리는 이렇게 골치 아픈 내부 속사정을 알 필요 없이 그저 버튼 하나 누르면 됩니다. 이 것처럼 우리는 일련의 동작을 묶어놓고 나중에 그 동작들을 일일이 나열할 것이 아니라 버튼 하나 누르는 식으로 “빨래”를 할 수 있는 것이지요.

이런 개념을 프로그램에 응용한 것이 function (함수) 입니다. function 을 이용하면 아주 쉽게 프로그램을 작성할 수 있지요. 그리고 우리가 그 함수를 작성할 수도 있습니다.

빨래처럼 우리는 “왼팔내렸다 올려!”, “오른팔 내렸다올려!” 라는 function 을 만들 수 있습니다. 각각의 function 안에는 “팔을 내린다”. “조금 기다린다”. “다시 팔을 올린다” 라는 작은 일들을 순차적으로 하도록 하면 됩니다.

자, 이제 코드를 한 번 보겠습니다.

void LeftHit(){
  myservo1.write(90); // 서보 1번에게 0도로 이동하라고 명령 (왼쪽 모터) (팔을 내린다)
  delay(1000); // 1000ms (1초 동안 여기서 대기)
  myservo1.write(0); // 서보 1번에게 90도로 이동하라고 명령 (왼쪽 모터) (팔을 든다)
}

void RightHit(){
  myservo2.write(0); // 서보 2번에게 0도로 이동하라고 명령 (오른쪽 모터) (팔을 내린다)
  delay(1000); // 1000ms (1초 동안 여기서 대기)
  myservo2.write(90); // 서보 2번에게 90도로 이동하라고 명령 (오른쪽 모터) (팔을 든다)
}

위처럼 함수를 만들면 되는 것입니다. void 라고 하는 것은 신경쓰지 않으셔도 됩니다. 나중에 C 언어를 공부하시면 차차 알게 될 것입니다. 일단 이런 식으로 우리는 아두이노에게 우리는 이런 함수가 있고, 나중에 LeftHit(); 라는 명령어와 RightHit(); 라는 명령어로 동작을 실행할 것이라는 것을 알려주는 것입니다.

이제 한 번 위 함수를 사용해 볼까요?

#include <Servo.h>
Servo myservo1; // 첫 번째 서보모터
Servo myservo2; // 두 번째 서보모터

void LeftHit(){
  myservo1.write(90); // 서보 1번에게 90도로 이동하라고 명령 (왼쪽 모터) (팔을 내린다)
  delay(1000); // 1000ms (1초 동안 여기서 대기)
  myservo1.write(0); // 서보 1번에게 0도로 이동하라고 명령 (왼쪽 모터) (팔을 든다)
}

void RightHit(){
  myservo2.write(0); // 서보 2번에게 90도로 이동하라고 명령 (오른쪽 모터) (팔을 내린다)
  delay(1000); // 1000ms (1초 동안 여기서 대기)
  myservo2.write(90); // 서보 2번에게 0도로 이동하라고 명령 (오른쪽 모터) (팔을 든다)
}

void setup() {
  myservo1.attach(9); // 9번 핀을 서보1번이라는 이름으로 컨트롤 하겠음 (왼쪽 모터)
  myservo2.attach(10); // 9번 핀을 서보2번이라는 이름으로 컨트롤 하겠음
}

void loop() {
  LeftHit();
  delay(1000);
  RightHit();
  delay(1000);
}

이렇게 프로그램을 작성하면 위 동영상처럼 좌 우 모터가 각각 팔을 번갈아 움직이면서 드럼을 연주할 것입니다. 소스는 약간 복잡해 졌을지 모르지만 loop 안에 있는 소스는 굉장히 짧아졌습니다.

이렇게 만드는 이유가 뭔가요?

이렇게 만들지 않아도 되긴 합니다. 그냥 막 loop 안에 코드를 집어 넣을 수도 있는 것이지요. 하지만 우리의 명령을 블루투스로 전송할 것입니다. 그렇다면 우리는 그 명령에 따른 여러 가지 동작을 실행할 수 있어야겠지요. 그런데 그런 동작을 시키는 소스코드를 작성하면 생각보다 코드의 중복이 꽤나 많아집니다. 그런 중복이 많으면 많을 수록 코드는 보기 힘들어질 정도로 길어지지요.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *