티스토리 뷰

드론

[드론] millis 함수를 이용하기

Waterbottle 2016. 6. 27. 15:31


시간함수 -millis()함수


1. 드론에서 사용하는 목적

    • 자이로센서 값을 이용하여 드론이 회전한 각도 계산
    • PID 출력 값을 얻어낼때 미분과 적분을 사용하는데 이때 millis()함수를 이용하여 단위(dt)값을 얻어냄



2. millis()와 delay()의 차이점


millis()함수 : 시간과 관련된 여러개의 작업들을 동시에 수행하고자 할 때, 꼭 필요한 함수 -> 아주 중요한 지연함수


delay()함수 : 여러개의 작업들을 동시에 수행하고자 할 때 사용하기에는 적합하지 않다.



즉,  delay() 함수를 이용해서 millis()함수와 다른점을 예시로 들어보면,

A라는 LED와 B라는 LED가 있다고 가정하자, A라는 LED는 1023밀리초 간격으로 ON/OFF를 하고 B라는 LED는 509밀리초 간격으로 ON/OFF를 하고싶다. 그러면 동시에 작업을 수행해야하는데 delay는 동시에 사용을 하기에 적합하지 않으므로 delay함수를 사용 안하고 millis 함수를 사용하는 것이다.



위 내용을 코드상에서 보여드리겠습니다.



//1023밀리초 간격을 LED ON/OFF
const int statusLedPin = 14;
int statusLedOnOff = LOW;
unsigned long prevMillisSL = 0;
const long intervalSL = 1023;

//509밀리초 간격으로 LED ON/OFF
const int lipoLedPin = 15;
int lipoLedOnOff = LOW;
unsigned long prevMillisLL = 0;
const long intervalLL = 509;

void setup() {
  pinMode(statusLedPin, OUTPUT);
  pinMode(lipoLedPin, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  unsigned long currMillis = millis();

  if(currMillis - prevMillisSL >= intervalSL){
    prevMillisSL = currMillis;

    statusLedOnOff = (statusLedOnOff = LOW) ? HIGH : LOW;
    digitalWrite(statusLedPin, statusLedOnOff);
  }

  if(currMillis - prevMillisLL >= intervalLL){
    prevMillisLL = currMillis;

    lipoLedOnOff = (lipoLedOnOff == LOW) ? HIGH : LOW;
    digitalWrite(lipoLedPin, lipoLedOnOff);
  }
}
Comments