본문 바로가기

Hardware/Arduino and Friends

아두이노(Arduino)에서 타이머(timer) 이벤트 사용하기

아두이노~ 요즘 참 선풍적인 인기죠^^. 저도 몇 번 아두이노 이야기를 했는데요. 오늘은 살짝 예전 MCU를 다룰때 쓰던 타이머 인터럽트 같은 느낌을 구현할 수는 없을까하는 생각에 찾아본 라이브러리인데요. 소개해드릴려구요. 뭐 이게 없어도 milli() 함수를 이용해 시간을 측정하고 다시 이를 이용해서 속도 등을 계산하는데 큰 무리는 없는데요. 간혹 좀 일정한 시간 간격을 원할 때가 생기지요^^.

위 화면에서 보이는 곳으로 [바로가기]가면 타이머 라이브러리를 받을 수 있답니다. 설치는 일반적인 라이브러리 설치하시듯 하시면 됩니다. 

#include <Timer.h>
Timer ts;
int samplingT = 10;
int checkCNT = 0;
unsigned long time;
unsigned long preTime = 0;

void setup() {
  Serial.begin(115200);
  ts.every(samplingT, doTest);
}
void loop() {
  ts.update();
}
void doTest() {
  time = millis();
  if (samplingT != time-preTime) {
    checkCNT++;
    Serial.print("at ");
    Serial.print(time);
    Serial.print(" : ERROR.   =>   ");
    
    double errorRate = float(checkCNT)/(float(time)/float(samplingT))*100;
    Serial.println(errorRate);
  }

  preTime = time;
}

위 코드에서 먼저 1번행 처럼 Timer.h를 불러주고, 타이머에서 변수를 하나 지정하시고(3번행), 11번행처럼 설정하시면 됩니다. 여기서는 msec단위기 떄문에 일단 10msec 단위로 타이머 이벤트를 실행하고, 실행할 이벤트는 doTest()로 지정한거죠. 

doTest()에서는 시간을 측정해서 msec단위로 출력해주는 millis()함수를 이용해서 타이머 이벤트의 시간간격이 괜찮은지를 보았습니다.

보다시피 대략 한 4%의 오차가 있네요. 100번중 4번은 10msec를 못 맞춘다는 거네요. 다시 확인해보면 1msec 정도씩 틀어지는 듯 했습니다. 그러나 100msec나 50msec 정도는 안정적이었습니다. 그러나 또 확인할 것은 타임 이벤트에서 실행할 코드의 길이가 되겠죠. 하여간 아두이노가 속도를 바라보고 사용하는 애는 아니니까요.^^.

반응형