September 30, 2011

[JANS HENDRY / EE&IT UGM, INDONESIA]

SCROLL-WHEEL IN MATLAB CASE : IN REAL TIME OSCILOSCOPE

Pada artikel sebelumnya tentang membuat REAL-TIME OSCILOSCOPE telah dijelaskan langkahlangkah tentang membuat program tersebut. Demikian juga source code nya telah dihadirkan juga untuk membantu anda dalam membandingkan hasil karya anda dengan yang telah dibuat. Timbul ide dalam benak saya jika suatu saat ingin melihat data yang terekam secara lebih detil. Misalkan jika data yang telah terekam memiliki kerapatan sangat besar sehingga susah untuk diamati. Untuk itu perlu tambahan untuk program yang telah kita buat sebelumnya dan beberapa modifikasi untuk mengaktifkan scroll-wheel dari mouse anda. Scroll-wheel akan bekerja pada axes pada program. Perlu saya tampilkan juga program osiloskop yang lama, karena ada beberapa bagian yang telah dimodifikasi agar program baru ini dapat bekerja. menyediakan sebuah figure properties yang bernama WindowScrollWheelFcn. Properti ini dipanggil menggunakan callback dari figure yang kita buat. Demo untuk program scroll-wheel sendiri sudah disediakan di dalam matlab. Namun yang saya hadirkan ini berbeda, karena kita berhadapan dengan data yang sudah fix jumlah dan nilainya. Sedangkan untuk demo pada matlab, nilai y dan x bersifat dinamis. Properti ini memiliki 2 struktur event: Matlab sendiri telah

Dalam hal ini kita menggunakan VerticalScrollCount sebagai event action. Berikut ini adalah bagian-bagian programnya. Saya sertakan sekalian nama filenya. Nama Program: realtimeosciloscope.m
% % % % % function realtimeosciloscope(varargin) Ini merupakan program untuk menghasilkan real time osciloscope yang mengambil data dari analog input komputer lalu menyimpan dan merekam datanya.

delete(daqfind); clear all; close all; clc; warning off;

Page | 1

September 30, 2011

[JANS HENDRY / EE&IT UGM, INDONESIA]

global akkr %% membuat figure GUI % meletakkan posisi GUI screenUnits=get(0,'Units'); set(0,'Units','pixels'); screenSize=get(0,'ScreenSize'); set(0,'Units',screenUnits); figWidth=951.0; figHeight=500.0; figPos=[(screenSize(3)-figWidth)/2 (screenSize(4)-figHeight)/2 figWidth figHeight];

...

% Create the figure window. hFig=figure(... 'Color' ,'white' ,... 'IntegerHandle' ,'off' ,... 'DoubleBuffer' ,'on' ,... 'MenuBar' ,'none' ,... 'HandleVisibility' ,'on' ,... 'Name' ,'REAL TIME OSCILOSCOPE FOR LOW VOLTAGE MEASUREMENT' ,... 'Tag' ,'Analog Input FFT demo' ,... 'NumberTitle' ,'off' ,... 'Units' ,'pixels' ,... 'Position' ,figPos ,... 'UserData' ,[] ,... 'Colormap' ,[] ,... 'Pointer' ,'arrow' ,... 'Visible' ,'off' ... ); % Create a start/stop pushbutton. htoggle = uicontrol(... 'Parent' , hFig,... 'Style' , 'togglebutton',... 'Units' , 'normalized',... 'Position' , [0.7700 0.0960 0.1062 0.1020],... 'Value' , 0,... 'String' , 'Start',... 'Backgroundcolor' , 'white' ... ); % Create Data subplot. hAxes = axes(... 'Position' 'Parent' 'XLim' 'YLim'

, [0.0715 0.096 0.6845 0.8019],... , hFig, ... , [0 10],... , [-1 1],...

Page | 2

September 30, 2011

[JANS HENDRY / EE&IT UGM, INDONESIA]

'Box' 'Xcolor' 'Ycolor' );

, 'On',... ,'blue', ... , 'blue' ...

% creating cetak data button hcetak = uicontrol(... 'Parent' , hFig,... 'Style' , 'pushbutton',... 'Units' , 'normalized',... 'Position' , [0.8848 0.0960 0.1062 0.1020],... 'String' , 'Simpan Data',... 'Backgroundcolor' , 'white' ... ); % creating teks frequency sampling twakt = uicontrol(... 'Parent' , hFig,... 'Style' , 'edit',... 'Units' , 'normalized',... 'Position' , [0.8401 0.6600 0.1062 0.1020],... 'String' , '0.5',... 'FontWeight' ,'bold', ... 'Backgroundcolor' , 'white' ... ); % creating teks frequency sampling tfrek = uicontrol(... 'Parent' , hFig,... 'Style' , 'edit',... 'Units' , 'normalized',... 'Position' , [0.8401 0.796 0.1062 0.1020],... 'String' , '44100',... 'FontWeight' ,'bold', ... 'Backgroundcolor' , 'white' ... ); % creating static text1 htext1 = uicontrol(... 'Parent' , hFig, ... 'Style' , 'text', ... 'String' , 'Sampling Frequency',... 'Units' , 'normalized',... 'Position' , [0.7584,0.8120,0.0704,0.07], ... 'Backgroundcolor' , 'white' ... );

