아두이노 서보모터 (Servo Motor)

 

 

이번 포스팅 에서는 Servo Motor란 무엇인지, 아두이노를 이용해서 어떻게 서보모터를 구동 시키는지 알아 보도록 하겠습니다.

Servo Motor에는 모터(회전만 하는)와 제어부(회로와 알고리즘)이 포함되어 있는데, 모터부와 제어부 전체를 지칭해서 Servo Motor라고 합니다.Servo라는 단어는 Servant(하인)에서 온 단어로 명령에 따라 모터의 각도를 제어 할 수 있어서 붙여진 이름인듯 합니다.

Analog VS Digital
서보모터는 작동 방식에 따라서 아날로그와 디지털 서보모터로 구분이 됩니다.


 

아날로그 서보모터는 전류의 양으로 모터의 회전 각을 조절합니다.

전류를 적게 보내면 조금 움직이고 전류를 많이 보내면 많이 움직입니다.

이렇기 때문에 서보를 조금 움직일 때 서보에 전류량이 작아서 힘이 없다는 단점이 있으며 명령한 각도를 유지하기 위해서 전류값을 지속적으로 보내주어야만 합니다.

 

디지털 서보모터는 전류가 흐르는 시간을 조절하여 서보를 움직입니다.

많은양의 전류를 시간당으로 끊어서 서보모터를 제어합니다.

그러므로 아날로그 서보모터에서 나타나는 단점인 조금 움직일때 서보모터의 힘이 약해지는 문제가 디지털 서보모터에서는 나타나지 않습니다, 

하지만 디지털 서보모터는 아날로그에 비해 소비되는 전력량이 많으므로 아두이노 보드에 순간적인 전압강하가 일어날 수 있습니다.

아날로그 서보모터와는 다르게 한번 제어된 각은 전류를 보내지 않아도 다음 명령까지 유지됩니다.

서보모터에는 기본적으로 모터 드라이버가 내장되어 있어서 아두이노에 연결해서 사용하기가 편리합니다. 

아래는 서보모터를 연결한 모습입니다.

 


 

 

 

_____________________________________________​_________________________________________________​________________________

 


180도 서보컨트롤


#include                   

Servo servomotor;         //servomotor 를 선언해줍니다. LED를 사용할 때 int LED 와 비슷하다고 생각하시면 됩니다.

int pos = 0;

 

void setup() {

  servomotor.attach(9);       //pinMode(LED,OUTPUT)과 비슷하다고 생각하시면 됩니다.servomotor를 9번핀에 준비시킵니다.

}

void loop() {

  for(pos = 0; pos < 180; pos++)

  {

    servomotor.write(pos);             //servomotor.write(숫자)는 서보모터가 위치할 각입니다. 숫자가 90이면 90도로 이동합니다.

    delay(15);

  }

  for(pos = 180; pos > 0; pos--)

  {

    servomotor.write(pos);            //결과적으로 이 코드는 0~179도, 179~0도로 왕복합니다.

    delay(15);

  }

}

_____________________________________________​_________________________________________________​________________________

 

 

서보모터는 아두이노에서 제공하는 "서보모터 제어 라이브러리 함수"를 이용해서 제어하게 됩니다.
여기서 라이브러리란 특정 프로젝트에 필요한 함수를 사전에 만들어 모아 놓은것 이며  라이브러리 함수란 라이브러리에 포함된 함수라고 생각하면 됩니다.

아두이노에 라이브러리 함수를 추가 하기 위해서 #include를 사용합니다.
#include를 사용함으로써 아두이노 에서 Servo, servomotor.attach 와 같은 서보모터를 제어하기 위한 함수를 간단하게 사용할 수 있게됩니다.

_____________________________________________​_________________________________________________​________________________ 

 

Serial 통신을 이용한 서보모터 제어

 

#include 

Servo servomotor;

int a = 0;

 

void setup() {

  servomotor.attach(9);

  Serial.begin(9600);                               // Serial 통신을 설정합니다.

  while(!Serial);                                           

  Serial.println("Servor Mortor");

}

void loop() {

  if(Serial.available()){                             //Serial 모니터창에 어떤 값이 들어오면 실행을 합니다.

    a = Serial.parseInt();                           //Serial 모니터창에서 받은 값을 a라는 변수로 넘겨줍니다.

    if(a>=0 && a<=180)

    {

      Serial.print("angle : ");

      Serial.println(a);

      servomotor.write(a);

      delay(15);

    }

  }

}

 

_____________________________________________​_________________________________________________​________________________ 

 

Serial.available는 시리얼 모니터 창에 데이터를 수신받으면 True, 못받으면 False값을 반환합니다.
그러므로 위의 코드에서 시리얼 모니터 창에 숫자를 넣으면 그 숫자를 데이터로 받아 첫번째 if문이 실행 됩니다.

Serial.parseInt는 시리얼 모니터에서 받은 데이터가 숫자일 경우 그 숫자를 반환 해줍니다.
그 숫자가 1 ~ 180이면 두번째 if문이 실행됩니다.

결과적으로 위 코드는 시리얼 모니터 창에 0 ~ 180까지의 숫자를 하나 입력하면 그 숫자만큼 서보모터의 각을 움직이는 코드 입니다.

 

 

 

다른 센서나 저항을 이용해서도 서보모터를 제어해 볼 수 있습니다.

아래 예제 에서는 가변저항을 이용해서 서보모터를 제어해 보겠습니다. 
회로 연결은 아래와 같습니다.

 


 


_____________________________________________​_________________________________________________​________________________ 

 

서보모터 + 가변저항

 

 

#include 

Servo myServo;

int pin = 0;

void setup() {

  myServo.attach(9);

  Serial.begin(9600);

  while(!Serial);

  Serial.println("Servor Mortor");

}

void loop() {

  int pinVal = analogRead(pin);

  int a = map(pinVal,0,1023,0,179);

  Serial.print("angle : ");

  Serial.println(a);

  myServo.write(a);

  delay(15);

}


_____________________________________________​_________________________________________________​________________________ 

 

map 함수는 지난번 CDS센서에서 소개했었는데요
map(sensor name,시작범위,끝범위,변경할 시작범위, 변경할 끝범위)로 구성되어져 있습니다. 

위 코드는 가변저항의 저항값 범의 0 ~ 1023을 서보모터의 각도범위 0 ~ 179로 맵핑해주어 가변저항을 돌린 정도에 따라 서보모터가 돌아가는 코드 입니다.

 

 

  •  15,688
  •  1
  •  0

pcmola 2018-09-16 16:46:09

웹으로 소스 올라가면서 1번째 라인 include 뒤의 가 사라졌네요


댓글을 남겨 주세요.