오늘은 라이브러리를 활용하여 서보 모터를 제어하는 방법에 대해 다뤄볼 예정입니다. 기존에 C언어나 C++을 공부한 사람이라면 라이브러리에 대한 이해가 충분할 것이므로 라이브러리 추가 방법만 확인하고 서보 모터 제어로 넘어가도 좋습니다.

1. 라이브러리란?

소프트웨어 개발 시 사용되는 비휘발성 resource들을 하나의 파일로 저장한 것으로, 해당 resource들을 필요할 때마다 불러내어 사용할 수 있도록 해줍니다. 아두이노는 오픈소스 하드웨어 및 소프트웨어의 제공으로 아두이노 디바이스에 사용하고 싶은 센서 및 구동부에 대해서 표준 라이브러리를 제공합니다. 라이브러리 추가 방법은 IDE(아두이노 스케치)를 통해서 직접 라이브러리를 추가하는 방식과 작성된 라이브러리 파일을 직접 IDE상에 추가하는 두가지 방법이 존재합니다.

- IDE 상에서 온라인으로 추가하기

아두이노 IDE 의 모습

 

위의 그림과 같이 아두이노 스케치를 실행한 후, 스케치 > 라이브러리 포함하기 > 라이브러리 관리를 누르면 아래와 같은 화면이 나올 것 입니다.

라이브러리 관리를 눌렀을 때 나타나는 화면

위와 같은 화면이 나타났을때 검색에 필터하기 부분에 원하는 센서 혹은 구동부에 필요한 라이브러리를 입력하면 온라인 상에서 다운로드가 가능합니다.

- 직접 라이브러리 추가하기

위와 같은 방법이 아닌 다른 사용자 혹은 내가 별도로 작성해둔 라이브러리 파일을 직접 추가하는 방법에 대해 알아보겠습니다.

우선 아두이노가 설치된 경로로 들어갑니다. arduino.cc에서 압축파일 형태가 아닌 설치형 파일로 다운로드 했을 경우 기본 경로는 C:\Program Files(x86)\Arduino의 위치에 있을것입니다. 해당 경로에 들어가게 되면.

C:\Program Files(x86)\Arduino

 

위와 같이 나오게 되는데 libraries에 들어가 라이브러리 파일을 직접 붙여넣기 해주면 됩니다.

2. 서보모터

모터란? 전기 에너지를 공급받아 이를 움직임으로 전환하는 장치를 말합니다. 일반적인 DC모터의 경우 전원 공급이 이루 어 지면 모터가 지속적으로 회전하는 모습을 볼 수 있습니다. 하지만 오늘 다룰 서보 모터의 경우 회전각의 제한이 있습니다. 서보 모터마다 각자가 회전 할 수 있는 최대 각이 있기 때문에 모델명을 확인하고 datasheet를 참고하길 바랍니다. 다시말해 서보 모터는 제어 구동 보드를 포함해서 특정한 위치와 속도를 가지도록 맞출 수 있는 특수한 모터입니다. CCTV나 프린터 또는 로봇 관절 등에 주로 사용됩니다. 서보 모터를 제어하려면 PWM제어를 사용해야 하는데 PWM에 대한 이론은 다음에 자세하게 다루도록 하겠습니다. 오늘은 서보 모터 라이브러리를 활용할 것이기 때문에 PWM이론에 대한 것은 넘어가도록 하겠습니다.

우선 서보모터 예제를 설명하기에 앞서 회로도를 먼저 구성하겠습니다. 서보 모터의 경우 3개의 핀을 가지고 있는데, 대체로 빨간색은 Vin, 검정색은 GND, 노란색은 신호핀으로 연결합니다.

서보 모터 회로도

 

위와 같이 연결하게 되면 5번핀에서의 출력에 따라 서보 모터가 특정 각도로 움직이게 됩니다.

이제 아두이노 스케치에서 서보 모터 예제 코딩을 하게 될텐데, 앞에서 설명한 라이브러리를 활용할 것입니다. 아두이노 스케치에 보면 서보모터에 관련된 라이브러리가 존재합니다. 그것을 활용할 경우 클래스의 형태로 사용이 가능합니다. PWM에 대한 이해 없이 서보 모터를 쉽게 제어할 수 있습니다.

// 서보 모터 제어에 이용될 함수를 포함한 헤더 파일
#include <Servo.h>    

Servo servo;          // 서보 모터 클래스의 객체를 생성

int servoPin = 5;      // 서보 모터의 signal pin과 연결된 값을 입력
int degree = 0;        // 서보의 각도를 조절할 변수

void setup() {
  // put your setup code here, to run once:
  servo.attach(servoPin);     // 생성된 서보 객체를 연결된 핀에 초기화
}

void loop() {
  // put your main code here, to run repeatedly:
  for (degree = 0; degree < 180; degree += 45) {
    servo.write(degree);       // 서보 모터를 원하는 각도로 움직이게 하는 함수
    delay(1000);               // 움직이고 나서 1초의 delay를 가짐
  }   // 0부터 180도까지 45도씩 증가하면서 움직이도록 하는 for문

  for (degree = 180; degree > 0; degree -= 45) {
    servo.write(degree);       // 서보 모터를 원하는 각도로 움직이게 하는 함수
    delay(1000);               // 움직이고 나서 1초의 delay를 가짐
  }   // 180부터 0도까지 45도씩 감소하면서 움직이도록 하는 for문
}

모터에 따라 돌아갈 수 있는 최대 각도가 다르기때문에 모델명을 확인하고 데이터 시트를 확인해보길 바랍니다. 서보 모터가 돌아갈 수 있는 각도 이상으로 값을 줄 경우 모터의 고장 원인이 될 수도 있습니다. 이러한 모터 특성을 이용해서 로봇 관절과 같은 정확한 각도의 회전을 요구하는 부분에서 활용할 수 있습니다.

이렇게 서보 모터 헤더파일을 참조함으로써 간단하게 제어를 할 수 있지만 이 방법은 나중에 복잡한 코드가 되었을 때 좋은 효율을 내지는 않습니다. 이후에 다룰 PWM제어를 이용하여 제어를 할경우 보다 효율적으로 제어할 수 있습니다.

 

강의: youtu.be/D-AjGiJ0kcY

 

+ Recent posts