본문 바로가기

Hardware/Arduino and Friends

갈릴레오 보드 / 아두이노에서 시간에 대해 미분 적분 수행하기

갈릴레오(Galileo Gen2) 보드가 나온지는 꽤 되었는데요. 저는 최근에야 한 번 테스트를 해 보았네요. 갈릴레오에도 어차피 아두이노가 있으니 일반 아두이노 보드 쓰는것과 큰 차이는 없겠지만... Sublime Text를 IDE로 사용하던 저는 현재 STINO[바로가기]가 정상적으로 갈릴레오를 지원하지 않는듯 해서 조금 아쉽네요ㅠㅠ. 뭐 아무튼.. 예전에 아두이노에서 타이머 이벤트를 지원해주는 라이브러리[바로가기]를 소개한 적이 있는데요. 그건 약간 한계가 있더군요. 일단 빠른 시간을 설정하는 것이 좀 힘들고, 결정적으로 PWM과 약간의 문제가 있는듯 했습니다.(이런 얇은 지식이란..ㅠㅠ) 그래서 이번에는 시간을 측정하는 micros()라는 함수를 사용할까하고 한 번 예제를 꾸며보았네요^^



갈릴레오2입니다. 아두이노스럽지 않게 커서 좀 놀랍지만... 또 한 편.. 기대도 되죠^^



아까 이야기한데로 IDE를 기본으로 사용할 수 밖에^^. 일단 코드부터 설명을 해야죠^^


 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
34
35
36
37
38
39
40
41
42
43
44
45
const float pi = 3.141592;
const float ts = 0.001*0.001;
unsigned long tCount = 0;
unsigned long tCountPre = 0;

float t, y, dot_y, dt;
float int_y = 0;
float y_pre = 0;

void setup() {
  Serial.begin(115200);
}

void saveStatesForNextStep() {
  tCountPre = tCount;
  y_pre = y;
}

void printStates(float t, float y1, float y2, float y3) {
  Serial.print(t, 4);
  Serial.print(", ");
  Serial.print(y1, 4);
  Serial.print(", ");
  Serial.print(y2, 4);
  Serial.print(", ");
  Serial.println(y3, 4);
}

float sineWave(float time, float freq, float amp, float phase, float bias) {
  return amp*sin(2*pi * freq * time + phase) + bias;
}

void loop() {
  tCount = micros();
  
  t = (float)(tCount) * ts;
  dt = (float)(tCount - tCountPre) * ts;

  y = sineWave(t, 1, 1, 0, 0); //(time, freq, amp, phase, bias)
  dot_y = (y - y_pre)/dt;
  int_y += y*dt;
  
  saveStatesForNextStep();  
  printStates(t, y, dot_y, int_y);
}


뭐~~~ 언제나 그렇듯.. 항상 짧습니다.^^. 여하튼 sineWave()함수는 삼각함수의 결과를 구하는 간단한 시험용 함수구요. saveStatesForNextStep()은 현재 상태를 미분과 적분을 위해 저장하는 함수입니다. 시간 간격을 측정하기 위해 현재 카운트와 현재 값을 저장하죠...

34번행에서 사용하는 micros()가 주요함수 입니다. 마이크로세크 단위로 시간카운트를 반환하는데요. milis()는 미리세크단위로 반환하구요. 뭐 아무튼... 현재 시점의 시간 카운트를 알려준다는거죠^^ 그걸 이용해서 이전에 실행될때의 시간과 현재의 시간을 알 수 있구요... 그러므로 40번행에서 시간을 나눠서 미분, 41번행에서 시간을 곱하면서 적분을 수행할 수 있게 된겁니다. 그걸 시리얼 모니터로 뿌렸고... 살짝 그래프를 PC에서 그려보았네요^^

먼저 시리얼 통신으로 전송된 데이터입니다.



위 프로그램 코드에서 printStates()에 의해 첫 번째 열은 초 단위로 환산한 시간입니다. 그걸 보면 대략 300에서 400마이크로 세크마다 데이터를 받았네요. 두 번째 열은 그 시간에 맞는 sin함수의 결과이구요. 세 번째는 그걸 미분한것이고 네 번째 열은 적분한 것입니다. 이 데이터는


test.txt


이니 받아서 그려보셔도 되구요^^



그걸 그려 보니 위 그림과 같습니다. 미분한걸 확대해보니 좀 찌글찌글한 것이 보이는 곳도 있습니다만... 시간을 사용해서 아두이노에서도 미분과 적분을 수행해 보았네요. 아마 갈릴레오 보드라서 좀 더 빨리 움직였을 거구요^^



반응형