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