Page | 3

September 30, 2011

[JANS HENDRY / EE&IT UGM, INDONESIA]

% creating static text2 htext2 = uicontrol(... 'Parent' , hFig, ... 'Style' , 'text', ... 'String' , 'Duration',... 'Units' , 'normalized',... 'Position' , [0.7584,0.6900,0.0741,0.0360], ... 'Backgroundcolor' , 'white' ... ); % creating static text3 htext3 = uicontrol(... 'Parent' , hFig, ... 'Style' , 'text', ... 'String' , 'Hz',... 'Units' , 'normalized',... 'Position' , [0.9505,0.8360,0.02628,0.032], ... 'Backgroundcolor' , 'white' ... ); % creating static text4 htext4 = uicontrol(... 'Parent' , hFig, ... 'Style' , 'text', ... 'String' , 'Sec',... 'Units' , 'normalized',... 'Position' , [0.9505,0.6980,0.0262,0.032], ... 'Backgroundcolor' , 'white' ... ); % creating static text5 htext5 = uicontrol(... 'Parent' , hFig, ... 'Style' , 'text', ... 'String' , 'REAL TIME OSCILOSCOPE FOR LOW VOLTAGE MEASUREMENT',... 'Units' , 'normalized',... 'Position' , [0.2092,0.93,0.5793,0.0440], ... 'Backgroundcolor' , 'white', ... 'FontWeight' ,'bold', ... 'FontName' , 'MS Sans Serif', ... 'FontSize' , 12.... ); chk1 = uicontrol(... 'Parent' 'Style' 'String'

,hFig, ... , 'checkbox', ... , 'Grid OFF', ...

Page | 4

September 30, 2011

[JANS HENDRY / EE&IT UGM, INDONESIA]

'Units' 'Position' 'Backgroundcolor' 'Value' 'Callback' );

, 'normalized', ... , [0.0715 0.01 0.0788 0.046], ... , 'white',... ,0, ... ,'cekchk' ...

set(hFig,'WindowScrollWheelFcn',@figScroll); set(hFig,'visible','on'); set(htoggle,'callback','localInitAI'); set(hcetak,'callback','cetak'); %% Menetapkan nilai fs dan tp fs=str2double(get(tfrek,'string')); tp=str2double(get(twakt,'String')); %% %% frame=fs*tp; t=(0:frame-1); plot(t/fs,zeros(1,frame),'r-'); xlabel('Time (sec)'); ylabel('Amplitude'); akkr=0; freeze=false; %%

Bagian yang saya beri kotak merah merupakan callback untuk memanggil fungsi scroll-wheel. Saya juga memberikan variabel global dengan harapan bahwa data tersebut akan dipakai pada m*file lainnya. Hanya untuk jaga-jaga saja. Bagian terbawah dari program di atas merupakan reset untuk scroll-wheel agar tidak aktif saat data belum ada. Nama Program: localInitAI.m
% program untuk mengambil data dari analog input %% uji tombol tugel apakah ON atau OFF global hline fs time status=get(htoggle,'Value'); if status==get(htoggle,'Max') set(htoggle,'String','Stop'); freeze=~freeze; %% mengambil data penting dari GUI fs=str2double(get(tfrek,'string'));

Page | 5

September 30, 2011

[JANS HENDRY / EE&IT UGM, INDONESIA]

tp=str2double(get(twakt,'String')); %% %% Inisialisasi adaptor ai = analoginput('winsound', 0); chan=addchannel(ai, 1); set(ai,'SampleRate',fs); set(ai,'SamplesPerTrigger',Inf); frame=fs*tp; set(ai,'SamplesAcquiredFcn','ambil_ulang_data'); set(ai,'SamplesAcquiredFcnCount',frame); t=(0:frame-1); time=t/fs; hline=plot(time,zeros(1,frame),'r'); xlabel('Time (sec)'); ylabel('Amplitude'); start(ai); else set(htoggle,'String','Start'); freeze=~freeze; end %%

Nama Program: ambil_ulang_data.m
global datax timex akkr data = getdata(ai,fs*tp); if freeze set(hline,'YData',data/max(abs(data))); datax=get(hline,'Ydata'); timex=get(hline,'XData'); akkr=0; drawnow; else stop(ai); akkr=1; %aktivate windows scroll end cekchk; %%

Bagian yang diberi kotak merah: 1) untuk menjadikan variabel-variabel tertulis menjadi global sehingga bisa digunakan oleh m*file lain yang membutuhkan data yang tersimpan dalam variabel tersebut. 2) tiap kali program mengambil data dari analog input untuk ditampilkan pada axes (figure) maka variabel datax dan timex akan mengambil data dari YData dan XData sebagai data valid untuk aktifscrol.m sebagai data yang akan dimanipulasi saat kita melakukan scroll. 3) saat tombol Pause ditekan maka fungsi dari scroll-wheel akan aktif dan anda bisa melakukan scroll pada axes dan apabila tombol Start ditekan maka scroll-wheel tidak akan aktif lagi. Page | 6

