아두이노 서보 모터 SG-90 조작하기

1 minute read

안녕하세요! 두 번쨰 프로젝트인 장애물 피하기 로봇에서 서보 모터 SG-90을 사용할 예정인데, 미리 조작하는 방법을 살펴볼까 합니다.

서보 모터란?

원래 서보 모터는 모터의 회전 각도와 속도, 가속도 등을 정확히 조정할 수 있는 모터를 말합니다. 산업용으로 사용되는 굉장히 정교한 모터 부터 각종 장난감에서 사용되는 작은 모터 까지 다양한 종류가 있습니다. 우리가 사용할 SG-90은 아래 사진과 같이 구성되어 있습니다. 컨트롤 신호에 따라 모터가 회전하면 기어가 같이 맞물려 회전하게 되고 마직막 기어에 달린 포텐시오미터로 움직인 각도를 측정해 원하는 각도로 모터를 조정할 수 있습니다.

서보 모터 구조

SG-90 스펙

  • 무게 : 9g
  • 크기 : 약 22.2 x 11.8 x 31 mm
  • 정지 토크 : 1.8 kgf*cm
  • 동작 속도 : 0.1s/ 60도
  • 정격 전압 : 4.8V(~5V)

조작 방법

보통 회로와는 다른 색깔의 전선이 나와있습니다. 빨간색 전선은 아두이노의 5V에, 갈색 전선은 GND에 연결합니다. 주황색은 PWM 신호를 받는 핀에 연결하는데 보통 아두이노에서 PWM을 사용하는 방식과는 다르게 작동하기 때문에 아무 디지털 핀에나 연결하여도 상관이 없습니다.

서보 모터 컨트롤

위의 그림에서 볼 수 있듯이 PWM 신호의 주기가 20ms 이어야 합니다. 이 때, HIGH 신호의 길이가 1ms면 0도, 1.5ms면 90도, 2ms면 180도를 가리키게 됩니다. 아두이노의 analogWrite() 함수는 아두이노의 신호 주기에 따라서 256단계로 HIGH 길이를 조정하므로 서보모터를 조정하는 용도로 사용할 수 없습니다. 20ms 시간 내에 HIGH가 되는 시간을 직접 조정해야 합니다. 아래 코드는 시리얼 모니터에 입력한 PWM값을 이용하여 서보 모터의 각도를 컨트롤 하는 예를 보여주고 있습니다.

서보 라이브러리 사용법

서보 라이브러리를 사용하면 일일이 시간을 잴 필요 없이 각도만으로 서보 모터를 조정할 수 있어 매우 편리합니다. 서보 모터는 어느 핀에 연결해도 상관 없습니다.

다만 서버 라이브러리는 아두이노의 1번 타이머를 사용하기 때문에 이 타이머를 사용하는 다른 라이브러리를 같이 쓸 수 없습니다. 아두이노의 9번, 10번 PWM 신호도 아두이노의 1번 타이머를 이용하기 때문에 역시나 PWM 신호를 전송하는 용도로 사용할 수 없습니다.

서보 라이브러리를 사용하기 위해서는 먼저 서버 라이브러리를 인클루드 합니다.

#include <Servo.h>

다음으로 Servo 클래스 개체로 사용할 변수를 선언합니다.

Servo servo;

init()에서 Servo 라이브러리의 attach()함수를 이용하여 서보 개체에 연결할 핀을 지정합니다.

servo.attach(9); // 서보 모터를 9번핀에 연결

서보의 회전 각도는 write() 함수를 이용하여 설정합니다.

servo.write(90); // 서보 모터를 90도로 설정

이때, 서보모터가 완전히 그 각도를 가르키기까지 시간이 필요하기 때문에 딜레이를 사용하여 그 시간을 마련해주어야 합니다. SG-90은 60도를 회전하는데 0.1초가 필요하므로 모터를 0도에서 90도로 회전한다면 약 0.15초가 필요합니다. 따라서, 모터가 완전히 90도로 돌때까지 기다리려면 150ms를 기다리면 됩니다.

아래 코드는 시리얼 모니터에서 각도를 받아 서보 모터를 조정하는 예입니다.