본문으로 바로가기

MATLAB으로 시계를 만들어 보자.

category Software/MATLAB 2010.11.01 04:22
얼마전에.. 아니 예전에 어떤 방문자께서 MATLAB으로 시계를 만드는 방법을 물어보셨었습니다. 당시엔 너무 바빠 대답을 드리지 못했는데요. 문득 잠시 짬이 생기니 그때 질문에 답하고 싶어졌네요^^ 이제 MATLAB으로 시계를 한번 만들어 보겠습니다.


이렇게 생긴 아주 간단한 시계를 만들어 볼려고 하는거죠^^

제일 먼저 생각해야할 것은 바로, 뭐 당연한 이야기지만, 현재의 시간을 알아야하는데요.^^ 게중에 간단히 쓸수있는 것이 'now'라는 명령입니다. 근데 요게 좀 문제가 있어요


치사하게 이렇게 결과가 나오거든요...ㅠㅠ. 이걸 다시 현재 시간처럼 표현하는 명령중에서 좀 간단한 것이


'datestr'이라는 놈입니다. 음.. 단점은... 요게.. 명령어 이름에서도 나타나듯이 문자열로 나타난다는....ㅠㅠ


그러나 뭐 문자열이라고 해서 문제될게 있겠습니까.. 위 코드처럼 짤라서 문자를 숫자로(str2double)로 만들어주면 되죠.. ㅋㅋ... 그런데 이 str2double명령을 사용하기전에 str2num을 사용했거든요. 그런데 MATLAB Editor가 str2num보다 str2double이 더 빠르다더군요. 음.. 이유는 모르겠지만, 빠르다니까 그냥 써야죠^^

이것 말고는 나머지는 예전에 설명했던 것을 이용했습니다. 일단 전체 코드를 좀 보고 약간의 부연설명을 하겠습니다.

% Initialize Figure
t = 0:0.1:2*pi;
h=figure;
plot(10*cos(t), 10*sin(t), 'g'); grid on; axis square
hold(gca, 'on');
t_m = 0:2*pi/60:2*pi;
plot(10*cos(t_m), 10*sin(t_m), 'go', 'MarkerFaceColor','g', 'MarkerSize',5)
t_h = 0:2*pi/12:2*pi;
plot(10*cos(t_h), 10*sin(t_h), 'ro', 'MarkerFaceColor','r', 'MarkerSize',8)
plot(0, 0, 'go', 'MarkerFaceColor','g', 'MarkerSize',10)
set(gca, 'Xlim', [-11 11], 'Ylim', [-11 11], 'box', 'off', 'XColor', [0.801 0.801 0.801], 'YColor', [0.801 0.801 0.801], 'Color', [0.801 0.801 0.801])

% Initialize Each hand
time = datestr(now);
hour = str2double(time(13:14));
min = str2double(time(16:17));
second_r = str2double(time(19:20));

hour_t = pi/2-2*pi/12*hour-2*pi/12*min/60;
hour_hand = line([0.5*cos(hour_t), 4.5*cos(hour_t)], [0.5*sin(hour_t), 4.5*sin(hour_t)], 'color', 'k','LineWidth',12);
min_t = pi/2-2*pi/60*min;
min_hand = line([0.5*cos(min_t), 8*cos(min_t)], [0.5*sin(min_t), 8*sin(min_t)], 'color', 'k','LineWidth',6);
second_t = pi/2-2*pi/60*second_r;
second_hand = line([0.5*cos(second_t), 9*cos(second_t)], [0.5*sin(second_t), 9*sin(second_t)], 'color', 'b','LineWidth',3);

% Main code
while(1)
    time = datestr(now);
    hour = str2double(time(13:14));
    min = str2double(time(16:17));
    second = str2double(time(19:20));
    
    if second ~= second_r
        % Update time
        updateHour = pi/2-2*pi/12*hour-2*pi/12*min/60;
        updateMin = pi/2-2*pi/60*min;
        updateSec = pi/2-2*pi/60*second;
        
        % Calculate position of each hand
        updateHour_x = [0.5*cos(updateHour), 4.5*cos(updateHour)];
        updateHour_y = [0.5*sin(updateHour), 4.5*sin(updateHour)];
        updateMin_x = [0.5*cos(updateMin), 8*cos(updateMin)];
        updateMin_y = [0.5*sin(updateMin), 8*sin(updateMin)];
        updateSec_x = [0.5*cos(updateSec), 9*cos(updateSec)];
        updateSec_y = [0.5*sin(updateSec), 9*sin(updateSec)];
        
        % Update position of each hand
        set(hour_hand, 'Xdata', updateHour_x, 'Ydata', updateHour_y);
        set(min_hand, 'Xdata', updateMin_x, 'Ydata', updateMin_y);
        set(second_hand, 'Xdata', updateSec_x, 'Ydata', updateSec_y);
        
        drawnow;
        second_r = updateSec;
    end
