HXT900 마이크로 서보모터 컨트롤 소스
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 가 지나지 않았으면 다시 신호를 주지 않도록 해야합니다.
아래 코드상에서는 약간 여유를 둬서 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); } }