[아두이노] Servo.h 없이 직접 서보모터를 회전

IOT/아두이노|2019. 2. 20. 13:38

[아두이노] Servo.h 없이 직접 서보모터를 회전



이번에 서보모터의 단순히 전원 공급으로만로 회전을 시켜보는 걸 해보겠습니다. 이것도 오래전 Servo.h 없이 제어를 할 수 있는 방법이 없을까 하고 고민을 좀 했었습니다.
https://github.com/esp8266/Arduino/blob/master/libraries/Servo/src/Servo.h 에서 Servo 클래스에 대해 분석도 하고 했지만 너무 복잡하더군요. 그냥 단순 제어를 해볼려고 조사하다가 전기 신호 파형에 따라 각도를 제어할 수 있다고 해서 digitalWrite()함수 하나로 제어하는 실험을 하게 되었습니다. 혹시 서보모터의 원리를 보다 자세히 알고 싶다면 구글링 서보모터원리라는 단어로 하시면 쉽게 찾을 수 있을거에요. 이번 실험은 전류를 서보모터에 보내고 펄스 간격을 시간값으로 해서 쪼개서 전류공급과 차단을 하면 서보모터의 회전을 시키는 실험으로 진행됩니다. 그리고 이전에 포스팅한 Ardunio min = 544, max=2400 값을 기준으로 이번에 가상시뮬테이의 회전 실험을 해보도록 하죠. 제 블로그의 있던 소스를 그대로 가져와서 실험 포스팅을 하도록 하겠습니다. 고치자니 귀찮니즘이 밀려와서 구지 고칠 필요가 없다고 생각되어 그냥 소개합니다.
그리고 가상시뮬레이터에서 실험하던 당시 서보모터가 다른 기종이여서 min=1000, max=2000을 기준으로 회전시켰지만 이번 실험은 544~2400 값으로 해서 회전이 되는 서보모터를 사용하여 기준은 544~2400으로 실험했습니다.

1. 서보모터의 회전 이해


구글링 검색하시면 서보모터 원리에 대해서 자세히 소개되어 있는데 그냥 아래의 그림처럼 단순하게 생각하시고 넘어가시면 됩니다. 전기 신호는 일정한 간격으로 해서 아래와 같은 파형을 만들어 냅니다. 전류가 공급되고 차단하는 그 시간차 값으로 서보모터의 각도를 만들어 낸다고 가단히 생각하세요. 전류 공급(5V)가 짧은 간격으로 공급된다면 회전하는 각이 그 시간만큼만 회전한다고 생각하면 됩니다.


파형을 아두이노에서 만든다면( Ardunio min = 544, max=2400 값을 기준)

   digitalWrite(servoPin, HIGH);  
   delayMicroseconds(1500);     
   digitalWrite(servoPin, LOW);   
   delayMicroseconds(펄스간격남은값);   

즉, 서보모터 핀에 HIGH(5V)의 전류를 1500마이크로초 동안 전류를 공급하고 LOW(0)로 전류를 차단을 펄스간격남은값(max-회전시간값)만큼이란 표현입니다. 현실 구동은 스피드하게 회전하지 않겠지만 가상시뮬레이터에서 저리 코딩하면 순간 90도정도의 각도로 회전해버립니다. 가상시뮬레이터에서 서보모터라이브러리에서 제공되는 함수와 비슷하게 회전을 보여줄려면은 대충 delay()함수로 시간을 좀 더 크게 대기시켜서 보면은 최대한 비슷하게 회전합니다.

대충,

void setup() {
  pinMode(9, OUTPUT);
}
void loop() {
   digitalWrite(9, HIGH);  
   delayMicroseconds(1500);     
   digitalWrite(9, LOW);   
   delayMicroseconds(2400-1500);   
   delay(100);
}

이정도만 코딩해서 아래 회로도 디자인한 곳에다 코딩을 넣어보세요. 1500시간값만큼의 각도까지 움직이다가 그 각도에서 덜덜덜 떨고 있을꺼에요. 정상적으로 동작되는걸 보실꺼에요

여기서 펄스간격남은값 2400-1500으로 해서 펄스 간격을 일정하게 만들었습니다. 그냥 아두이노의 최대값 2400을 펄스간격 기준값으로 설정했네요. 펄스간격 기준값 2400을 기준으로 얼마만큼의 시간이 5V와 0V가 되었는지의 시간입니다. 그래서 1500만큼의 전류가 공급되었으니 나머지 시간은 LOW에 할당해야겠죠.

쉽게말해서, 회전 파형을 만든다고 생각하시면 됩니다. 구지 자세히 생각하지 마시고요. 이런게 있다는 정도만 이해하시고 오늘 포스팅을 깊게 이해하실 필요 없습니다. 그냥 Servo 라이브러리 파일이 오픈소스로 제공되는데 구지 힘들게 만들 필요는 없겠죠. 이렇게 만들었다고 해서 정교한 컨트롤은 되지 않으며 단지 이런식으로 회전이 이뤄지는 거구나 정도용이니 깊게 생각하지 마세요.