end

이게 그 코드인데요...
좀 긴가요???^^

일단 2행부터 11행까지는 그냥 기본 시계판을 만드는것입니다. 그런데 그중 11행에서 사각형 표시를 없애버리고('Box', 'off'), 기본판과 X, Y출의 색을 동일하게 처리해서 눈금이 없어지도록 했구요. (음... 그 눈금자를 없애는 속성을 모르겠더군요...ㅠㅠ). 그리고, 정사각형으로(axis square) 그리도록 했습니다.

그리고 14행부터 17행까지는 위에서 설명한 현재의 시간을 받아오는 것이구요.

그것에 맞춰서 19번행부터 24번행까지 현재의 시간을 일단 그린것입니다. 여기서, 분침은 60등분이나 되니 신경쓰지 않았지만, 시침의 경우는 현재의 분 만큼 또 진행되어야해서 그걸 19번행에서 고려했습니다. 그리고, 시, 분, 초침을 그릴때, MATLAB은 x축의 양의 방향에서 시작해서 시계반대방향으로 '+'라고 생각하기 때문에 y축의 양의방향 그러니까, 90도 지점에서 시계방향으로 시작하게끔하기 위해 19번행, 21번행, 23번행과 같이 표현한 것입니다.

그리고, 이후 26번행부터는 MATLAB의 애니메이션을 설명했던 글 [관련글]에서 다룬 것을 사용했습니다. 당시엔 'for'문을 사용했고, 지금은 'while'문을 무조건 돌리도록(^^) 한것 뿐인데요. 덕분에 시계프로그램을 강제종료하면 살짝 에러 메세지가 하나 뜹니다. 뭐 종료버튼하나 만들면 되는 일인데.. 좀.. 귀찮네요...ㅠㅠ 죄송...^^



