아두이노 서보모터 정지 코드 - adu-ino seobomoteo jeongji kodeu

모터는 우리 주변에 없는 곳이 없다고 할 정도로 많이 사용되고 있는 기기다.

그렇기 때문에 모터의 종류도 다양하게 있다.

먼저 우리가 일반적으로 알고 있는 모터인 DC 모터가 있다.

DC 모터(Direct Current Motor)는 단순이 전기를 넣으면 동작하는 모터로 필자와 같은 나이대라면 어릴때 미니카 조립에서 많이 보았을 모터다.

그리고 DC 모터는 주변에서 흔히 보이는 선풍기에도 많이 사용된다.

하지만 이 모터는 단순히 전기에 의해 축이 회전하는 형태로 전기를 끊으면 멈추게 되는데 이때 관성에 의해 정확한 정지 위치를 지정하는게 어려운 단점이 있다.

이러한 DC 모터의 단점을 해소 할 수 있는 모터로 스테핑 모터가 있다.

스테핑 모터(Stepping Motor)는 일정한 각도에 맞춰 회전하고 멈추는 모터다.

그렇기 때문에 스테핑 모터는 고유의 분할 각도가 있고 이 각도에 따라 움직이게 된다.

만약 분할 각도가 1도라면 10도를 회전시키기 위해 10번의 명령을 내려야 한다.

하지만 이와 같이 정해져있는 각도 때문에 정밀하게 8.5도와 같은 동작은 불가능하다는 단점이 있다.

또 다른 모터로는 이번 포스트에서 정리 할 서보 모터가 있다.

서보 모터(Servo Motor)는 DC 모터의 한 종류로 DC 모터에 귀환 회로라는 것을 추가한 모터다.

그 덕에 위치제어가 어려웠던 DC 모터가 정확한 위치 제어가 가능하게 되었다.

그리고 이와 같은 귀환회로로 인해 스테핑 모터에 비해 정밀 제어가 가능하고 오동작을 수정할 수 있으며, 속도면에서 스테핑 모터에 비해 빠른 장점이 있다.

그렇기 때문에 서보 모터는 로봇의 방향제어, 관절제어, 로봇팔, 자동차 등에 많이 사용되고 있다.

하지만 그만큼 스테핑 모터에 비해 비싸다는 단점이 있다.

이 이외에도 DC 모터에 기어를 추가한 기어 모터 등 다양한 모터가 존재한다.

이번 포스트에서는 이러한 많은 모터 중에서 서보 모터에 관해 알아 볼 것이다.

보통 아두이노를 하면서 서보 모터라 하면 위의 그림과 같은 서보 모터를 가장 많이 구입할 것이다.

이때 서보 모터는 주로 SG90이라는 이름의 서보 모터일 것이다.

이에 대한 자세한 자료는 데이터 시트 게시판에 있으니 참고할 사람은 참고하자.

//blog.naver.com/darknisia/221133086669

서보 모터를 하기 전에 몰라도 되지만 알쓸신잡이라고 생각하고 잠깐 서보 모터의 종류에 대해 알아보자.

서보 모터도 다른 모터들과 같이 안으로 들어가면 크게 두 종류로 나눌 수 있다.

모두 짐작을 하겠지만 '아날로그 서보모터'와 '디지털 서보모터'가 바로 그 종류다.

우리가 일반적으로 서보 모터라고 부르는 것이 '아날로그 서보모터'다.

이 서보모터는 중립 위치 또는 제어된 위치에서 전원 소비가 거의 없다는 장점과 가격이 싸다는 장점을 가지고 있다.

하지만 아날로그 서보모터는 위치 제어 전류가 블록단위로 전달되는 까닭에 미세한 조정에서 서보모터가 움직이지 않는 현상이 일어나는 단점이 있다.

디지털 서보 모터는 모터 내부에 마이크로 프로세서(Microprocessor)가 내장되어 있어 서보 모터의 성능이 최대가 되도록 프로그래밍 되어 있다.

따라서 디지털 서보모터는 세팅값을 조절 할 수 있다.

디지털 서보 모터의 장점으로는 아날로그 서보 모터에 비해 높은 주파수를 사용하여 위치를 더 빨리 읽을 수 있어 위치제어가 빠르고 정확하다는 장점이 있다.

그렇기 때문에 아날로그 서보모터의 단점인 미세 조정이 가능하다.

하지만 높은 주파수로 인해 전력소비가 높으며 아직까진 다양한 규격의 판매가 이루어지지 않는 다는 단점이 있다.

