올해도 이제 한달 남았다... 또 한살을 먹는 건가? 늙는 것이 두렵다~~ㅠ,,ㅠ
호기심과 신비함에서 시작한 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