시간 개념을 넣은 모터 이동시간 개념을 넣은 모터 이동

시간 개념을 넣어서 코딩을 한다는게 무슨 뜻인가요?

우리의 프로그램은 순식간에 실행이 됩니다. 눈 깜짝할 사이에 프로그램이 순차적으로 실행이 되는데요, 우리가 모터에게 왼쪽으로 돌아라 라고 명령한 뒤, 바로 오른쪽으로 돌아라 라고 명령을 하게 되면 두 명령의 시간차이가 거의 0.0001초 미만입니다. 그렇다면 우리가 모터에게 처음에 명령했던 왼쪽으로 돌라는 지시는 0.0001초 만큼만 유효하고, 다시 이 모터는 오른쪽으로 돌기 시작하는 것입니다. 그래서 우리는 프로그램에게 잠깐 기다려 달라는 명령을 내려줌으로써 모터가 이동할 시간을 벌 수 있습니다.

그래서 어떻게 코딩을 하면 되나요?

가장 간단한 방법은 잠시 기다리라는 명령입니다. 이 방법 외에도 많은 방법이 있습니다. 시계를 바라보고 있다가 (아두이노 내부적으로 시계가 있습니다) 제가 미리 예약한 시간이 되면 그 때 되어서 그 명령을 수행하라고 할 수도 있습니다. 아주 정확하게 시간에 맞춰서 움직여야 할 때 사용하는 방법입니다. 하지만 우리는 그 정도까지 정확할 필요는 없습니다. 0.0001초의 오차 정도 허용할 수 있다면, 잠시 기다리게 하는 명령을 사용해도 무방합니다.

delay(멈출시간);

이라는 명령으로 우리는 잠시 프로그램을 멈출 수 있습니다. 아, 그렇다고 아예 아두이노가 아무 동작도 하지 않는 것은 아닙니다. 모터에 보내는 PWM 신호는 이 잠시 멈춤 명령과는 무방합니다. 마치 우리가 신경을 아예 쓰지 않고도 심장이 뛰는 것처럼 MCU(손바닥 컴퓨터의 두뇌)는 독립된 기능들이 있습니다. 다만 그 기능을 켜고 끄는 것은 프로그램에서 해 줘야 합니다. 위 코드를 가지고 프로그램을 짜 보겠습니다. 예전에 썼던 소스는 그대로 사용하고 단 몇 줄만 바꿔 보겠습니다.

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

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

void loop() {
  myservo1.write(0); // 서보 1번에게 0도로 이동하라고 명령 (왼쪽 모터)
  myservo2.write(0); // 서보 1번에게 0도로 이동하라고 명령 (오른쪽 모터)
  delay(1000); // 1000ms (1초 동안 여기서 대기)

  myservo1.write(90); // 서보 1번에게 90도로 이동하라고 명령 (왼쪽 모터)
  myservo2.write(90); // 서보 1번에게 90도로 이동하라고 명령 (오른쪽 모터)
  delay(1000); // 1000ms (1초 동안 여기서 대기)
}

loop 안에 있는 몇 줄만 바꿔 보았습니다. 예제 프로그램에서 바뀌는 것과 안바뀌는 것에만 주목하시면 됩니다. 참고로 loop 는 계속해서 반복한다는 의미입니다. 저 void loop(){ } 안에 있는 프로그램 내용을 반복한다는 것입니다. 예를 들어 void loop(){ Serial.println(“hello world!”); } 라고 프로그램을 작성한다면, 이 프로그램은 평생 hello world! 라고 계속 소리지르는 것입니다.

위처럼 코드를 작성하면 계속해서 저 프로그램을 반복하는데, 두 모터를 0도 위치로 보내는 신호를 만들어 내고, 1초동안 대기하다가 다시 90도로 보내는 신호를 만들어 내고 1초 동안 대기하게 됩니다. 아주 간단합니다. 그런데 한쪽 팔은 위로, 한쪽 팔은 아래로 움직이고 있군요, 왼쪽에 있는 모터는 90도에서 0도로 가야 팔을 내리는 것이고, 오른쪽에 있는 모터는 0도에서 90도로 가야만 팔을 내리는 것입니다. 그래서 다음과 같이 소스를 바꿔 보겠습니다.

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

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

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

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

이제 두 모터가 동시에 팔을 내리고 올릴 것입니다. 마치 드럼을 치는 것 같지요. 이렇게 시간을 개념을 넣은 모터 이동을 해 보았습니다. 그리고 스틱을 같은 방향으로 들고, 내릴 수 있도록 해 봤습니다. 다음 시간에는 모터를 따로 따로 컨트롤 할 수 있도록 해 보겠습니다.

You may also like...

Leave a Reply

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