2016년 12월 3일 토요일

시리얼통신을 이용한 측정장비의 제어


올해도 이제 한달 남았다... 또 한살을 먹는 건가? 늙는 것이 두렵다~~ㅠ,,ㅠ

호기심과 신비함에서 시작한 matlab 공부가 이것에만 그치지 않고,

점점 하고 싶어하는 영역으로 즉 실용적인것에 가까워져 가는것 같아 기분이 좋다.

그러나 하면 할수록 디지털 기술은 참 공부할게 많은것 같다.

수학적 재능이 많다면 이렇게 힘들지 않을 텐데,,,ㅎ



먼저 아두이노 시리얼통신과 TCP/IP 소켓통신을 먼저 맛보자!



// 아두이노에서 1초마다 1~64 랜덤숫자 120개 문자열 전송

// Arduino

long randNumber;     // 32 bits (4 bytes), from -2,147,483,648 to 2,147,483,647.

void setup(){

  Serial.begin(9600);     // Serial.begin(1200);  과 비교해 볼 것

  // if analog input pin 0 is unconnected, random analog

  // noise will cause the call to randomSeed() to generate

  // different seed numbers each time the sketch runs.

  // randomSeed() will then shuffle the random function.

  randomSeed(analogRead(0));

}

void loop() {

     for(int i = 1; i < 120; i++){

     randNumber = random(0, 64);

     Serial.print(randNumber);

     Serial.write(','); 

      }

     Serial.println(randNumber);  // = Serial.print('\n');

     delay(1000);

}



% 매트랩으로 문자수신 후 Parsing, Plot update~!!

% Matlab %

a=serial('COM3','BaudRate',9600);   % a=serial('COM3','BaudRate',1200); 과 비교해 볼 것

fopen(a);

for i=1:10

tic

s=fscanf(a,'%s');

toc

s=strrep(s, ',', ' ');

ss=sscanf(s, '%d');

stairs(ss)

axis([1 120 0 64]);

drawnow

end

fclose(a)
 

1200 bps(bit per sec) 통신 약 340 byte 전송시, delay 1초 포함 경과시간 3.27초
9600 bps(bit per sec) 통신 약 340 byte 전송시, delay 1초 포함 경과시간 1.25초

실험결과를 분석해 보면,
1. 아두이노는 시리얼통신 시 문자마다 1byte(8bit)씩 전송한다.
2. matlab이 버퍼에서 입출력 및 파싱하는 데 0.1초가 소비된다.
3. 1200 bps(1.1+340/150), 9600 bps(1.1+340/1200) 얼추 경과시간과 맞다.



% (동일 네트워크 안에서 Matlab 소프트웨어 간) TCP/IP 소켓통신


%<PC-1, Server>

t = tcpip('0.0.0.0', 30000, 'NetworkRole', 'server', 'InputBufferSize',1024); 
% 0.0.0.0 -> 최초 연결한 ip만

fopen(t);



%<PC-2, Client>

t = tcpip('localhost', 30000, 'NetworkRole', 'client'); %localhost -> 서버 ip주소

fopen(t)

for i=1:100

data = randi(2,1,16)-1;

fwrite(t, data)

pause(1)

end

fprintf(t, '%s\n','hello world')



%<PC-1, Server>

data = fread(t, t.BytesAvailable)

data=fscanf(t);

plot(data);

fclose(t)

delete(t)

clear t
 


실험결과를 분석해 보면, client 의 전송데이터 중 서버에서 읽지 않은 데이터가
 버퍼에 저장되다가 fread 순간 한번에 읽혀진다. 시간조절을 하여 실시간 plot도 가능할 것이다. 다음과제로 파일전송수신을 해봐야겠다.


다음은 Kesight 의 스펙트럼분석기 N9344C 와 시리얼통신으로 제어하는 예를

시현해 보겠다.

<Writing and Reading Data>

VISA란 PC와 측정기 사이에 통신을 하기위한 입출력 API 이다.

자세한 내용은 다음 참조해 주길 부탁한다.

 https://en.wikipedia.org/wiki/Virtual_Instrument_Software_Architecture



% Matlab PC와 Kesight N9344C 간 USB mini 5pin Serial 통신

obj1 = visa('AGILENT', 'USB0::2391::65519::CN0604A475::0::INSTR');

set(obj1,'InputBufferSize',8192)

fopen(obj1);

fprintf(obj1, '*IDN?'); data = fscanf(obj1)

ss=plot(zeros(461,1));

axis([1 461 -100 -30]);  grid on;

%------------------------------------------------------------

for i=1:100

fprintf(obj1, 'TRACe:DATA? TRACe1'); data = fscanf(obj1);

s=strrep(data, ',', ' ');

s=sscanf(s, '%f');

set(ss, 'YData',s)

drawnow

end
 

둘 다 동일하게 실시간 plot은 가능하나 더 rate를 더 높일 순 없는 것같다.

내생각에는 UDP 연결이 필요할 것 같다.


% Matlab PC와 Kesight N9344C 간 TCP/IP 통신


% 100MHz ~ 200MHz , RBW 1K -> sweep time 1 second

obj1 = visa('AGILENT', 'TCPIP0::192.168.35.60::inst0::INSTR');

set(obj1,'InputBufferSize',8192)

fopen(obj1);

fprintf(obj1, '*IDN?'); data = fscanf(obj1)

ss=plot(zeros(461,1));  

axis([1 461 -100 -30]);

grid on;

tic

for i=1:100

fprintf(obj1, 'TRACe:DATA? TRACe1'); data = fscanf(obj1);

s=strrep(data, ',', ' ');

s=sscanf(s, '%f');

s(1:10)'

set(ss, 'YData',s)

drawnow

end

