1. HXT900 마이크로 서보모터

HXT900은 -90 ~ 90′ 범위 약 180′ 이내에서 위치를 제어하는 마이크로 서보모터입니다. 상세 제원은 아래와 같습니다.

HXT900 9g / 1.6kg / .12sec Micro Servo

Operating voltage : 3v ~ 6v
Speed : 0.12 sec/60(4.8V)
Torque : 2.5 kg-cm
Temperature range : -30C~60C
Plastic Bushing, 25cm wire

Servo arms & screw included
Gears: Nylon White type

2. 연결방법

표준 RC 서보에는 3가닥의 전선이 있습니다. 검정색(GND), 적색(PWR = Power), 황색(SIG = Signal). 검정색 대신 갈색선을 사용하기도 합니다. 3가닥의 선을 각각 아두이노에 연결합니다.

주의!!: 서보모터가 약하거나 제대로 동작하지 않는다면 아두이노 보드의 출력보다 많은 전류를 요구하기 때문일 수 있습니다. 이때는 외부 전원으로 파워를 공급해줘야 합니다. 아래 PWR, GND를 외부 전원의(일반적으로 4.5 ~ 6V) +, – 에 연결합니다. 이 때 외부전원의 (-) 를 아두이노 GND, 서보모터 GND와 연결되도록 해야 합니다.

서보모터 아두이노
GND (검정색 혹은 갈색) GND
PWR (적색) 5V
SIG (황색) D2

3. 동작 방법

아두이노와 연결된 핀으로 입력되는 신호의 지속시간(pulse width)으로 위치를 제어합니다.

펄스폭 1.5ms (= 1500us)를 입력하면 중심 위치에 맞춰지며, 0.5ms 에서 -90′, 2.5ms 에서 90′ 회전한 위치에 맞춰집니다. 따라서 0.5 ~ 2.5ms 의 범위를 넘어가지 않도록 코드상에서 제어해줘야 합니다. 아두이노와 연결한 디지털 핀에 우리가 원하는 위치에 해당하는 펄스 주기 시간만큼 High 신호를 주고 다시 Low 신호를 주면 됩니다. 서보모터는 각도 요청을 받기위해 20ms 주기로 펄스를 기다리므로 디지털 핀에 신호를 주고 20ms 가 지나지 않았으면 다시 신호를 주지 않도록 해야합니다.

rcservo_pwm_vs_angle

아래 코드상에서는 약간 여유를 둬서 0.6 ~ 2.4ms 의 범위를 넘어가지 않도록 제어하고 있습니다.

4. 코드 (스케치)

int servoPin     =  2;    // control pin for servo motor  
int minPulse     =  600;  // minimum servo position  (0.6 ms)
int maxPulse     =  2400; // maximum servo position  (2.4 ms)
int turnRate     =  100;  // servo turn rate increment (larger value, faster rate)  
int refreshTime  =  20;   // time (ms) between pulses (50Hz)  

int centerServo;         // center servo position  
int pulseWidth;          // servo pulse width  
int moveServo;          // raw user input  
long lastPulse   = 0;   // recorded time (ms) of the last pulse

void setup()
{  
  pinMode(servoPin, OUTPUT);  // Set servo pin as an output pin  
  centerServo = maxPulse – ((maxPulse – minPulse)/2);  
  pulseWidth = centerServo;   // Give the servo a starting point (or it floats)  
  Serial.begin(9600);
  Serial.println("      Arduino Serial Servo Control");
  Serial.println("Press < or > to move, spacebar to center");
  Serial.println();
}  

void loop()
{  
  if (Serial.available() > 0) 
  {  
    moveServo = Serial.read();  

    // User contro:   ASCII '<' == 60,   ASCII '>' == 62  
    if (moveServo == 60) { pulseWidth = pulseWidth – turnRate; }  
    if (moveServo == 62) { pulseWidth = pulseWidth + turnRate; }  
    if (moveServo == 32) { pulseWidth = centerServo; }  

    // Check min, max
    if (pulseWidth > maxPulse) { pulseWidth = maxPulse; }  
    if (pulseWidth < minPulse) { pulseWidth = minPulse; }  

    Serial.print("Pulse Width: ");
    Serial.print(pulseWidth);
    Serial.println("us");
  }

  // Send pulse only when update time(20 ms) has passed
  if (millis() – lastPulse >= refreshTime) 
  {  
    digitalWrite(servoPin, HIGH);   // start the pulse  
    delayMicroseconds(pulseWidth);  // pulse width  
    digitalWrite(servoPin, LOW);    // stop the pulse  
    lastPulse = millis();           // save the time of the last pulse  
  }
}

코드를 아두이노에 업로드 하고 Serial Monitor 창을 엽니다. ‘<‘ 를 입력하고 전송하면 각도가 줄어들고, ‘>’를 입력하고 전송하면 각도가 커집니다. 스페이스를 누르고 전송하면 중심 위치로 갑니다.

Servo 라이브러리를 사용하면 간단하게 서보모터를 제어할 수 있습니다. 서버모터에 연결된 핀 설정 후 원하는 각만 입력해주면 됩니다.

#include <Servo.h> 

Servo servo;

int servoPin = 9;
int angle = 0; // servo position in degrees 

void setup() 
{ 
  servo.attach(servoPin);
} 

void loop() 
{ 
  // rotate from 0 to 180 degrees
  for(angle = 0; angle < 180; angle++) 
  { 
    servo.write(angle); 
    delay(15); 
  } 
}