이번에는 Arduino로 Servo Motor를 제어해 보려고 한다. 

모터는 바퀴, 로봇의 관절 등의 움직임을 구현하기 위해 사용되는 필수적인 장치로 다양한 모터가 존재 한다. 하지만 아두이노에서 많이 사용되는 모터는 DC motor, step motor, servo motor 등이 사용이 된다.

  • DC (Direct Current) 모터 : 축이 연속적으로 회전하는 형태의 모터로 전원이 끊어지는 경우에만 정지한다. 정지 시에는 관성으로 인해 정확한 정지 위치를 지정하기 어렵다.
  • 스테핑 (stepping) 모터 : 전원이 공급되면 축은 일정 각도를 회전하고 멈춘다. 따라서 축을 연속적으로 회전시키기 위해서는 모터로 펄스열이 전달되어야 한다. 스테핑 모터에는 고유의 분할 각도가 존재하여 이 분할 각도에 의해 제어된다. 예를 들어 분할 각도가 1도인 경우 모터를 10도 회전시키기 위해서는 10개의 펄스를 전송해주어야 하며 9.5도 회전은 불가능하다는 한계가 있다. 하지만 DC 모터나 서보 모터에 비해 제어가 쉬운 장점이 있다.
  • 서보 (servo) 모터 : DC 모터의 한 종류로 DC 모터에 귀환 회로를 추가하여 정확한 위치 제어가 가능하도록 구성된 모터이다. 가격 면에서는 귀환 제어 회로로 인해 스테핑 모터에 비해 비싸다. 하지만 귀환 제어를 통해 정밀 제어가 가능하고 오동작을 수정할 수 있으며, 속도 면에서도 스테핑 모터에 비해 빠른 장점이 있다.

서보 모터를 제어하기 전에 서보 모터에 대해서 간단히 알아보자.

위 그림을 보면 서보 모터는 기본적으로 VCC, GND, Pulse(PWM) 3 개의 핀으로 구성되어 있고, 제어핀으로 모터의 각도를 제어하게 된다.

서보 모터를 제어하기 위해서는 약 20ms 간격으로 1~2ms 폭의 펄스(사각파)를 생성 해야 한다. 펄스의 폭에 의해서 각도가 정해져서 제어가 된다.

펄스의 폭이 1ms 이면 0도, 1.5ms 이면 90도, 2ms 이면 180도로 제어가 된다. 아래 그림을 참고하면 된다. 

서보 모터의 VCC는 일반적으로 붉은 색, GND는 검정색이나 갈색 이다. 신호선은 노란색, 주황색, 흰색으로 되어 있다.

서보 모터는 표준 서보 모터와 연속 회전 서보 모터 두종류가 있다. 표준 서보 모터는 0~170(or 180)도 까지 제어가 되고,  연속 회전 서보 모터는 일반 모터 처럼 360도를 무한히 회전을 할 수있다.


<실습 1>

이제 아두이노에서 서보 모터를 제어해 보자.

아두이노에는 서보 모터를 제어하기 위한 라이브러리가 포함되어 있다. 라이브러리를 이용하면 손쉽게 서보 모터 제거가 가능하다.

서보 모터의 연결은 아래와 같이 연결했다. 서보 모터의 VCC에 아두이노의 5V에 연결을 하고, GND에는 GND, 신호선은 D3 으로 연결해서 제어를 했다.

만약 서보 모터의 소모 전류량이 많다면 아두이노의 5V를 사용 하지 말고 별도의 전원은 서보 모터에 연결해야한다.

실제 구성한 모습은 아래와 같다.

아두이노 코드는 아래와 같다. 서보 모터가 0도 -> 170도 -> 0도 로 반복적으로 움직이는 코드를 작성해 보았다.

추가 코드 설명은 주석으로 대체하겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <Servo.h>    //서보모터 라이브러리 include
 
Servo microServo;    //서보모터 객체 선언
const int servoPin = 3;    //서보모터 제어핀 할당
 
void setup()
{
    Serial.begin(115200);
    Serial.println("hello arduino!");
    microServo.attach(servoPin);    //서보모터 초기화
}
 
void loop()
{
    int angle;    //각도 변수 선언
 
    
    //0 -> 170도로 서보모터 움직임
    for (angle = 0; angle < 170; angle++)
    {
        microServo.write(angle);    //angle(각도)값으로 서보모터 제어
        Serial.println(angle);        //각도 값 출력
        delay(10);                    //delay로 각도의 변화 속도를 조절
    }
    //170 -> 0도로 서보모터 움직임
    for (angle = 170; angle > 0; angle--)
    {
        microServo.write(angle);    //angle(각도)값으로 서보모터 제어
        Serial.println(angle);        //각도 값 출력
        delay(10);                    //delay로 각도의 변화 속도를 조절
    }
}
cs

동작 영상


< 실습 2>

이 실습은 가변저항을 통해서 받은 ADC 값을 이용해 서보 모터 제어를 해보자.

회로 구성

소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <Servo.h>    //서보모터 라이브러리 include
 
Servo microServo;    //서보모터 객체 선언
const int servoPin = 3;    //서보모터 제어핀 할당
 
void setup()
{
    Serial.begin(115200);
    Serial.println("hello arduino!");
    microServo.attach(servoPin);    //서보모터 초기화
}
 
void loop()
{
    int aValue = analogRead(A0);    //aValue 초기화, A0값을 aValue 변수에 저장
 
    aValue = map(aValue, 010230169);    //aValue의 스케일 변화, 0~1023 -> 0~169
 
    microServo.write(aValue);        //aValue 값으로 서보 모터 각도 제어
    Serial.println(aValue);
 
    delay(20);
}
cs

동작 영상


<출처>

아두이노 상상을 스케케치하다 - http://cafe.naver.com/sketchurimagination

메카솔류션 - http://blog.naver.com/roboholic84/220346299821

오로카 - http://cafe.naver.com/openrt/6288

가치창조기술 - http://wiki.vctec.co.kr/opensource/arduino/servocontrol

+ Recent posts