2. 회로도 구성


  • 준비물 : 서보모터 1개, 아두이노우노
  • 내용 : 서보모터 회전 시키자


서보모터는 Vcc(5V), Gnd, Signal(입력신호)로 3핀이로 구성되어 있고 아두이노에서 Signal핀에 신호를 보냄으로써 각도를 제어는 지난시간과 동일합니다.

3. 코딩


  • 사용함수 : pinMode(사용핀, 모드), digitalWrite(사용핀, 상태), delayMicroseconds(시간값), delay(시간값)
  • 내용 : 간단히 180도 회전만 시키자.

설계

우선 delayMicroseconds() 함수를 사용한 목적은 서보모터를 회전시킬 시간값이고 지연시간도 이 함수로 사용했습니다. 그리고 0~180도까지 회전이 끝나면 delay()로 1초동안 잠시 대기는 목적으로 사용합니다.

그리고 digitalWrite()함수를 사용하기 위해서는 pinMode()함수로 핀모드를 설정해야 합니다. 그리고 digitalWrite()함수로 서보모터에 신호값으로 전류 공급과 차단으로 전기신호파형을 만들어 특정 각으로 회전시킵니다.

코딩을 하면

int servoPin = 9;
int m_max=2400;

void setup() {
  pinMode(servoPin, OUTPUT);
}

void loop() {
  for(int i=544;i<2400;i++){
   digitalWrite(servoPin, HIGH);  
   delayMicroseconds(i);     
   digitalWrite(servoPin, LOW);   
   delayMicroseconds(m_max-i);    
  }
  delay(1000);

  for(int i=2400;i>544;i--){
   digitalWrite(servoPin, HIGH);  
   delayMicroseconds(i);     
   digitalWrite(servoPin, LOW);   
   delayMicroseconds(m_max-i);    
  }
  delay(1000);
}
}

for문으로 사용해서 min(544)값에서 max(2400)값이 될때까지 delayMicroseconds(i)로 전류의 공급 간격입니다. 이게 바로 각도이고요. delayMicroseconds()함수을 이용하여 전기 파형을 만들어 냅니다. 전류 공급시간이 작을 경우 펄스간격 시간단위로 짧은 파형이 작게 형성됩니다. 그럴때 서보모터의 움직이는 회전이 짧아서 그 상태를 유지하는거고요 i값이 클경우 그 파형이 크게 형성됩니다. 서보모터의 움직이는 회전각 커집니다. 그리고 그 회전에 도달하면 더이상 회전을 하지 않으며 그 회전각을 계속 유지하게 됩니다. 544에서 2400될때까지 전원 공급 간격이 점차적으로 커져가니깐 결과적으로 0~180도로 회전을 시키게 되는 것이죠. 두번째 for문은 2400에서 544가 될때까지 i의 전원 공급 간격이 적어지니깐 180~0도로 회전을 시키게 됩니다.

이해가 안된다고 생각하시면 쉽게 delayMicroseconds(i) 각도로 생각하시고 전원 공급과차단의 간격을 펄스간격 기준값(m_max)값이라고 생각하시면 됩니다. 펄스간격동안 delayMicroseconds()함수로 전류의 파형을 만들고 그 파형만큼의 각도로 회전을 시킨다고만 이해하시면 됩니다.

4. 결과


따로 제작과정없이 그냥 코드만 삽입해서 그 결과를 보여드립니다. 한번 서보모터 회전를 이해하기 위해서 동영상에서 과연 1500마이크로초 동안 공급될때 어느정도의 회전이 되고 그 상태를 유지할때 서보모터의 움직임을 유심히 살펴보시면서 회전을 어떤 느낌으로 회전되는지 이해하시면 되겠습니다. 그리고 본론으로 들어간 실험 코딩은 0~180도까지 회전 시키고 1초 대기했다가 180~0도까지 회전 시키는 과정을 반복합니다. 그리고 여기서는 아두이노우노의 2400의 값을 펄스파형을 이 일정하게 증가하다가 일정하게 감소하는 과정에서 전류를 시간값으로 해서 파형을 만들어내고 그 파형에 따라서 각도가 발생하는 점을 생각하시고 동영상의 서보모터의 회전을 보시면 되겠습니다.

마무리


쉬울 것 같아서 소개했는데 하고나니깐 이거 전기 신호의 파형을 봐야하고 서보모터의 동작원리를 자세히 알아야하는데 그렇게 자세히 설명을 하자니 삼천포로 빠질 가능성이 있어서 기본만 설명하다보니 좀 애매하게 됐네요.
오늘 포스팅 내용은 그냥 이런게 있구나 정도로만 하고 그냥 넘어가시고 구지 깊게 생각할 필요 없고요 편하게 Servo.h 의 Servo 클래스를 이용하시면 됩니다.
그냥 예전에 호기심에서 시작해서 그냥 제어만 해본거라 오늘 포스팅은 가볍게 읽고 이해가 안되더라도 무시하고 넘어가시면 됩니다.


댓글()