참고로 우리가 하게되는 위의 그림과 같은 서보모터는 일반 서보모터 이므로 아날로그 서보모터에 해당된다.

그리고 아날로그 서보모터도 몇 종류가 있는데 간단히 말해 360도 무한회전이 가능한 '연속회전 서보모터(Continuous rotation servo motor)'와 180도 까지만 회전이 가능한 '표준 서보모터(Standard servo motor)'가 있다.

위의 그림의 SG90 서보 모터는 표준 서보모터로 0~180도 까지 사용이 가능하다.

하지만 실제로 사용해보면 5~170도 정도가 정확히 동작하는 것을 볼 수 있다.

이제 본격적으로 서보모터를 사용해보자.

원래 서보모터를 사용하려면 복잡하지만 아두이노에서는 기본적으로 서보모터에 관한 라이브러리가 포함되어 있다.

'Servo.h' 파일에 라이브러리가 담겨 있으며 관심있는 사람은 열어서 한 번 보는 것도 좋을 것이다.

그럼 간단하게 라이브러리 상에서 많이 사용하는 함수를 정리해보자.

   attach(Pin, Min_value, Max_value)

- Pin: 서보 모터가 연결되어 있는 핀 번호

- Min_value: 0도에 해당하는 마이크로초 단위의 펄스(Pulse) 폭 (default: 544)

- Max_value: 180도에 해당하는 마이크로초 단위의 펄스(Pulse) 폭 (default: 2400)

'attach' 함수는 간단히 말해 서보모터를 초기화 할 때 사용하는 함수로 서보 모터가 연결된 핀 번호와 서보 모터의 데이터 시트 상의 0도의 펄스 폭과 180도의 펄스 폭을 입력하면 그에 맞게 설정하는 함수 다.

보통 'Min_value'와 'Max_value'는 따로 적지 않고 디폴트 값인 544와 2400을 사용한다.

하지만 좀 더 정밀한 작업을 하기 위해선 이 부분도 놓치지 않고 설정 해야 한다.

   write(value)

- value: 서보 모터의 제어 값(각도)

'write' 함수의 경우 서보 모터를 제어하는 함수다.

일반 서보 모터의 경우 value에 원하는 각도 값을 적으면 그 각도 만큼 움직이게 된다.

연속 서보 모터의 경우 0을 입력하면 정방향 최고 속도로 움직이고 180이면 역방향 최고 속도, 90은 정지하게 된다.

'read' 함수는 현재 서보모터 축의 위치를 나타내는 함수다.

0~180 사이의 값을 나타내게 된다.

   attached()

- 서보 모터의 연결 여부 반환

'attached' 함수는 서보 모터가 연결되어 있는지 확인하는 함수다.

연결되어 있다면 'true', 연결되어 있지 않다면 'false'가 나타난다.

'detach' 함수는 연결되어 있는 서보 모터를 연결 해제 하는 함수로 이 함수 이후에 다시 서보 모터를 사용하기 위해선 attach 함수를 이용해 다시 연결해야 한다.

위의 다섯 가지의 함수가 바로 서보 모터를 사용할 수 있게 해주는 함수다.

하지만 이것 이외에도 한 가지 사용해야 하는 것이 있다.

그것은 조금 어려운 말로 인스턴스 변수라고 하는데 간단히 내가 사용하는 서보 모터의 이름을 지어주는 것이라고 생각하자.

#include <Servo.h>

Servo Motor1; //모터 제어용 변수

위의 예가 바로 인스턴스 변수를 설정해주는 것이다.

앞서 이야기한 것 처럼 이름을 지어주는 것이라고 생각하자.

위의 예와 같이 내가 사용할 서보모터의 이름을 지어주었다면 이 뒤로는 위의 다섯 함수를 사용할 때 'Motor1.attach(Pin)'와 같이 함수 앞으로 'Motor1. '을 붙여 주어야 한다.

이것은 여러 개의 서보모터를 사용할 때도 마찬가지다.

#include <Servo.h>

Servo Motor1; //모터 제어용 변수

Servo Motor2; //모터 제어용 변수

두 개의 서보모터를 사요할 때는 위의 예와 같이 사용하고 앞에서 설명한 것과 마찬가지로 함수 앞으로 'Motor1. '을 붙여 하나의 모터를 움직이고 다른 하나의 모터는 'Motor2. '을 붙여서 사용하면 된다.

참고로 아두이노 우노가 Servo 라이르러리로 사용할 수 있는 서보 모터는 최대 12개이며 이 이상 사용할 경우 제대로 동작하지 않는다.