toc
 


 
 
실제로 캡쳐화면은,,,

주파수(100 ~ 200MHz) 의 전력(-30 ~ -100dBm) 레벨을 변화를 실시간 update!!

fprintf & fscanf -> 약 0.1 second , buffer의 같은 값을 읽어들임(8번씩), 총 경과시간 13s


2016년 3월 26일 토요일

Matlab의 GUI를 이용한 간단한 게임 제작(테트리스, 사다리, 벽돌깨기)

Matlab의 GUI를 이용해 간단한 게임 제작을 몇가지 해 보았다.

시간과 노력이 꽤 많이 걸렸다. 주말에 집에서 계속 코딩짜고 그랬더니 폐인이 된것 같다.

눈도 피곤하고 초점도 않맞고,,, 얼른 끝내고 바람이나 쐬야겠다.^^;


그렇지만,,, 역시 프로그래밍은 허접하더라도 창작을 해보는 것이 최선이다.

허접하더라도 완성된 것을 보니 뿌듯하다.ㅎㅎㅎ


나 또한 GUI를 배우는 입장으로 어설픈 코드를 공개하기가 꺼려지지만,

이런 코드라도 찾기가 쉽지 않은게 사실이라 필요한 사람에 유용하게 쓰이길 바라며,

피드백도 환영합니다!!!^^;


1. 테트리스(tetris)

제일 시간이 많이 걸렸지만, 제일 만족스러운 작품이다.

특징이라면 정말 짧은 200줄 정도의 코딩으로 이런게 만들어 질 수 있다는게 신기할 따름이다.

스피드 조절, 바로내림, 멋진 디자인은 부족하지만, 기본적인 기능은 구현되어 있다.

http://kr.mathworks.com/matlabcentral/fileexchange/56183-simple-tetris



2. 사다리(ladder)

회사나 등등에서 사다리타기로 뽑기를 할때 유용할 것으로 보인다.

역시 디테일은 부족하지만, 독자들이 피드백으로 업그레이드 해주길 바란다.




3. 벽돌깨기(breakout)

기본적인 기능을 구현한 게임이다.

이 소스를 바탕으로 독자들이 응용하면 쉽게 더 복잡한 프로그래밍도 가능하리라 본다.




----------------------------------------------------------------------------------------------
블로그를 이전하여,,, 소스코드는 


에서 다운로드할 수 있습니다!

2016년 1월 15일 금요일

파동방정식과 그 해(풀이)

수학도 언어라고 생각한다. 수학을 통해 자연현상에 대한 통찰을 아름답게 표현하고, 정확하게 전달할 수 있기 때문이다. 이 언어는 인류의 유산으로 계속해서 누적되고, 세련되게 진화할 것이다. 나는 이 언어를 이해하는 과정이 너무 길고 힘겹다. 이 언어를 능수능란하게 다루는 솜씨 좋은 대가들이 엄청 질투나고 부럽다!ㅎㅎ
한편 아름답게 표현한다는 것에서는 예술과 일맥상통하는 부분이 있는 것 같다. 어떤 때는 놀랍고 경이롭기까지 하니까.

어쨌든 잡설이 길었으나,,, 이번 블로그의 주제는 파동방정식이다.
줄의 진동을 통해 물리적 현상을 파동방정식으로 표현해보고, 그 해를 찾아 특징을 살펴보는 과정은 전자기학에 필수적이고, 더 나아가 통신공학 응용에도 많은 도움이 될 것이다. 설사 그렇지 않더라도 파동방정식의 표현은 참 멋지고, 파동은 일상이다.

먼저,,, 파동방정식의 증명이 필요한데, 이미 깔끔하게 블로그하신 분들이 많다. 그래서 나는 그냥 인용을 하기로 한다.

http://joonyoungsun.tistory.com/261

증명을 조금 더 정리하면,,,



초기속도 g(x)=0 이면, u(x, t)=ΣBn cos(cnπt/L) sin(nπx/L)

→  u(x, t)=1/2 ΣBn sin(nπ/L(x-ct)+1/2 ΣBn sin(nπ/L(x+ct)

→  u(x, t)=1/2[f*(x-ct)+f*(x+ct)]  

여기서 f* 는 2L주기를 가진 f의 기수주기확장(Odd periodic extension) 이다.
 ∵ u(x,t)는 연속함수이고, wave equation , boundary condition(u(0,t)=0 , u(L,t)=0 for all t) , inital condition(u(x,0)=f(x) , du/dt=g(x)) 만족한다.

 


그럼,,, 이제 이렇게 구한 파동방정식과 그 해를 실제적인 예로 시뮬레이션해보자!

<문제> 초기 휨이 삼각함수인 현의 진동

 
 

초기 휨이 삼각함수인 현의 진동 의 해를 실제로 시뮬레이션해보면,
증명으로 유도한대로 파동은 양방향으로 진행하는 함수의 기수주기확장의 합과 동일하다는 것을 알 수 있다.


L=2; T=10; N=10; k=1; c=1;
x=0:.1:L;
ux0=zeros(N,length(x)); uxt=zeros(N,length(x));
h=plot(x, sum(uxt));

for t=0:.1:T;
for n=1:N;
bn(n)=8*k/n^2/pi^2*sin(n*pi/2);
ux0(n,:)=bn(n)*sin(n*pi/L*x);
uxt(n,:)=cos(n*pi*c/L*t)*ux0(n,:);
end
% uxt=(8/pi^2)*[1/1^2*cos(pi/2*t)*sin(pi/2*x)-1/3^2*cos(3*pi/2*t)*sin(3*pi/2*x)...];
set(h, 'xdata', x, 'ydata', sum(uxt))
drawnow
axis([0 2 -1 1]);
pause(.1)
end