아두이노 강좌 #30 Servo 라이브러리 기본 사용법
Lucy Archive
Lucy / Facilitate4U
2020. 8. 29. 00:33

Servo Motor SG90Servo Motor SG90

Arduino Uno : 서보 모터 라이브러리 사용 방법

지난 포스트에서 Servo Motor SG90 의 동작 방법에 대해 설명하고, 라이브러리 없이 동작시키는 방법에 대해 소개하였습니다. 이번 포스트에서는

아두이노에서 제공되는 Servo 라이브러리를 사용하는 방법을 소개

합니다.


Servo 라이브러리 설치 방법

Arduino IDE 사용자

Arduino IDE를 실행 후 라이브러리 매니저에서 Servo 를 검색 후 설치합니다. 아래 그림을 캡처하기 위해 Arduino IDE 를 처음 설치한 PC에서 라이브러리 매니저를 설행하고, Servo 를 검색 했는데 이미 설치가 된 것으로 나오네요. 최신 버전은 설치시 기본 라이브러리로 되는 건지...

Arduino IDE Servo 라이브러리 설치 방법Arduino IDE Servo 라이브러리 설치 방법

Visual Studio Code 사용자

제 블로그에 Visual Studio Code 로 아두이노를 프로그래밍 하는 방법을 소개한 것처럼 Visual Studio Code 를 사용하여 Arduino 를 프로그래밍 하시는 분은 아래 그림과 같이 F1키를 누르고 Library Manager 실행 후 Servo 를 검색하고 Servo 라이브러리 설치 후 Servo 라이브러리를 Include 하시면 됩니다.

VScode Servo 라이브러리 설치 방법VScode Servo 라이브러리 설치 방법


Servo 라이브러리 사용 방법

아두이노 우노 보드가 아닌 다른 아두이노 보드를 사용하시는 분은 아두이노 [각주:1]사이트에서 자신의 보드가 지원되는지 확인이 필요합니다. 

Servo 라이브러리는 MCU 내의 Timer1을 사용하기 때문에, 해당 라이브러리를 사용하는 경우 Arduino Uno 의 9번, 10번핀을 PWM 출력으로 사용할 수 없습니다. Servo 라이브러리는 아래의 함수를 지원합니다. 

attach()

attach() 는 Servo Motor 제어할 핀을 설정 합니다. 일반적으로 첫번째 Syntax 의 servo.attach(pin) 와 같이 많이 사용합니다. 사용할 Servo Motor 의 Duty Time 이 544 ~ 2400 us 가 아닌 경우에는 min, max 값 입력이 필요합니다.

Syntax

  • servo.attach(pin)
  • servo.attach(pin, min, max)

Parameters

  • servo : Servo 클래스 객체명
  • pin : 서보 모터 연결 핀 Arduino Uno 보드의 경우 9번 또는 10번 핀 사용 가능
  • min(optional) : 최소 각도(0º) 일 때 HIGH 유지 시간
  • max(optional) : 최대 각도(180º) 일 때 HIGH 유지 시간

Example

  • myservo.attach(9) : 서보 모터 9번 핀으로 초기화

attached()

servo.attach() 와 같이 사용 가능하며, 서보 모터 데이터핀으로 설정된 핀의 숫자를 반환합니다. servo 는 Servo 클래스의 객체입니다.

detach()

servo.detach() 와 같이 사용 가능하며 서보 모터에 할당된 핀 사용을 중지합니다. servo.datach() 후에 9번핀 10번핀을 PWM 포트로 사용 가능합니다.

write()

servo.write(angle) 와 같이 사용 가능하며, angle 에 입력된 0º ~ 180º 범위 내 값으로 서보 모터를 제어합니다.

writeMicroseconds()

servo.writeMicroseconds(microSeconds) 와 같이 사용가능하며 microSeoncds 에 입력된 us 단위 시간 만큼 HIGH Pulse 상태를 유지합니다. 일반적으로 사용되는 Servo Motor 가 아닌 경우 시간을 직접 입력하여 서보 모터를 제어 할 수 있습니다. 

read()

servo.read() 서보 모터에 마지막으로 설정한 각도 값을 반환합니다. Servo 모터 현재 상태를 읽어 오는 것이 아니라, 마지막으로 servo.write() 함수로 설정 한 한 값을 기억했다가 반환해줍니다.

Servo 사용해보기

Servo 모터 라이브러리를 사용하면 코드 몇 줄로 서보 모터를 간단하게 제어 할 수 있습니다. 

예제1 : Servo Motor Sweep

아래 코드는 1초 간격으로 Servo Motor 가 0º 와 180º 로 제어하는 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <Servo.h>
 
Servo servo;
 
void setup(){
    servo.attach(9);
}
 
void loop(){
    servo.write(0);
    delay(1000);
    servo.write(180);
    delay(1000);
}
cs

코드는 간단해서 따로 설명은 필요 없을 것 같습니다. 코드를 실행하면 서보 모터가 1초 간격으로 0º 와 180º 로 반복하며 회전합니다.

예제2 : 가변저항으로 서보모터 제어

예제2에 사용한 회로도와 연결 방법 예시는 아래와 같습니다. 가변저항은 10kΩ 을 사용했으며, 1kΩ 이상의 가변저항이면 아무 크기나 써도 상관없습니다. Servo Motor 의 데이터 핀은 Arduino Uno 의 9번 또는 10번 핀에 연결 되어야 합니다.

서보 모터 회로도 및 연결 예시서보 모터 회로도 및 연결 예시

아래는 가변 저항의 전압 0~5V 범위 입력 값에 따라 Servo Motor 를 0 ~ 180º 로 제어하는 코드입니다. 가변저항 아날로그 입력 및 map() 함수 사용법이 필요하신 분은 하단의 관련 포스트를 참조해주세요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <Servo.h>
 
#define SERVO 9
#define POTENTIOMETER A0 
 
Servo servo;
 
void setup(){
    servo.attach(9);
}
 
void loop(){
    int value = analogRead(A0);
    int angle = map(value, 010230180);
    servo.write(angle);
    delay(10);
}
cs

아래는 위 코드를 실행한 화면입니다. 가변저항의 회전에 따라 Servo Motor 가 회전합니다.


마무리

본 포스트에서

Arduino Uno 를 사용하여 서보모터 SG90 을 제어하는 기초적인 방법

을 소개하였습니다. 아두이노에서 제공되는 서보모터 라이브러리를 사용하면 쉽게 구현이 가능합니다. 다만, 라이브러리를 사용하는 경우 Timer 1번을 사용하는 9핀과 10번핀은 PWM 포트 출력으로 사용 할 수 없습니다.

끝까지 읽어 주셔서 감사합니다.😊

관련포스트

👉 아두이노 SERVO MOTOR 관련글 목록 보기

👉 아두이노 모터 관련글 목록 보기

👉 아두이노 관련글 전체 목록 보기


  1. https://www.arduino.cc/reference/en/libraries/servo/ [본문으로]