[Arduino] 서보 모터(Servo Motor) 제어
서보모터는 별도의 드라이버 없이 아두이노의 라이브러리만 이용하여 동작시킬 수 있습니다.
(엄밀히 말해서 서보모터 안에 컨트롤러가 들어있습니다.)
테스트에 사용한 서보모터는 'DGS-288'입니다.
(참고 : 스카이홀릭 - DGS-288 - Digital Servo)
1. 서보 모터 동작시키기
일단 서보모터를 연결해 봅시다.
1-1. 보드 구성
그냥 아두이노에 연결해도 됩니다.
전 포스팅을 하는 입장이라 다른 글과 비슷한 화면을 보여주기 위해 브레드보드를 사용한 것입니다.
1-2. 펌웨어 작성
서보모터는 라이브러리를 이용하면 간단하게 제어할 수 있습니다.
#include <Servo.h>
int potPin = 0;
int servoPin = 9;
Servo servo;
int nSwitch = 0;
int nAngle = 0;
void setup()
{
Serial.begin(9600);
pinMode(servoPin, OUTPUT);
servo.attach(servoPin);
}
void loop()
{
if(Serial.available())
{
nSwitch = Serial.read();
}
switch(nSwitch)
{
case '0':
nAngle = 0;
break;
case '1':
nAngle = 90;
break;
case '2':
nAngle = 180;
break;
}
servo.write(nAngle);
}
스텝모터 때와 마찬가지로 라이브러리를 이용하여 서보모터 객체를 생성하고 '.write(각도)'를 통해 서보모터를 제어합니다.
1-3. 전류가 부족하다?
사용하는 서보모터가 40mA이상 사용하는 모터라면 아두이노보드가 죽는 현상을 볼 수 있을 것입니다.
이걸 해결하는 방법은 외부에서 전원을 공급하는 방법과 캐패시터(capacitor)를 이용하는 방법이 있습니다.
외부에서 전원을 공급하는 방법은 이 포스팅의 마지막에 다루도록 하고 캐패시터를 이용하려면 아래와 같이 하면 됩니다.
(캐패시터는 490uF이상을 사용해야 합니다.)
제가 전자 쪽은 잘 몰라서 무작정 쓸 수 있는 건지는 모르겠네요. ㅡ.-;;
(참고 : adafruit learning system - Arduino Lesson 15. DC Motor Reversing - If the Servo Misbehaves )
2. 입력받은 값으로 각도 조절하기
가변저항(potentiometer)의 각도에 따라 같이 움직이는 서보모터를 구현해 봅시다.
2-1. 보드 구성
기존 배선에 가변저항만 추가하면 됩니다.
2-2. 펌웨어 작성
'A0'핀의 가변저항 값을 읽어 서보모터를 제어합니다.
/*
Adafruit Arduino - Lesson 14. Knob
*/
#include <Servo.h>
int potPin = 0;
int servoPin = 9;
Servo servo;
String sMeg = "Log - Angle : ";
void setup()
{
Serial.begin(9600);
servo.attach(servoPin);
}
void loop()
{
int reading = analogRead(potPin); // 0 to 1023
int angle = reading / 6; // 0 to 180-ish
servo.write(angle);
Serial.println(sMeg + int(servo.read()));
}
(참고 : adafruit learning system - Arduino Lesson 15. DC Motor Reversing - Arduino Code for 'Knob' )
코드를 보면 '.read()'가 있는데 서보모터 객체를 통해 서보모터의 각도를 받아올 수 있습니다.
시리얼 모니터를 통해 데이터를 확인해보면 서보모터의 각도가 나옵니다.
각도를 확인해보면 170까지만 나오는 것을 알 수 있는데 많은 서보모터가 0~170도까지 동작합니다.
만약 다른 각도까지 동작하는 서보모터를 사용 중이라면 코드를 수정하여 테스트하시면 됩니다.
이 코드는 최대 180도를 기준으로 하고 있습니다.
그리고 주의할 것이 아두이노의 서보모터 라이브러리는 180도까지만 제어할 수 있는듯합니다.
만약 더 큰 각도를 사용할 예정이라면 라이브러리를 수정하셔야 합니다.
3. 외부 전원 사용하기
서보모터의 전원과 접지를 외부전원과 연결하면 끝입니다.
마무리
서보모터는 펄스의 길이에 따라서 각도가 정해진다고 합니다.
자세한 내용은 아래 링크를 확인해 주세요.
(참고 : adafruit learning system - Arduino Lesson 15. DC Motor Reversing - Servo Motors )
서보모터 라이브러리에서 이 펄스를 제어해 주는 것 같습니다.
서보모터 라이브러리를 살짝 확인해 봤는데 180도까지만 제어가 가능한듯합니다.
만약 더 큰 각도의 서보모터를 사용한다면 라이브러리 자체를 수정해야 할듯하네요.