서보모터는 별도의 드라이버 없이 아두이노의 라이브러리만 이용하여 동작시킬 수 있습니다.
(엄밀히 말해서 서보모터 안에 컨트롤러가 들어있습니다.)
테스트에 사용한 서보모터는 'DGS-288'입니다.
(참고 : 스카이홀릭 - DGS-288 - Digital Servo)
일단 서보모터를 연결해 봅시다.
그냥 아두이노에 연결해도 됩니다.
전 포스팅을 하는 입장이라 다른 글과 비슷한 화면을 보여주기 위해 브레드보드를 사용한 것입니다.
서보모터는 라이브러리를 이용하면 간단하게 제어할 수 있습니다.
#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(각도)'를 통해 서보모터를 제어합니다.
사용하는 서보모터가 40mA이상 사용하는 모터라면 아두이노보드가 죽는 현상을 볼 수 있을 것입니다.
이걸 해결하는 방법은 외부에서 전원을 공급하는 방법과 캐패시터(capacitor)를 이용하는 방법이 있습니다.
외부에서 전원을 공급하는 방법은 이 포스팅의 마지막에 다루도록 하고 캐패시터를 이용하려면 아래와 같이 하면 됩니다.
(캐패시터는 490uF이상을 사용해야 합니다.)
제가 전자 쪽은 잘 몰라서 무작정 쓸 수 있는 건지는 모르겠네요. ㅡ.-;;
(참고 : adafruit learning system - Arduino Lesson 15. DC Motor Reversing - If the Servo Misbehaves )
가변저항(potentiometer)의 각도에 따라 같이 움직이는 서보모터를 구현해 봅시다.
기존 배선에 가변저항만 추가하면 됩니다.
'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도까지만 제어할 수 있는듯합니다.
만약 더 큰 각도를 사용할 예정이라면 라이브러리를 수정하셔야 합니다.
서보모터의 전원과 접지를 외부전원과 연결하면 끝입니다.
서보모터는 펄스의 길이에 따라서 각도가 정해진다고 합니다.
자세한 내용은 아래 링크를 확인해 주세요.
(참고 : adafruit learning system - Arduino Lesson 15. DC Motor Reversing - Servo Motors )
서보모터 라이브러리에서 이 펄스를 제어해 주는 것 같습니다.
서보모터 라이브러리를 살짝 확인해 봤는데 180도까지만 제어가 가능한듯합니다.
만약 더 큰 각도의 서보모터를 사용한다면 라이브러리 자체를 수정해야 할듯하네요.