아두이노 강좌 #29 Servo Motor SG90 라이브러리 없이 사용
Lucy Archive
Lucy / Facilitate4U
2020. 8. 28. 01:07

Arduino Uno Servo Motor SG90Arduino Uno Servo Motor SG90

Arduino Uno : 서보 모터 SG90 without Library

아두이노에서 많이 사용되는 SG90 은 라이브러리를 사용하면 쉽게 제어가 가능하지만, 이번 포스트에서는

SG90 이 동작하는 원리를 파악하기 위해 라이브러리 없이 SG90 을 동작

하는 간단한 예제를 소개합니다.

Servo Motor SG90

SG90 아두이노 입문자가 가장 간단한 방법으로 사용 할 수 있는 서보 모터(Servo Motor) 입니다. 서보 모터는 정확한 위치 제어가 가능하기 때문 로봇의 관절과 같이 통제된 움직임이 필요한 곳에 사용 될 수 있습니다. Servo Motor 의 내부 구조는 다음에 하드웨어만 다루는 포스트를 따로 작성하겠습니다.

Servo Motor SG90 과 사용 예시Servo Motor SG90 과 사용 예시

SG90 HW Spec

[각주:1]SG90 의 주요 스펙은 다음과 같습니다. 같은 SG90 품명이지만 스펙이 다른 경우가 있으니, 자신이 가지고 있는 부품의 데이터 시트를 반드시 확보 및 확인하셔야 합니다.

  • Weight : 9g
  • Torque : 1.2 kg/cm
  • Operating Speed : 0.1s / 60 degree
  • Pulse Width : 500 ~ 2400 us
  • Rotational Range : 0 ~ 180º
  • Operating Voltage : 4.8V

SG90 동작 방법

Servo Motor 에는 전원, 데이터, 그라운드의 3개의 핀이 있습니다. 서보모터를 제어하기 위해 데이터 핀에 아래 같이 20ms 주기를 가지는 PWM 신호를 입력하여 서보모터의 각도를 제어할 수 있습니다. 20ms 의 주기에서 0.5 ~ 2.4 ms HIGH 유지하는 시간에 비례하여 Servo Motor의 0 ~ 180º 각도를 제어할 수 있습니다.

Servo Motor SG90 동작 방법Servo Motor SG90 동작 방법

📌분명 같은 SG90 이지만, Pulse Width 가 다른 경우가 있습니다. 이건 제 추측이지만 아래를 참고하세요.

WIre Color 에 따른 Pulse Width

  • 갈색, 빨간색, 노란색 : 0.5ms ~ 2.4ms
  • 갈색, 주황색, 노란색 : 1m ~ 2ms

모터의 동작 속도

Servo Motor 의 데이터시트에 따르면 동작 속도는 0.12sec / 60degree 로 0º -> 180º 변화시 총 0.36sec 가 소요됩니다.

Hardware : SG90 테스트

준비물

SG90 을 테스트 하기 위한 구성품은 아래와 같습니다.
  • Arduino Uno x 1EA
  • Servo Motor SG90 x 1EA
  • Jumper Wires

회로도 및 연결 방법

Arduino Uno SG90 Servo Motor아두이노 우노 SG90 연결 회로도

위 회로도에서 Servo Motor 의 데이터 핀을 D2 를 연결하였지만, 0번 1번 핀을 제외한 다른 아무 핀들을 사용하셔도 무방합니다. D0 핀과 D1 번핀은 시리얼 통신으로 사용할 예정입니다. 

SG90 배선

  • 주황색(또는 노란색) : DATA -> Arduino Uno D2 Pin
  • 빨간색 : 전원(5V)
  • 갈색 : 그라운드(0V)


라이브러리 없이 동작 시켜 보기

코드

