위즈네트 아카데미

TUTORIAL

튜토리얼

Home  > 튜토리얼

아두이노로 서보모터 제어해보기

WIZnet Academy 2016.06.29 15:32 조회 수 : 70

arduino_servo

이번 포스팅에서는 아두이노에서 서보모터를 제어하는 방법에 대해서 설명해보겠습니다.

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

  • DC (Direct Current) 모터 : 축이 연속적으로 회전하는 형태의 모터로 전원이 끊어지는 경우에만 정지한다. 정지 시에는 관성으로 인해 정확한 정지 위치를 지정하기 어렵다.



  • 스테핑 (stepping) 모터 : 전원이 공급되면 축은 일정 각도를 회전하고 멈춘다. 따라서 축을 연속적으로 회전시키기 위해서는 모터로 펄스열이 전달되어야 한다. 스테핑 모터에는 고유의 분할 각도가 존재하여 이 분할 각도에 의해 제어된다. 예를 들어 분할 각도가 1도인 경우 모터를 10도 회전시키기 위해서는 10개의 펄스를 전송해주어야 하며 9.5도 회전은 불가능하다는 한계가 있다. 하지만 DC 모터나 서보 모터에 비해 제어가 쉬운 장점이 있다.



  • 서보 (servo) 모터 : DC 모터의 한 종류로 DC 모터에 귀환 회로를 추가하여 정확한 위치 제어가 가능하도록 구성된 모터이다. 가격 면에서는 귀환 제어 회로로 인해 스테핑 모터에 비해 비싸다. 하지만 귀환 제어를 통해 정밀 제어가 가능하고 오동작을 수정할 수 있으며, 속도 면에서도 스테핑 모터에 비해 빠른 장점이 있다.




서보 모터를 제어하기 전에 서보 모터에 대해서 간단히 알아보도록 하겠습니다.

 

arduino_servo-1

위 그림을 보면 서보 모터는 기본적으로 VCC, GND, Pulse(PWM) 3 개의 핀으로 구성되어 있고, 제어핀으로 모터의 각도를 제어하게 됩니다. 서보 모터를 제어하기 위해서는 약 20ms 간격으로 1~2ms 폭의 펄스(사각파)를 생성 해야 하며, 펄스의 폭에 의해서 각도가 정해져서 제어가 됩니다.

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

arduino_servo-2

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

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

<실습 1>

이제 아두이노에서 서보 모터를 제어해 보겠습니다.

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

서보 모터 연결은 아래와 같이 합니다. 서보 모터의 VCC에 아두이노의 5V에 연결을 하고, GND에는 GND, 신호선은 D3 으로 연결해서 제어를 합니다. 만약 서보 모터의 소모 전류량이 많다면 아두이노의 5V를 사용 하지 말고 별도의 전원을 연결하여 공급해줘야 합니다.

arduino_servo-3

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

arduino_servo-4

아두이노 코드는 아래와 같습니다. 서보 모터가 0도 -> 170도 -> 0도 로 반복적으로 움직이는 코드로,  코드에 대한 설명은 주석처리하였습니다.
#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로 각도의 변화 속도를 조절
}
}

아래는 동작 동영상입니다.



< 실습 2>

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

회로 구성입니다.

arduino_servo-5

소스코드입니다.
#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, 0, 1023, 0, 169); //aValue의 스케일 변화, 0~1023 -> 0~169

microServo.write(aValue); //aValue 값으로 서보 모터 각도 제어
Serial.println(aValue);

delay(20);
}

동작 동영상입니다.


글출처 : OSHW Alchemist