September 30, 2011

[JANS HENDRY / EE&IT UGM, INDONESIA]

Nama Program: cekchk.m

chk=get(chk1,'Value'); if chk==get(chk1,'Max'); set(hAxes,'XGrid','On'); set(hAxes,'YGrid','On'); set(chk1,'String','Grid ON'); else set(hAxes,'XGrid','Off'); set(hAxes,'YGrid','Off'); set(chk1,'String','Grid OFF'); end

Nama Program: cetak.m

% bagian program untuk menyimpan data ke dalam % file microsoft excel global data1x time1x data1=data1x; time1=time1x; [row,col]=find(data1>=0); data1=data1(1,col); time1=time1(1,col); data1=reshape(data1,length(data1),1); time1=reshape(time1,length(data1),1); [filename, pathname, filterindex] = uiputfile( ... { '*.xlsx', '2007 Excel Fomat (*.xlsx)';... '*.xls','Below 2007 Excel Fomat (*.xls)';... '*.*', 'All Files (*.*)'},... 'Save as'); if ~isequal(filename,0) || ~isequal(pathname,0) fName=strcat(pathname,'\',filename); dtta = [time1(1:end,:),data1(1:end,:)]; xlswrite(fName,dtta); end figure, plot(time1,data1); xlabel('Time (sec)'); ylabel('Amplitude'); title('Chosen data for amplitude >=0');

Bagian program yang saya beri kotak merah merupakan hal yang baru. Ini gunanya untuk mengambil data dari YData Matlab sehingga apa yang anda lihat pada layar adalah apa yang akan anda simpan.

Page | 7

September 30, 2011

[JANS HENDRY / EE&IT UGM, INDONESIA]

Bagian program yang baru dan diperuntukkan khusus untuk scroll-wheel adalah Nama Program: figScroll.m
% function scroll_wheel function figScroll(src,evnt) global akkr if evnt.VerticalScrollCount > 0 && akkr==1 aktcr=1; aktifscrol(aktcr); elseif evnt.VerticalScrollCount < 0 && akkr==1 aktcr=0; aktifscrol(aktcr); end end %figScroll

Program di atas merupakan callback yang isinya sebagai caller dan memberikan nilai trigger untuk memanggil m* file yang fungsinya untuk scroll-wheel. Program m* file tersebut adalah Nama Program: aktifscrol.m

% aktifkan scrol function aktifscrol(aktcr) global hline datax hAxes timex fs akkr global data1x time1x if aktcr==0 && akkr==1 % scroll ke atas xd = get(hline,'XData'); [row,col]=find(timex==xd(end)); if xd(end)>0 inc=fs/100; kol=1:col-inc; if (col-inc)<=inc kol=1:inc; end xx=timex(1,kol); else kol=1:col; xx=timex(1,kol); end elseif aktcr==1 && akkr==1 xd = get(hline,'XData'); [row,col]=find(timex==xd(end)); if xd(end)<timex(end) inc=fs/100; kol=1:col+inc; xx=timex(1,kol); else kol=1:col;

Page | 8

September 30, 2011

[JANS HENDRY / EE&IT UGM, INDONESIA]

xx=timex(1,kol); end end set(hline,'YData',datax(1,kol),'XData',xx); set(hAxes,'XLim',[0 xx(end)],'YLim',[-1 1]); data1x=get(hline,'YData'); time1x=get(hline,'XData'); drawnow end

Program di atas berfungsi untuk update data pada axes ketika scroll anda aktifkan. Sehingga data yang ditampilkan akan dinamis dan data yang ditampilkan tersebut akan di simpan ketika anda menekan tombol simpan data. Fungsi demikian juga baru saja saya tambahkan, sehingga lebih memudahkan anda dalam memilih data mana saja yang anda butuhkan, simpan lalu tampilkan. Merupakan kombinasi yang super bukan?? ☺ Tentu bukan! Hahaha

Hasil eksekusi dari program di atas adalah

Page | 9

September 30, 2011

[JANS HENDRY / EE&IT UGM, INDONESIA]

Ketika dilakukan scroll, akan dihasilkan

Anda bisa melihat bahwa absis telah berubah nilai dan posisi dari data telah bergeser. Berarti scrollwheel telah aktif dan bekerja. Metode ini bisa diterapkan pada data yang jumlahnya telah fix dan jika anda ingin mendapatkan hasil yang lebih dinamis, mungkin bisa dipertimbangkan menggunakan interpolasi pada data yang anda miliki untuk mengisi kekosongan interval data.

~~~ TERIMA KASIH ~~~

Page | 10

Sign up to vote on this title
UsefulNot useful

Master Your Semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master Your Semester with a Special Offer from Scribd & The New York Times

Cancel anytime.