본문 바로가기

Hardware/Arduino and Friends

아두이노로 서보모터 구동하기 (sin파 따라가기)

뭐 오래전에 테스트했던 내용이었는데... 문득 다시 취미삼아 시작할까 하는 생각에 정리하다가 기초적인 내용이지만 블로그에 올리지 않았다는 것이 생각나서 정리해서 올립니다.^^. 아두이노로 간단하게 서보모터를 돌리는 건데요. 그냥 몇 도.. 뭐 이러면 심심하니까^^ 살짝 사인파 따라서 왔다갔다 시킬려고 합니다.%^^

일반적인 RC 서보모터 출처 : http://fos.cmb.ac.lk/esl/arduino-motor-shield/

이렇게 생긴 아이가 RC 서보모터입니다.^^. RC를 하거나 교육용 로봇을 만지는 분들은 꽤 잘 알고 있는 모양이지요^^ 아주 아주 구동하기 쉽기 때문에 많이들 사용합니다.

RC 서보모터의 구조 출처 : http://fos.cmb.ac.lk/esl/arduino-motor-shield/

내부적으로는 위와 같이 PWM 파형을 입력받아 적절한 회로를 거쳐 구동하도록 되는거죠...

RC 서보 모터의 실제 구성 출처 : http://fos.cmb.ac.lk/esl/arduino-motor-shield/

그 내부는 저렇게 생겼는데요. 모터에 엄청난 기어에 구동회로와 위치를 센싱하는 포텐셔미터까지... 딱 이렇게 구성된 것이 RC 서보 모터입니다.

RC 서보모터를 구동하는 입력 파형 출처 : http://fos.cmb.ac.lk/esl/arduino-motor-shield/

이 아이를 구동하는 방법은 전체적으로 20ms 주기의 파형을 만들고, 위 그림처럼 1.5ms의 ON 구간을 주면 중간... 0.5ms를 더하거나 빼면 좌추 90도로 회전하게 됩니다. 그러나~~~ 저런 파형조차 만들기 귀찮은 경우는 그냥 아두이노의 Servo 라이브러리를 사용하면 되겠습니다.^^

RC 서보모터와 아두이노의 연결 출처 : http://fos.cmb.ac.lk/esl/arduino-motor-shield/

아두이노와 RC 서보모터는 위 그림처럼 연결하면 됩니다. 전원과 PWM 파형이지요. 위 그림은 8번을 사용하지만.. 아래 예제에서는 9번을 사용합니다.^^

이제 제가 직접 구성한 거네요. 뭐 똑 같지만~~~^^ RC 서보모터의 갈색과 적색은 GND와 5V에 연결하고... 오랜지색(커넥션 후에 녹색)은 9번에 연결했습니다.

이제 심플한 연결 끝~~~^^

#include <Servo.h>

Servo myservo;

float desAngle;

int startFlag = 0;
float pi = 3.141592;
float ts = 0.001*0.001;
unsigned long tCount = 0;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  myservo.attach(9);
}

float sineWave(float time, float freq, float amp, float phase, float bias) {
  return amp*sin(2*pi*freq*time + phase) + bias;
}

void loop() {
  // put your main code here, to run repeatedly:
  tCount = micros();

  float t = (float)(tCount) * ts;
  
  if (Serial.available() > 0) {
    startFlag = Serial.parseInt();
  }

  if (startFlag == 1) {
    float desAngle = sineWave(t, 0.1, 45*pi/180, 0, 90*pi/180)*180/pi;
    Serial.println(desAngle);
    myservo.write(desAngle);
  }
}

모터를 한 가운데 두면 90도이기 때문에 90를 중심으로 +-45를 움직이도록 했으며, 한번 움직이는 주기는 0.1Hz 즉, 10초로 세팅을 했습니다. 이를 위해 [바로가기]에서 이야기한 micos()함수를 이용해서 시간을 측정하고, sineWave함수를 만들어 서보모터에 인가할 명령을 만들었습니다. 나머지는 뭐 아~주 쉽게 흘러갈 수 있도록 되어있네요. 아참.. 시작과 멈춤을 명령으로 줄려고 시리얼 모니터를 연결해서 1을 입력하면 모터가 구동되고, 아무거나 입력하면 멈추도록 되어있습니다.^^ 뭐 허접하지만.. 동영상하나 첨부하구요~~~^^

반응형