본문으로 바로가기

갈릴레오(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


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



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




댓글을 달아 주세요

  1. BlogIcon 진율 2015.04.09 10:53 신고

    윽~! 너무 어렵네요..
    즐거운 하루 되세요~!

  2. BlogIcon 메리. 2015.04.09 12:13 신고

    어려운 말이당.. 저도 이 정보가 필요할때가 오겟죠? ㅠ

  3. BlogIcon 핑구야 날자 2015.04.09 12:19 신고

    찌글찌글해도 제가 볼때는 대단한걸요~~

  4. BlogIcon 티나짱 2015.04.09 12:36 신고

    오랫만에해를보니반갑네요 오늘도행복하세요

  5. BlogIcon 로키. 2015.04.09 14:38 신고

    좋은 글 잘봤습니다.

  6. BlogIcon 광주랑 2015.04.09 14:53 신고

    수학적, 공학적 계산실력이 뛰어나시네요 ^^

  7. BlogIcon 세상속에서 2015.04.09 15:18 신고

    오늘 날씨가 따뜻해서 좋네요.
    행복한 하루 보내세요.

  8. BlogIcon 양군! 2015.04.09 16:36 신고

    갈릴레오 보드에 대해서 정리를 잘해주셔서 잘 보고 가네요 ^^

  9. BlogIcon 트라이어 2015.04.09 16:39 신고

    저에게는 어려운 정보네요. ^^

  10. BlogIcon Freeable 2015.04.23 01:14 신고

    안녕하세요. 저는 그래프가 '*' 모양으로 찍혀서 보기가 안좋은데, 어떻게 곡선으로 만드셨는지 알 수 있을까요~?

    • BlogIcon PinkWink 2015.04.23 16:37 신고

      글쎄요.. MATLAB의 plot은 아무것 없이 그냥 기본으로 x, y축 데이터를 주면 그냥 위에서 보듯이 그려주는데요... 오히려 *표를 옵션으로 주어야하는데요..

  11. Neates 2016.02.22 14:42

    감사합니다. 소스코드적으로도 정말 많은 공부가 되었습니다. ~~^^

  12. Neats 2016.02.22 14:49

    36 37 번 줄에서 시간에

    micos() 에 0.001*0.001 을 또 하신 이유가 있나요..?

    • BlogIcon PinkWink 2016.02.22 14:55 신고

      아.. 그건.. 제가 그냥 알아보기 편하게... 세자리씩하면
      mili
      그다음 세자리면
      micro
      이렇게 한 눈에 보여서 그냥 그렇게 한겁니다.~~~^^

  13. 스즈브 2018.05.23 11:41

    void saveStatesForNextStep 는 어떻게 활성화가 되나요??다른라이브러리를 불러와야되는건가요?

    • BlogIcon PinkWink 2018.05.23 17:46 신고

      활성화? 실행이 언제 되냐는 질문이신가요?
      loop()문에서 필요할때 실행시키고 있습니다.

    • 스즈브 2018.05.24 08:42

      아 저는 함수가 실행이안되서요

      혹시 갈릴레오 보드만쓸수있는건가요??

      저는 우노를쓰고있는데 안되서요..ㅠㅠ

    • BlogIcon PinkWink 2018.05.24 11:33 신고

      흠.. 갈릴레오에서 당시에 테스트해서 잘 모르겠네요.. 문제가 있어 보이지 않는데..
      타이머같은 아이가 필요하시다면
      http://pinkwink.kr/1126
      를 보시죠... 우노에서 테스트했습니다.