Asumsi saat ini kita memiliki TIGA buah data yang akan kita kirim dari Arduino. Anggaplah ini adalah nilai dari tegangan analog pada sebuah accelerometer. Nah, asumsi saat ini kita tidak memakai accelerometer secara langsung, melainkan menggantinya dengan sebuah bilangan acak (random). Untuk membedakan ketiga nilai ini, nilai-x akan memiliki rentang antara 0 - 10, nilai-y memiliki rentang antara 50-60, dan nilai-z memiliki rentang antara 90-100.
Bukalah IDE Arduino, dan ketik serta upload skrip berikut:
void setup() { Serial.begin(9600); } void loop() { Serial.print(random(0,10)); Serial.print(","); Serial.print(random(50,60)); Serial.print(","); Serial.print(random(90,100)); Serial.print(","); Serial.println(); delay(1000); }
Amatilah bahwa setiap nilai x,y, dan z akan kita pisahkan dengan separator koma (,) dan terakhir kita akhiri dengan new line (println).
Pada MATLAB, ketiklah sintaks berikut. Ingat, sesuaikanlah dengan nomer port COM pada komputer kita.
clear clc %Inisialisasi serial dan grafik serialPort = 'COM33'; % isi dgn COM yg sesuai judulGrafik = 'Logger Data Serial'; % Judul grafik xLabel = 'Waktu (detik)'; % x-axis label yLabel = 'Data'; % y-axis label plotGrid = 'on'; % aktifkan grid min = [0,50,90]; % minimum axis-y max = [10,60,100]; % maksimum axis-y lebarScroll = 20; % display data pada grafik delay = .05; % waktu cuplik %Inisialisasi variabel waktu = 0; data = 0; cacah = 0; %Persiapkan grafik sub(1) = subplot(3,1,1); % subplot atas sub(2) = subplot(3,1,2); % subplot tengah sub(3) = subplot(3,1,3); % subplot bawah plotGraph(1) = plot(sub(1),waktu,data,'-o',... 'LineWidth',2,... 'MarkerSize',6,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','r'); plotGraph(2) = plot(sub(2),waktu,data,'-o',... 'LineWidth',2,... 'MarkerSize',6,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','b'); plotGraph(3) = plot(sub(3),waktu,data,'-o',... 'LineWidth',2,... 'MarkerSize',6,... 'MarkerEdgeColor','k',... 'MarkerFaceColor','g'); title(sub(1),'Nilai-x','FontSize',15); title(sub(2),'Nilai-y','FontSize',15); title(sub(3),'Nilai-z','FontSize',15); xlabel(sub(1), xLabel,'FontSize',10); xlabel(sub(2), xLabel,'FontSize',10); xlabel(sub(3), xLabel,'FontSize',10); ylabel(sub(1), yLabel,'FontSize',10); ylabel(sub(2), yLabel,'FontSize',10); ylabel(sub(3), yLabel,'FontSize',10); axis(sub(1),[0 10 min(1) max(1)]); axis(sub(2),[0 10 min(2) max(2)]); axis(sub(3),[0 10 min(3) max(3)]); grid(sub(1),plotGrid); grid(sub(2),plotGrid); grid(sub(3),plotGrid); %Buka komunikasi melalui port COM s = serial(serialPort); disp('Tutup jendela grafik untuk mengakhiri logger'); fopen(s); tic %aktifkan deteksi waktu while ishandle(plotGraph) %Terus looping semasih plot aktif nilaiInput = fscanf(s); nilaiInput = strsplit(nilaiInput,','); dataSensor(1) = str2double(cell2mat(nilaiInput(1))); dataSensor(2) = str2double(cell2mat(nilaiInput(2))); dataSensor(3) = str2double(cell2mat(nilaiInput(3))); %Pastikan data yg diterima benar if(~isempty(dataSensor(1)) && isfloat(dataSensor(1))) cacah = cacah + 1; waktu(cacah) = toc; %ambil waktu saat ini data1(cacah) = dataSensor(1); %ambil data saat ini utk x data2(cacah) = dataSensor(2); %ambil data saat ini utk y data3(cacah) = dataSensor(3); %ambil data saat ini utk z %========= grafik 1 ============== %Set Axis sesuai dengan nilai lebarScroll if(lebarScroll > 0) set(plotGraph(1),'XData',waktu(waktu > waktu(cacah)-lebarScroll),... 'YData',data1(waktu > waktu(cacah)-lebarScroll)); axis(sub(1),[waktu(cacah)-lebarScroll waktu(cacah) min(1) max(1)]); else set(plotGraph(1),'XData',waktu,'YData',data1); axis(sub(1),[0 waktu(cacah) min(1) max(1)]); end %========= grafik 2 ============== %Set Axis sesuai dengan nilai lebarScroll if(lebarScroll > 0) set(plotGraph(2),'XData',waktu(waktu > waktu(cacah)-lebarScroll),... 'YData',data2(waktu > waktu(cacah)-lebarScroll)); axis(sub(2),[waktu(cacah)-lebarScroll waktu(cacah) min(2) max(2)]); else set(plotGraph(2),'XData',waktu,'YData',data1); axis(sub(2),[0 waktu(cacah) min(2) max(2)]); end %========= grafik 3 ============== %Set Axis sesuai dengan nilai lebarScroll if(lebarScroll > 0) set(plotGraph(3),'XData',waktu(waktu > waktu(cacah)-lebarScroll),... 'YData',data3(waktu > waktu(cacah)-lebarScroll)); axis(sub(3),[waktu(cacah)-lebarScroll waktu(cacah) min(3) max(3)]); else set(plotGraph(3),'XData',waktu,'YData',data3); axis(sub(3),[0 waktu(cacah) min(3) max(3)]); end %Beri waktu sesaat utk Update Plot pause(delay); end end % Tutup serial port dan delete variabel yg sudah terpakai fclose(s); clear all; disp('Logger berakhir...');
Pada skrip MATLAB tersebut, amatilah beberapa sintaks penting berikut ini:
nilaiInput = fscanf(s); nilaiInput = strsplit(nilaiInput,','); dataSensor(1) = str2double(cell2mat(nilaiInput(1))); dataSensor(2) = str2double(cell2mat(nilaiInput(2))); dataSensor(3) = str2double(cell2mat(nilaiInput(3)));
Data dari Arduino akan dibaca secara serial menggunakan fungsi fscanf. Hasilnya adalah data yang terdiri dari nilai x,y,z, separator dan new line. Oleh karena itu, kita akan memisahkan tiap data dengan menggunakan fungsi strplit. Selanjutnya, hasilnya adalah berupa data MATLAB dalam bentuk string yang masih terbungkus dalam sebuah cell. Oleh karena itu, pertama kita ubah menjadi data matriks dengan sintaks cell2mat, dan selanjutnya dijadikan tipe data doublemenggunakan str2double agar nilai ini dapat diplot pada grafik.
Sintaks yang lainnya dalam skrip MATLAB tersebut Penulis rasa sudah cukup familiar. Jika dijalankan, maka diperoleh hasil seperti berikut ini:
[[{"fid":"241","view_mode":"default","fields":{"format":"default","field_file_image_alt_text[und][0][value]":"grafik accelerometer matlab multi sensor","field_file_image_title_text[und][0][value]":"grafik accelerometer matlab multi sensor"},"type":"media","link_text":null,"attributes":{"alt":"grafik accelerometer matlab multi sensor","title":"grafik accelerometer matlab multi sensor","height":"358","width":"400","class":"media-element file-default"}}]]
Selamat mencoba, Semoga bermanfaat :)
Komentar Terbaru