본문 바로가기

Hardware/Arduino and Friends

아두이노에서 타이머 구현하기

요즘 어쩌다 Python과 아두이노를 오락가락합니다.^^. 제가 최근 아두이노로 작업을 하다가 타이머의 개념이 필요해서 이전에 제가 작성했던 아두이노 타이머 라이브러리를 사용해서 해결하려 한 적이 있는데요. 시스템 자원이 부족해서 그걸로는 안되더라구요ㅠㅠ. 그래서 인터넷을 살짝꿍 서치하다가 알게된 방법에 또 언제나 그렇듯 양념을 살짝 쳐서 이렇게 공유하게 됩니다.^^

float dt = 0.02;
float freq = 0.5;
unsigned long timer, counter;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  counter = 0;
}

void loop() {
  timer = millis();

  // put your main code here, to run repeatedly:
  counter += 1;
  
  float y = 10 * sin(2 * PI * freq * counter * dt);
  
  Serial.println(y);

  // put your main code here, to run repeatedly:
  
  timer = millis() - timer;
  timer = (dt * 1000) - timer;
  
  if (int(timer)<0) { 
    Serial.print(int(timer)); 
    Serial.print(" : ");
    Serial.println("Timer Error. System Halt");
    delay(50);
    abort(); 
  }
  
  delay(timer);
}

생각보다 코드는 쉬운데요. 위 코드의 목적은 sin함수를 계산해서 시리얼로 보내구요. 그 시간간격을 20ms로 유지하겠다는 거죠. 원리는 아주 간단합니다. 시간간격을 20ms를 목표로 두고, loop()의 코드가 시작될때 시간을 측정하고, 마지막에 시간을 측정해서 남은 만큼 쉬면 되죠. 여기서 테스트용으로 만들고 있는 사인 곡선에서 사용하는 시간(t)을 꼭 counter를 사용해서 올바른 테스트입니다. 지금 목적은 설정된 시간간격이 잘 동작하는지 보는 거니까요.^^

당연한 이야기지만, 그럴경우 설정된 20ms보다 코드가 많이 걸릴 수도 있잖아요. 그래서 if 문에서 그런 상황을 체크하다가 시스템을 멈추는 거죠^^

이게 freq를 1초로 둔 겁니다. x축 숫자는 맞지 않구요. 전 그냥 초시계로 계속 측정했는데 뭐 괜찮네요^^

이건 freq를 0.5로 본거구요.

이건 2로 본겁니다. 나쁘지 않네요.. 간편하게 타이머를 구현할 수 있어서 다양한 필터에 러프하게나마 사용해볼 수 있을 것 같습니다.^^

아.. 저부분에 강제로 delay를 줘서 시간이 설정된 20ms보다 더 걸릴때 어떻게 되는지 보았는데요.

네.. 20에서 -80만큼(100이죠)이어서 에러라고 잘 동작하네요^^

반응형