쿼드콥터 제작기 05 -PWM과 제어주기,ESC 캘리브레이션

Posted by dw0rdptr
2015. 8. 16. 02:12 IoT/QuadCopter

조종기 구현도 완벽하게 끝난건 아니지만 일단 호버링이 되어야 방향전환을 할 수 있으니 천천히 하면되고 ESC셋팅부터 하자

ESC는 모터제어 신호를 PWM으로 받아 아두이노에서 PWM을 전달해줘야 한다. 


PWM(pulse Width Modulation)?

아두이노는 모터의 속도를 단계별로 출력하는 아날로그 신호를 출력하지 못하는데

대신 일정한 주기로 디지털신호를 껐다 켰다 하면서 아날로그신호처럼 쓰는게 PWM이다. (따로 있는 아날로그 핀은 입력만 받는 용도)

PWM에는 보드에서 지원하는 하드웨어PWM과 직접 구현하는 소프트웨어PWM이 있는데 반응속도가 빨라야 하는 쿼드콥터에선 하드웨어PWM을 쓴다고 한다.

하드웨어PWM은 analogWrite 함수를 써서 출력할 때 0~255단계 값을 입력가능하다.


짚고갈게 하나 더 있는데,

첫글에서 말했듯이 쿼드콥터의 제어주기는 약 2ms주기로는 돌아야 안정적으로 기체를 제어 할 수 있다. 1초에 2ms주기를 500번 도니까 주파수는 500hz가 된다. 

아두이노에서는 디지털 3,5,6,9,10,11번 핀이 하드웨어 PWM을 지원하는데 이중에서 3,9,10,11번의 주파수가 490hz로 고정되어 있어 이 네개의 핀을 쓴다.

보통 ESC에서 최소PWM 신호는 1ms. 최대 신호는 2ms를 기본으로 한다. 


정리하면 

쿼드콥터를 안정적으로 제어하려면 2ms 주기(약 500hz 전후)로 ESC 최저 1ms, 최고 2ms의 신호를 ESC에 전달해주어야 한다.


이걸몰라서 엄청 헤맸다가 겨우 개념이 잡혔다.. 참고로 제어주기는 아두이노기준(490hz)으로 설명한거라 그렇지 2.5ms 까지도 안정적이라고 한다. 

가끔 Servo라이브러리를 쓰는사람들도 있는데 50hz라 외란에 대응 못한다고 하더라 아래 비교한 동영상을 보자

* 2016.1.23 추가 : Servo 라이브러리를 400Hz로 변경할 수 있는 방법이 있다고 합니다.  Servo의 경우 좀더 세밀한 단계로 조정할 수 있기 때문에 정말할 제어가 가능해져 Servo라이브러리를 써볼 예정. 추후 정리해서 포스팅하겠습니다.


딱봐도 모터의 응답성이 달라진다 이게 나중에 PID적용할 때에도 크게 작용하는거라 어떻게보면 제일 중요할듯

  


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <SoftwareSerial.h>
 
SoftwareSerial APC(78); // RX and TX
int value=126;
int Motor[] = { 391011 };
 
void setup()
{
  APC.begin(57600); // start serial to APC
  Serial.begin(9600);
  for(int i=0;i<4;i++)
    pinMode(Motor[i],OUTPUT);
}
 
void loop()
{
  if (APC.available())
  {
    value = (int)APC.read(); 
    Serial.println(value);
   
    for(int i=0;i<4;i++)
      analogWrite(Motor[i],value);
  }
  else
  {
    Serial.println(value);
    for(int i=0;i<4;i++)
      analogWrite(Motor[i],value);
  }
 
}
 
cs

7,8번핀으로 APC모듈로 받은 값을 APC.read()함수로 읽어서 value에 넣고 analogWrite()함수로 3,9,10,11핀에 연결되어 있는 ESC에 2ms주기로 PWM 신호를 전달해준다.

만약 모듈에서 새로 넘어온 값이 없으면, 즉 쓰로틀 변화가 없으면 그 전에 들어온 값으로 역시 2ms주기로 계속 넘겨준다.  

analogWrite()함수 기준 0~255 중 ESC의 최저속도 신호인 1ms에 대응되는 값은 약 126, 최고속도 신호인 2ms에 대응되는 값은 약 250이라 조종기 쓰로틀바 범위를 126~250로 잡아줘야 한다


이제 ESC캘리브레이션을 해보자

ESC는 초기설정이 되어있는데 ESC마다 약간씩 신호범위가 달라서 같은 PWM신호에 같은출력을 낼 수 있도록 해주는게 캘리브레이션이다

최대신호와 최소신호만 주면 간단하게 끝난다

Turnigy plush 25A 기준으로 조종기 쓰로틀을 최대로 올리고 배터리를 연결하면 비프음이 두 번 울리는데 이때 쓰로틀을 최소로 낮추면

비프음이 배터리 셀 개수만큼 울리고 한번 길게울리면 셋팅 끝! 쓰로틀을 올려보면 모터가 정상적으로 도는걸 볼 수 있다


*영상에서 쓰로틀을 반만내렸는데, 저때 쓰로틀바 범위가 0~255까지라 수정을 해야되는데 안스가 터져서 급하게 아두이노에서 시리얼로 받은 126미만값은 모두 126으로 고정해서 캘리브레이션을 진행함 ㅠㅠ

지금은 수정해서 126~250으로 바꿨다



역시 드림엔터에서 밤새서 빡세게 하니까 진행이 빠르게 되는것같다 

조만간 PID시작해야지