SG90 라이브러리 없이 Servo Motor 를 제어하는 코드 입니다. 내부 구조 원리를 이해하고 동작 시키기 위한 코드로 봐주시면 됩니다. 라이브러리를 사용하면 내부 구조를 몰라도 충분히 동작 시킬 수 있지만, 혹시 비슷한 부품이나 이와 같이 PWM 으로 제어하는 다른 부품을 사용하게 되었을 때 참고용으로 봐주세요.

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <MsTimer2.h>
 
#define SERVO 2
#define PWM_RANGE_MIN 544 // 0 degree
#define PWM_RANGE_MAX 2400 // 180 degree
 
String strAngle; // Angle entered by serial communication
boolean flag = false// Enable when data is entered by serial communications
int dutyHIGH = 1500// PWM HIGH Duration
 
void setup(){
    pinMode(2OUTPUT);
    MsTimer2::set(20, setServo); // 20ms Period Timer Interrupt
    MsTimer2::start();
    Serial.begin(115200);
    Serial.print("Input Angle 0 ~ 180 : ");
}
 
void loop(){
    if(flag == 1){ // Run when serial data is received
        flag = 0;
        int temp = strAngle.toInt();
        strAngle = "";
        if((temp >= 0&& (temp <= 180)){ 
            dutyHIGH = map(temp, 0180, PWM_RANGE_MIN, PWM_RANGE_MAX);
        }
        else// for error handling
            Serial.println("Please Input Reand 0 ~ 180..!");
        }
        Serial.print("Input Angle 0 ~ 180 : ");
    }
}
 
void setServo(){ // Function executed at 20 ms intervals
    digitalWrite(SERVO, HIGH);
    delayMicroseconds(dutyHIGH);    
    digitalWrite(SERVO, LOW);
}
 
void serialEvent(){
    char myChar = (char)Serial.read();
    if((myChar >= '0'&& (myChar <= '9')){ // for error handling
        strAngle += myChar;
    }
    else if(myChar == '\n'){
        flag = true;
    }
}
cs

코드 설명

  • 3~5Line : Servo Motor 의 연결 또는 Pulse Width 스펙이 다른 경우 설정 할 수 있는 선언문입니다.
  • 13~14Line : 20ms 간격으로 Timer Interrupt Service Routine 을 설정하고 타이머를 실행합니다. 
  • 20~29Line : 시리얼 통신으로 각도데이터가 입력되면 Duty High 시간을 계산하여 dutyHIGH 변수에 입력합니다. 조건문은 입력된 각도 값이 0 ~ 180 의 범위가 아닌 경우 에러처리를 위하여 사용되었습니다.
  • 34~38Line : 20ms 주기마다 실행되는 함수로 모터 연결 핀을 dutyHIGH 변수의 수만큼 HIGH 시간을 유지 합니다.
  • 40~46Line : 시리얼 포트로 각도 값을 입력 받습니다. 조건문은 숫자가 아닌 값인 경우의 에러 처리를 위해 사용되었습니다.

본 코드에서 시리얼 인터럽트로 여러 문자를 한번에 받는 방법MsTimer2 라이브러리를 사용하여 타이머 인터럽트를 사용하는 방법은 아래 링크를 참조해주세요.

아두이노 강좌 #14 타이머 인터럽트 MsTimer2.h

아두이노 코딩 : 엔터 입력시(문장단위) Serial Echo 프로그램, Putty 로 CR+LF 전송

실행 결과

위의 코드를 실행하면 아래 동영상과 같이 시리얼 통신으로 각도 제어가 가능합니다.


마무리

이번 포스트에서는

Servo Motor SG90 의 동작 방법에 대해 알아보고, 라이브러리 없이 구현하는 방법

에 대해 소개하였습니다. 이 방법을 사용해야 하는 것은 아니고, 동작 원리를 파악하기 위한 용도로 봐주시면 됩니다. 실제 구현은 아두이노에서 제공되는 라이브러리를 사용하시면 됩니다. 이후에 라이브러리를 사용하는 방법도 소개할 예정입니다.

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

관련포스트

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

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

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


  1. https://datasheetspdf.com/pdf-file/791970/TowerPro/SG90/1 [본문으로]