댓글을 달아 주세요

  1. BlogIcon 핑구야 날자 2010.11.01 13:13 신고

    시계를 만드는 LAB이라 괜히 아는척 하고 싶지만 정작 잘 모른다는.,.ㅋㅋ

  2. antpower 2010.11.01 18:22 신고

    질문이 있는데요(시계랑 별상관없지만, 이글이 최신글이라....)
    먼저 x1=V, x2=Vdot(미분을 의미)입니다. 그럼 x1dot=x2가 되죠.
    그리고 x2dot=(-bx2+c)/m (b,c,m은상수)입니다.
    그리고 F=mVdot+bV로 나타내집니다.
    여기서 중요한데요, 매트랩의ODE23을 이용해 x와xdot을 구하는 법은 아는데, F가 400이 넘으면 F를 400으로 고정시켜서 x와xdot을 구해야 합니다.
    (F=mx2+bx1으로 쓸수 있으니깐요) 어떡해야할까요? 함수끼리 연계되어 있어 어떻게 명력어를 만들어야 할지 모르겠씁니다. 도움좀 주세요 ㅜ.ㅜ

    • BlogIcon PinkWink 2010.11.02 12:45 신고

      요즘.. 제가 이와같은 MATLAB 사용상의 질문에 대답을 드리지 못하고 있습니다. 바로 학위발표때문인데요. 저는 미방을 항상 simulink로 풀어서 oke계열 명령을 사용해본 경험이 아주 예전에 한번 있습니다. 테스트해보고 답변을 드려야하지만, 지금은 저에게 주어진 시간이 얼마없어 죄송합니다.

  3. 어려워ㅠㅠ 2010.11.18 01:06 신고

    matlab으로 수치해석 simplex method하는 방법을 알려주실 수 있으신가요?ㅠㅠ

    • BlogIcon PinkWink 2010.11.18 15:37 신고

      simplex를 댓글로 설명하긴 좀 길지 않을까합니다.
      현재 제가 너무 바빠서 또한 포스팅을 할 수도 없구요.
      그러나 어차피 정형화된 부분이라
      수치해석관련 책을 찾으시면 소스코드와 함께 설명이 되어있을겁니다.

  4. 심메카닉스! 2010.11.29 23:50 신고

    안녕하세요! 예전 심메카닉스 모델 인상깊게 보았던 학생입니다. 질문이 있는데, 심메카닉스로 떨어져있는 두 바딕간에 인터액션을 표현할 수 있나요? 독립적으로 움직이다가 닿게되면 서로 힘을 가하는 모델을 만들어보려고 하는데요.

    • BlogIcon PinkWink 2010.11.30 03:17 신고

      가능한걸로 일단 알고 있습니다.
      MATLAB Central 어디선가 그와 같은 동영상을 본듯합니다.
      그러나...ㅠㅠ
      제가 SimMechanics를 더이상 공부하지 않아서 뭐라 드릴말씀이 없답니다.ㅠㅠ

  5. 심메카닉스! 2010.11.30 16:32 신고

    가능하다는 것을 안 것만으로도 충분합니다! 감사합니다!

  6. 임건우 2010.12.01 12:25 신고

    감사....좋은 정보 감사드립니다.

  7. 강유진 2010.12.02 14:19 신고

    와 대단하세요!매트랩 초보자인 저로선 신같으신ㅋㅋㅋㅋㅋ
    아 근데 제가 만들고 싶은게 있는데요ㅜㅜ 3차원 그래프에서 공을 굴리는 건데, 그래프 꼭대기에서 공을 굴리기 시작해서 그래프의 최소값에서 공이 멈추는 그런? 시뮬레이션을 만들고 싶은데 혹시 code 도와주실 수 없나요/ㅜㅜ

    • BlogIcon PinkWink 2010.12.02 14:48 신고

      먼저 칭찬에 감사드립니다... 그러나 사실 제가 블로그에 포스팅을 해서 그렇지 저 정도는 고수라고 말할 정도도 못된답니다..ㅠㅠ
      일단, 공을 굴린다고 하신 문제는 복잡할 수도 있습니다. 역학적으로 고려가 되어서 계산을 하고 (현재의 위치(높이)와 초기 속도 등등), 그리고, 지형정보를 알아야(그게 minimum point에 안착하는 것이니까요.)합니다. 단순한 문제로 보긴 어렵습니다. 또한 요즘 제가 포스팅하는 글마다 엄살을 부리고 있지만, 현재 제가 학위심사중이라 어마어마하게 바쁘답니다. 그래서 포스팅을 하고싶다는 호기심은 들지만, 현재로서는 도움을 드리기가 어렵습니다.

  8. BlogIcon starrynight 2011.01.13 15:38 신고

    재밌는 걸 만드셨군요..!
    아날로그 시계를 만든다는 건 생각도 못했는데 대단하십시다.

    눈금 없애는 건 다음 코드를 set(gca,....) 에 넣어주시면 된답니다. 한번 사용해보세요.
    'xtick',zeros(1,0),'ytick',zeros(1,0)

    • BlogIcon PinkWink 2011.01.13 16:44 신고

      아날로그 시계는 제가 만들생각을 한것이 아니라 블로그 방문객께서 만드는 방법을 알려달라해서 때마침 재미있어 보이길래 만들어본것입니다.^^ 아.. 그리고 눈금없애는 방법 알려주셔서 감사합니다.^^

  9. 후호호. 2011.02.12 12:43 신고

    메트랩이 이런거군요... 제가 c나 vb나 matlap중에 먼저 뭘 부터 공부하면 좋을까요? 기계공학학부 수업으로 ^^;; 정해야하는데,,

    • BlogIcon PinkWink 2011.02.12 14:06 신고

      가능하다면 MATLAB과 함께 C를 같이 공부하시는것이 좋을것같습니다만, 자기 전공에서 필요한것을 찾으셔야겠지요. 전 기계전공이 아니라 기계쪽에서 필요한 PC 유틸이 어떤건지 잘 몰라서요...^^

  10. 후호호. 2011.02.13 17:19 신고

    아하,, ^^ 감사합니다.

  11. 신소재 2012.05.24 18:30 신고

    그대로 소스코드를 입력했는데 matlab 커맨드 창에서 어떻게 구현이 하나요? ㅠㅠ
    어렵게 소스코드 다 옮겨적어 실행하려니까 안되서요 ㅠ

    • BlogIcon PinkWink 2012.05.25 08:49 신고

      edit에서 작성된 소스를 긁어서 F9를 누르면 command로 전송됩니다. 플레이 버튼을 눌르면 저장 후 실행됩니다.

  12. duke 2013.02.12 19:28 신고

    좋은 정보 감사합니다.

  13. 2013.07.10 17:11

    비밀댓글입니다

  14. matlabㅜㅜ 2013.07.10 17:25 신고

    좋은 정보 감사드립니다.ㅎㅎㅎ
    많이 바쁘신것 같네요 ㅠㅠ 제가 matlab초짜인데 본 소스를 이해하기에 어려움이 있어서요 ㅎㅎ
    혹시 시간의 여유가 있으시다면 소스분석 가능하실런지 ㅎㅎ 주석 달아주시면 정말 좋을것 같은데 ㅎㅎ
    시간이 여유가 있으시면 부탁드립니다 ㅠㅠ

    • BlogIcon PinkWink 2013.07.11 11:06 신고

      네.. 위에 언급했지만,
      현재 제가 다른분의 소스를 보고 분석할 만한 시간적 여유가 많지가 않습니다. 죄송합니다.

  15. 22 2013.11.06 23:00 신고

    break를 사용해 종료 버튼을 만들려고 하는데 잘 안되네요
    어떻게 해야 하나요?

    • BlogIcon PinkWink 2013.11.07 13:34 신고

      제가 했을때는 while문으로 무한반복을 시켰는데 그때 종료하면 에러가 뜨더군요. 종료버튼이 눌러졌는지 아닌지를 알수있는 변수를 하나 두시고, 반복문의 조건에 그 버튼이 눌러졌는지를 확인하도록 하시면 됩니다.

  16. maty 2013.11.13 12:31 신고

    종료버틍 만드는 m파일 소스좀 알려주세요... 부탁드립니다

    • BlogIcon PinkWink 2013.11.13 13:20 신고

      네... 글쎄요. 뭐 저는 안해봐서.. 소스가 없습니다.
      그러나 간단히 구글에서 검색해보니
      https://www.google.co.kr/#newwindow=1&q=matlab%20gui%20exit%20button&safe=off
      첫글에
      http://www.mathworks.com/matlabcentral/newsreader/view_thread/252128
      MATLAB의 공식홈페이지에서 간편하게 close callback 함수를 호출하라고 하네요
      위글 중반부쯤에

      function close_Callback(hObject, eventdata, handles)
      close all;

      이렇게 간편히 할 수 있다고 되어 있습니다.

      또한 처음 검색결과 중 한 글은

      http://nf.nci.org.au/facilities/software/Matlab/techdoc/creating_guis/ch_ove13.html

      위 주소에서 보시면 종료버튼에 대한 간편한 예제가 있네요

      저도 테스트 해보지 않았답니다.

  17. Workyong 2013.11.13 19:05 신고

    잘 읽었습니다. 매트랩 초보자인 저에겐 완전 부럽습니다... 저는 매트랩 GUI를 써서 가계부를 만들고 있는데요
    아무래도 초보인지라 구현하는데 많음 어려움이 있습니다. 혹시 저장하는 소스나 내용을 추가하는 소스를 알 수 있을까여?

    • BlogIcon PinkWink 2013.11.15 16:41 신고

      저장하는소스.. 잘 모르겠습니다. 무엇을 저장하신다는 건지...
      자세한건 MATLAB의 Doc이나 matlabcentral에서 검색해보시면 좋을듯합니다.

  18. maty 2013.11.13 21:23 신고

    위 알려준 방법대로 종료버튼을 만들었는데....시계figure을 종료하면 바로 종료버튼이 떠야되는데
    연동하는 방법을 잘 모르겠습니다. 알려주세요.. gui 파일 불러오기

    • BlogIcon PinkWink 2013.11.15 16:43 신고

      글쎄요. 답변에 달았지만, 제가 만들거나 테스트하지 않았습니다. 전 그저 matlabcentral에서 검색했더니 저런 결과가 나오는데 한번 찾아보시면 어떠냐는 겁니다. 직접 저도 해보지 않았거든요.