쿼드콥터 제작기 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시작해야지

쿼드콥터 제작기 04 - 안드로이드 -> 아두이노 USB 시리얼통신

Posted by dw0rdptr
2015. 8. 13. 04:24 IoT/QuadCopter

APC220 모듈이랑 라즈베리파이, 알피노, 아두이노 나노가 도착했다


아두이노 나노에서 우노로 apc220모듈로 통신하는방법은 간단하다 보드레이트만 맞춰주고 소프트웨어 시리얼로 하면 끝!

참고- apc220모듈 통신 http://bbangpan.tistory.com/27 


이제 안드로이드에서 시리얼브릿지(아두이노 나노)로 usb시리얼통신을 하면 되는데, 안드로이드를 해본적이 없어 여기서 일주일은 삽질하면서 보낸 것 같다. 다 때려치고 조종기 하나 사버릴까 하는 생각도 했고.. 

옆동네 사과랑 달리 안드로이드는 따로 usb시리얼을 지원을 안해서 드라이버 소스코드를 가져다 써야 한다고 한다.

https://github.com/mik3y/usb-serial-for-android  - 안드로이드 usb 시리얼 드라이버

이 드라이버를 프로젝트에 넣고 알아서 하면된다.

----------------------------------------------------------------------

여기까지 안드하는사람 기준 


나같은 경우는 

http://android.serverbox.ch/?p=549 여기에있는 소스를 거의 가져다 썼다. 

아두이노 analogWrite()함수의 pwm신호 범위에 맞게 0~255로 seek바 값의 범위를 맞추고 아두이노 우노까지 전달이 되는지 시리얼모니터를 키고 테스트해봤다.( 동영상은 우노와 나노가 바뀌었음 )

일주일간의_삽질이_끝나는_순간


다음글은 아마 ESC캘리브레이션이 될것같다.

이제 속도가 좀 붙을것 같으니까 다음주가 개학이네 언제쯤 날릴수 있을까..


쿼드콥터 제작기 03 - 안드로이드-아두이노 통신

Posted by dw0rdptr
2015. 7. 11. 04:16 IoT/QuadCopter

처음 계획은 안드로이드->아두이노로 블루투스를 이용해 통신하려고 했는데 블루투스 통신거리가 100미터밖에 안돼 모자란 감이 있어 

1km까지 통신가능한(실제로는 6~700m정도 될듯) RF통신모듈로 아두이노 나노를 거쳐 통신하는 방법을 찾았다

Android -----> Arduino nano -----> Arduino Uno(나중에 Rpino로 교체)

         serial                 APC220


출처- http://yogibotics.blogspot.kr/2013/02/arduino-android-apc220-rc-car.html


APC220 스펙

개요

  • APC220 라디오 모듈은 무선 데이터 통신을 위한 간단한 솔루션입니다.
  • 고속 마이크로프로세서를 탑재하여 UART/TTL 인터페이스를 제공하며, 패킷화 및 데이터 인코딩을 처리합니다.
  • 개활지에서 약 1000m 거리에서 통신이 가능합니다.

특징

  • Transmit distance up to 1000m (line of sight) @9600 bps
  • 256 bytes data buffer
  • High sensitivity (-112dbbm @9600 bps)
  • GFSK modulation
  • UART/TTL interface
  • Embedded watch dog
  • Size: 37x17x6.5 mm

구성품

  • APC220 module(2 units)
  • Antenna for radio communication(2 units)
  • USB to TTL Converter (CP210) (1 unit)



그냥 편하게 RC조종기랑 수신기를 사면 편하지만 이왕 만드는거 고생 제대로한번 해보자는 생각으로 구현해보려고 한다

안드로이드에서는 자이로센서를 이용해 쿼드가 나아가는 방향을 컨트롤하고 카메라로 영상송출은.. 일단 띄우고 생각해보자


-----10/9 추가-----

다른 분 블로그에서 시리얼브릿지 역할을 하는 아두이노 나노없이 apc220모듈과 안드로이드 디바이스를 직접 연결 할 수 있다고 한다.

조만간 시도해볼 예정