Anda di sini

Pemrograman

Plot Nilai Sensor Accelerometer dari Arduino pada MATLAB

Kusuma Wardana - 22 November 2015 11:37:18 0

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:

Selamat mencoba, Semoga bermanfaat Smile

2.873
Image

Kusuma Wardana

I Nyoman Kusuma Wardana, yang akrab dipanggil Kusuma, lahir dan besar di Bali. Ia tinggal di Desa Wisata Ubud, dan lebih banyak melaksanakan aktivitasnya di Denpasar. Profesinya adalah sebagai staf pengajar di Jurusan Teknik Elektro, Politeknik Negeri Bali. Saat ini Ia menjadi salah satu penulis di tutorkeren.com.

Artikel Menarik Lainnya
Mari Gabung

Halo Emo 51 , Ada yang ingin disampaikan? Jangan sungkan untuk gabung diskusi ini. Silahkan Login dulu atau Daftar baru.