쿼드콥터를 할지 안할지는 모르겠지만 관심이 생겨서 일단 공부해보고 있습니다.
내용을 알아야 판단을 할수 있지 않겠어요? ^^
일단 용어부터 정리해봅니다.

브러쉬 모터(깡통모터)
  흔히 볼수 있는 모터들로 모터의 중심축에 전기를 전달하는 접점이 있다.
  이 접점부분이 모터의 사용에 따라 소모되어 수명에 영향을 미친다.

브러쉬리스 모터
  코일에 보통 교류 전류를 전달하여 모터를 회전시키는 방식

Outrunner(통돌이 모터)
  브러쉬리스 모터의 한 종류로 코일을 고정하고 축과 통이 회전하는 방식. 토크가 좋음

BLDC 모터
  브러쉬리스 모터가 교류 방식인것을 사용 편의를 위해 직류방식으로 바꿔 놓은것이다.
  3개의 단자로 되어 있고, 순차적으로 DC를 보내서 구동

ESC(Electric-Speed-Controller)
  전자 변속기를 말한다.
  보통 PWM을 사용하여 모터를 제어 한다.
  브러쉬용과 브러쉬리스용이 따로 있다.

PID

비례-적분-미분 제어기(PID 제어기)는 실제 응용분야에서 가장 많이 사용되는 대표적인 형태의 제어기법이다. PID 제어기는 기본적으로 피드백(feedback)제어기의 형태를 가지고 있으며, 제어하고자 하는 대상의 출력값(output)을 측정하여 이를 원하고자 하는 참조값(reference value) 혹은 설정값(setpoint)과 비교하여 오차(error)를 계산하고, 이 오차값을 이용하여 제어에 필요한 제어값을 계산하는 구조로 되어 있다.

표준적인 형태의 PID 제어기는 아래의 식과 같이 세개의 항을 더하여 제어값(MV:manipulated variable)을 계산하도록 구성이 되어 있다.

\mathrm{MV(t)}=K_p{e(t)} + K_i\int_{0}^{t}{e(\tau)}\,{d\tau} + K_d\frac{de}{dt}

이 항들은 각각 오차값, 오차값의 적분(integral), 오차값의 미분(derivative)에 비례하기 때문에 비례-적분-미분 제어기 (Proportional–Integral–Derivative controller)라는 명칭을 가진다. 이 세개의 항들의 직관적인 의미는 다음과 같다.

  • 비례항 : 현재 상태에서의 오차값의 크기에 비례한 제어작용을 한다.
  • 적분항 : 정상상태(steady-state) 오차를 없애는 작용을 한다.
  • 미분항 : 출력값의 급격한 변화에 제동을 걸어 오버슛(overshoot)을 줄이고 안정성(stability)을 향상시킨다.

PID 제어기는 위와 같은 표준식의 형태로 사용하기도 하지만, 경우에 따라서는 약간 변형된 형태로 사용하는 경우도 많다. 예를 들어, 비례항만을 가지거나, 혹은 비례-적분, 비례-미분항만을 가진 제어기의 형태로 단순화하여 사용하기도 하는데, 이때는 각각 P, PI, PD 제어기라 불린다.

한편, 계산된 제어값이 실제 구동기(actuator)가 작용할 수 있는 값의 한계보다 커서 구동기의 포화(saturation)가 발생하게 되는 경우, 오차의 적분값이 큰 값으로 누적되게 되어서, 정작 출력값이 설정값에 가까지게 되었을 때, 제어값이 작아져야 함에도 불구하고 계속 큰 값을 출력하게 되어 시스템이 설정값에 도달하는 데 오랜 시간이 걸리게 되는 경우가 있는데, 이를 적분기의 와인드업이라고 한다. 이를 방지하기 위해서는 적절한 안티 와인드업(Anti-windup) 기법을 이용하여 PID 제어기를 보완해야 한다.

위의 식에서 제어 파라메터 Kp,Ki,Kd를 이득값 혹은 게인(gain)이라고 하고, 적절한 이득값을 수학적 혹은 실험적/경험적 방법을 통해 계산하는 과정을 튜닝(tuning)이라고 한다. PID 제어기의 튜닝에는 여러 가지 방법들이 있는데, 그중 가장 널리 알려진 것으로는 지글러-니콜스 방법이 있다.


PWM(Pulse-width modulation)
  펄스의 폭만 조절하여 On:Off의 비율을 조절함으로써 중간 값을 만들어내는 효과를 얻는 것이다.
  보통 디지털 회로에서 아날로그값 출력 효과를 만들기 위해 사용한다.

. 수신기
수신기는 조종기 셋트 구입시 함께 제공되며, 조종기의 형태에 따라 
크게 PPM와 PCM방식의 수신기가 있습니다.  즉, 아날로그 조종기에는
PPM방식의 수신기가 사용되고, 디지털 조종기에는 PCM방식의 수신기
가 쓰이나 PPM방식도 사용될 수 있습니다.

PPM
- PPM
   이 방식은 FM주파수를 그대로 사용하는 방식입니다.  단점은 조종
기에서 송신된 신호에 노이즈나 순간적인 이상이 생기면, 즉시 수신기
에 연결된 서보들이 불규칙한 반응을 보입니다.  반면, PCM방식에 비
해 가격이 싸고, 신호에 약간의 노이즈가 생겨도 계속해서 조종이 가
능하다는 점이 있기에 PCM방식보다 PPM방식을 더욱 선호하시는 분들도
계십니다.

- PCM
   이 방식 역시 FM주파수를 사용하는 이 신호를 암호화하여 송/수신