그리고 서보 모터를 사용하고 있을 때는 '9번핀과 10번핀의 PWM 동작, 즉 analogWrite 함수를 사용할 수 없다.'

그러니 헷갈리지 않게 차라리 서보모터를 이 두개의 핀에 먼저 연결하여 사용하는 것도 한 방법일 것이다.

아두이노 메가의 경우는 한 번에 48개의 서보 모터를 제어할 수 있고 12개 이상 서보 모터를 사용할 경우 우노와 마찬가지로 '11번 핀과 12번 핀의 PWM 동작을 사용할 수 없다.'

그럼 이제 본격적으로 서보모터를 사용해보자.

서보모터를 구입하면 일반적으로 세개의 선이 있는 것이 보일 것이다.

선의 색은 보통 빨간색, 검은색, 흰색으로 되어 있거나 빨간색, 갈색, 주황색으로 되어 있다.

이때 빨간색은 Vcc(5V)에 해당하고 검은색, 갈색은 GND, 흰색, 주황색, 노란색은 데이터 핀에 해당한다.

물론 다른 색이 있을 수도 있으니 구입을 한 사이트 또는 데이터 시트를 보고 정확히 확인하고 연결하자.

서보 모터를 연결하는 방법은 아래와 같다.

서보 모터를 연결 했다면 이제 동작시켜 보자.

코드 1은 서보 모터의 각도를 간단히 움직이는 코드로 서보 모터를 움직여 0도, 90도 180도에 위치하게 하는 코드다.

 코드 1

#include <Servo.h>

// 서보 모터 이름 짓기(인스턴스 변수 설정)

Servo myServo;

int servoPin = 9;

void setup() {

  // 서보 모터 설정(연결)

  myServo.attach(servoPin);

}

void loop() {

  // 0도로 움직이기  

  myServo.write(0);

  delay(5000);

  // 90도로 움직이기

  myServo.write(90);

  delay(5000);

  // 180도로 움직이기

  myServo.write(180);

  delay(5000);

}


코드 1을 동작시키면 서보모터가 처음에 0도에 위치하고 다음은 90도, 180도 순으로 위치해다가 다시 0도로 돌아가는 것을 볼 수 있다.

만약 0도나 180도 부근에서 서보모터가 드르륵 드르륵 하는 움직임이 있다면 void setup의 'myServo.attach(servoPin)'을 설정해주어야 한다.

'attach'함수는 앞서 말했듯이 원래 뒤쪽으로 'attach(pin, min_value, max_value)'로 두 개의 값이 더 있다.

이 두 개의 값이 가본적으로 544, 2400으로 되어 있는데 드르륵 소리가 난다면 이 두 값을 조정해주어야 한다.

본래라면 데이터 시트를 참고하여 정확한 값을 쓰면 되지만 잘 모르겠는 사람들은 0도에서 드르륵 거린다면 544 값을 조금 높여주고 180도에서 드르륵 거린다면 2400 값을 낮춰서 입력해주면 된다.

이번에는 각도 별로 천천히 회전하는 동작을 해보자.

 코드 2

#include <Servo.h>

Servo myServo;

int servoPin = 9;

void setup() {

  myServo.attach(servoPin);

}

void loop() {

  int angle;

  for(angle = 0; angle < 180; angle++){

    myServo.write(angle);

    delay(20);

  }

  for(angle = 180; angle > 0; angle--){

    myServo.write(angle);

    delay(20);

  }

}

코드 2를 업로드 하면 서보모터가 천천히 180도까지 회전했다가 다시 0도로 회전하는 것을 볼 수 있다.

이 코드 2에서 우리가 주목해야 하는 점은 바로 'delay'다.

서보모터는 일반적으로 움직이는 속도가 있다.

우리가 사용한 SG90의 경우 0.12초에 60도를 회전한다고 나타나있다.

이점을 유의해서 중간 중간 delay를 넣어 회전을 마칠 시간을 주어야 하는 것이다.

이와 같이 서보모터를 동작하는 것을 해보았다.

서보모터는 앞서 이야기 한 것처럼 로봇같은 것을 만들어 제어할 때 핵심적이라고 할 정도로 많이 사용되는 모터로 앞으로도 사용처는 더 늘어날 것이다.

이제는 그 열기가 식었지만 3D 프린터도 이 서보모터를 이용하는 경우도 간혹 있다.

그러니 이쪽으로 관심있는 사람들은 좀 더 정밀하게 동작하는 서보 모터를 만져 보는 것도 좋을 것이다.

Toplist

최신 우편물

태그