하는 디지털 방식입니다.  이 방식은 비교적 노이즈에 강하나, 일단
이 디지털 신호에 어떠한 간섭이나 노이즈가 걸리면, 통제 불능의 상
태로 빠지는 단점이 있습니다.  그러나, 이러한 경우, PCM수신기는
'Fail Safe'라는 모드가 있어, 이 fail safe모드를 조종기에서 프로그
램했다면, 수신기는 각 서보를 조종기에서 설정한 위치로 이동케하며,
신호가 정상적으로 돌아오면 정상적으로 계속해서 작동시킬 수 있습니다.
  

프로펠러 규격
  두개의 숫자로 표시하는데 10x3.8 라고 하면 앞의 10은 프로펠러의 길이를 뒤에 3.8은 피치를 나타내는데, 프로펠러가 한바퀴 회전하였을때 전진하는 거리를 인치로 표시한다. 두 수의 곱이 같은 두프로펠러는 같은 부하가 걸리지만 이동 거리는 뒤의 숫자에 따라 달라지게 됩니다.

IMU(Inertial measurement unit: 관성계측장치)
  관성을 측정하는 장치로 자이로와 가속도 센서가 이용된다.

CDS는 photo register 또는 photo cell 이라고도 부르며 빛의 밝기를 저항값으로 출력해주는 센서입니다.
PWM이란 펄스의 폭을 조절함으로써 전압을 제어하는 효과를 주는 기능으로 LED의 밝기를 조절한다거나 모터의 회전수를 조절하는등에 사용됩니다.

사용부품 : 220옴 2개, 10k옴 1개, led 2개
CDS가 스위치 역할을하여 초기상태보다 어두워지면 작동을 시작합니다.
즉 CDS의 빛을 가리면 작동을 시작합니다.

10번핀 LED는 천천히 켜졌다 어두워지고, 9번 LED는 빨리 켜졌다 어두워집니다.
두 속도가 다른 LED가 동시에 제어되는 예제입니다.

입력으로 CDS를 아날로그 0번 핀에 사용하고, 출력으로 LED 2개를 PWM 핀 9,10번에 연결했습니다.



      
위 동영상이 동작 모습입니다.

#include <stdio.h>

int photocellPin;
int buttonPin = 2;
int ledValue = LOW;

int cdsInitValue=0;
int fadeVal[12]={0};
long fadeTimer;

void InitCDS(int pin){
  photocellPin = pin;
  cdsInitValue=0;
  int i;
  for (i=0; i<10; i++){
    cdsInitValue +=  analogRead(photocellPin);
  }
  cdsInitValue = cdsInitValue / i;
}

int IsCDSOn(int val){
  int photocellReading = 0, i;
  for(i=0; i<3; i++){
    photocellReading += analogRead(photocellPin);
  }
  photocellReading /= i;
  
  char s[255];
  sprintf(s, "read=%d, initVal=%d\n", photocellReading, cdsInitValue);
  //Serial.print(s);
  
  if (val > 0){
    if (photocellReading > cdsInitValue + val)
      return 1;
    else
      return 0;
  }
  else {
    if (photocellReading < cdsInitValue + val)
      return 1;
    else
      return 0;
  }    
}

void InitFade(int val){
  for(int i=0; i<12; i++){
    fadeVal[i] = val;
  }
  fadeTimer=0;
}

int FadeCore(int pwmPin, int fadeSpeed, long startTime){
  char s[255];
  sprintf(s, "[%2d],timer=%ld, startTime=%ld\n",pwmPin, fadeTimer,startTime);
  Serial.print(s);
  if (fadeTimer < startTime) return fadeVal[pwmPin];
  
  fadeVal[pwmPin] += fadeSpeed;
  //char s[255];
  sprintf(s, "spd=%d, cnt=%d\n", fadeSpeed, fadeVal[pwmPin]);
  Serial.print(s);
  
  if (fadeVal[pwmPin] < 0) fadeVal[pwmPin] = 0;
  if (fadeVal[pwmPin] > 255) fadeVal[pwmPin] = 255;
  
  analogWrite(pwmPin, fadeVal[pwmPin]);
  /*
  if (fadeSpeed > 0){
    if (countFade < 255) return 1;
    else return 0;
  } else {
    if (countFade > 0) return 1;
    else return 0;
  }
  */
  return fadeVal[pwmPin];
}

void FadeDelay(long ms){
    delay(ms);
    fadeTimer += ms;
}

void Init(){
  int cdsPin = 0, startVal = 0;
  
  InitCDS(cdsPin);
  InitFade(startVal);
}

void setup(void) {
  Serial.begin(9600);  
  Init();  
}

void loop(void) {
  int fadeStep=3, fadePin10=10,fadePin9=9, cdsSense=-40, val1=0, val2=255, timeDelay=10;
  
  while (IsCDSOn(cdsSense) == 0);
  
  InitFade(0);
  while(val1 < 255){
    val1 = FadeCore(fadePin10, fadeStep, 0);
    FadeCore(fadePin9, fadeStep*4, 80);
    Serial.println(val1);
    FadeDelay(timeDelay);
  }

  InitFade(255);
  while(val2 > 0){
    val2 = FadeCore(fadePin10, fadeStep * (-1), 0);
    FadeCore(fadePin9, fadeStep * (-4), 80);
    FadeDelay(timeDelay);
  }
}


  1. 이한샘 2012.09.18 20:00

    제가 이번에 첨으로 프로젝트를 하는데 cds와 pic을 이용해서 밝기를 4~5단계로 제어하려합니다
    근데 진짜 첨이라 회로도나 필요한 부품도 모르겠더라고요
    혹시 정보가 있으시면 좀 알려주세요

+ Recent posts