Anda di sini

Pemrograman

[ULASAN- LENGKAP] Ploting Simultan Data dari Arduino Menggunakan MATLAB secara Real-Time

Kusuma Wardana - 21 November 2015 19:39:15 0

Visualisasi data memainkan peranan yang sangat penting dalam analisis keteknikan. Bagaimana sistem berjalan, bagaimana hasil yang dicapai, serta apa tindakan selanjutnya dalam memperbaiki sistem sangat dipengaruhi oleh visualisasi terhadap data. Visualisasi data juga berperan dalam proses simulasi, yaitu tahapan untuk memodelkan suatu sistem sebelum sistem tersebut secara nyata diimplementasikan.

Pada ulasan sebelumnya, kita telah membahas bagaimana menampilkan data secara 'real-time' menggunakan MATLAB. Tutorial ini dapat digunakan sebagai acuan untuk ulasan kali ini. Bagi yang belum membaca, bisa disimak di halaman berikut.

Pada ulasan ini, kita akan membahas bagaimana ploting dua data secara simultan dan real-time dilakukan. Data dari Arduino akan dikirim dan selanjutnya akan divisualisasikan menggunakan MATLAB. Istilah simultan dalam pengertian ini tidaklah benar-benar simultan dalam arti yang sebenarnya. Terdapat beberapa alasan. Alasan pertama adalah ADC pada Arduino bekerja secara bergiliran. Satu buah ADC pada Arduino, misalnya Arduino UNO, dapat melayani 6 channel. Jika kita menggunakan semua channel tersebut, maka keenam channel ini dilayani secara bergiliran. Keenam channel tersebut akan memasuki sebuah rangkaian multiplekser, yaitu suatu rangkaian yang berguna untuk memilih channel mana yang akan dilayani oleh ADC untuk selanjutnya dilakukan konversi. Alasan berikutnya mengapa tidak benar-benar simultan adalah data dikirim secara serial. Data akan dikirim byte-per-byte, bukan secara bersamaan seperti halnya komunikasi secara paralel.

Istilah real-time juga tidak merujuk benar-benar terjadi disaat itu. Hal ini terjadi sebab dibutuhkan waktu bagi sistem untuk mengambil data dari Arduino, melakukan konversi oleh ADC, dan baru selanjutnya dikirim secara serial menuju PC untuk diolah dan ditampilkan oleh MATLAB. Namun demikian, untuk tujuan yang bersifat praktis, misalnya membaca nilai suatu sensor (sensor suhu, kelembaban, membaca nilai dari potensiometer, dan sebagainya), maka hasil ulasan ini mungkin bisa dikatakan sebagai suatu sistem yang 'simultan' dan 'real-time'.

Mari kita kembali menggunakan Arduino sebagai signal generator. Kita akan bangkitkan dua jenis gelombang, yaitu gelombang sinus dan gelombang kosinus. Dua jenis gelombang ini akan dikirim ke MATLAB untuk ditampilkan. Mari kita simak koding pada Arduino, sebagai berikut:

double x;
  
void setup() {
   //kecepatan komunikasi serial 
   Serial.begin(9600);
   x = 0;
}
  
void loop() {
   Serial.flush();
   Serial.println(sin(x));
   //Tunggu sebentar utk komunikasi serial
   delay(50);
   Serial.flush();
   Serial.println(cos(x));
   //Tunggu sebentar utk komunikasi serial
   delay(50);
   x += .05; 
   if(x >= 2*3.14)
     x = 0;
}

Untuk koding MATLAB, bisa dilihat seperti berikut :

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 = -2;                             % minimum axis-y
max = 2;                              % maksimum axis-y
lebarScroll = 20;                     % display data pada grafik
delay = .01;                          % waktu cuplik
 
%Inisialisasi variabel
waktu = 0;
data = 0;
cacah = 0;
 
%Persiapkan grafik
plotGraph = plot(waktu,data,'o',...
                'LineWidth',1,...
                'MarkerSize',3,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','r');
             
title(judulGrafik,'FontSize',15);
xlabel(xLabel,'FontSize',12);
ylabel(yLabel,'FontSize',12);
axis([0 10 min max]);
grid(plotGrid);  %aktifkan grid
 
%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,'%f');       %Baca data serial dalam format float
    
    %Pastikan data yg diterima benar
    if(~isempty(nilaiInput) && isfloat(nilaiInput))          
        cacah = cacah + 1;    
        waktu(cacah) = toc;             %ambil waktu saat ini
        data(cacah) = nilaiInput(1);    %ambil data saat ini         
        cekWarna = mod(cacah,2);
        
        %Set Axis sesuai dengan nilai lebarScroll
        if(lebarScroll > 0)
        set(plotGraph,'XData',waktu(waktu > waktu(cacah)-lebarScroll), ...
            'YData',data(waktu > waktu(cacah)-lebarScroll));
        axis([waktu(cacah)-lebarScroll waktu(cacah) min max]);
        else
        set(plotGraph,'XData',waktu,'YData',data);
        axis([0 waktu(cacah) min max]);
        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...');

Penjelasan secara detail sudah kita bahas pada ulasan sebelumnya. Namun demikian, bagi yang belum membaca, bisa menyimak detail berikut:

serialPort = 'COM33';
Pertama-tama, pastikan kita memilih nomer port yang sesuai. Kita dapat melihat port mana yang digunakan pada Device Manager. Pada ulasan ini, port yang terdeteksi di komputer saya adalah COM33.

lebarScroll = 10;
digunakan untuk menampilkan lebar grafik yang akan ditampilkan. Nilai ini dapat disesuaikan dengan keinginan kita. Jika kita set lebarScroll = 0; maka grafik akan menampilkan keseluruhan nilai ploting.

s = serial(serialPort);
Buatlah variabel dengan nama 's' pada MATLAB. Dalam sintaks ini, serialPort yang berada dalam tanda kurung berarti COM33

fopen(s);
Agar dapat menerima dan mengirim data, maka serial port harus kita buka terlebih dahulu.

nilaiInput = fscanf(s,'%f');
Kita menyertakan '%f' untuk memberitahu MATLAB bahwa data harus disimpan dalam format float. Jika tidak, maka data akan disimpan dalam format char.

fclose(s);
Ketika jendela grafik ditutup, pastikan kita juga menutup komunikasi serial. Jika tidak, port akan tetap terbuka, dan tidak bisa dipakai untuk keperluan lain. Jika tidak, ketika kita me-run kembali program, maka akan error dan mengatakan bahwa port sedang dipakai. Dalam kasus ini, kita harus menutup MATLAB dan me-restart ulang lagi.

Hasil yang ditampilkan oleh program tersebut adalah seperti pada gambar di bawah ini. Terlihat bahwa gelombang sinus dan kosinus diplot secara 'simultan' dan 'real-time'.

Mari kita modif sedikit program kita. Misalnya saat ini kita tambahkan sebuah potensiometer pada PIN A0 (amatilah gambar di bawah ini). Namun, disaat yang sama, Arduino masih membangkitkan gelombang sinus. Karena ADC pada Arduino (saat ini kita menggunakan Arduino UNO) memiliki resolusi 10-bit, maka nilai maksimum yang bisa diperoleh adalah 2^10 -1 = 1023. Karena gelombang sinus memiliki nilai antara -1 dan 1, maka gelombang sinus ini akan dikalikan dengan 1023 untuk memperoleh hasil yang lebih proporsional.

Koding Arduino yang kta gunakan untuk keperluan ini, adalah sebagai berikut:

double x;
  
void setup() {
   //kecepatan komunikasi serial 
   Serial.begin(9600);
   x = 0;
}
  
void loop() {
   Serial.flush();
   Serial.println(1023*sin(x));
   //Tunggu sebentar utk komunikasi serial
   delay(50);
   int nilaiSensor = analogRead(A0);
   Serial.flush();
   Serial.println(nilaiSensor);
   //Tunggu sebentar utk komunikasi serial
   delay(50);
   x += .05; 
   if(x >= 2*3.14)
     x = 0;
}

Untuk bagian MATLAB, yang perlu kita ubah hanyalah nilai maksimum dan minimum sumbu-y, yaitu pada bagian:

min = -1024;
max = 1024;

Nilai koding MATLAB selengkapnya bisa dilihat seperti berikut:

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 = -1024;                          % minimum axis-y
max = 1024;                           % maksimum axis-y
lebarScroll = 20;                     % display data pada grafik
delay = .01;                          % waktu cuplik
 
%Inisialisasi variabel
waktu = 0;
data = 0;
cacah = 0;
 
%Persiapkan grafik
plotGraph = plot(waktu,data,'o',...
                'LineWidth',1,...
                'MarkerSize',3,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','r');
             
title(judulGrafik,'FontSize',15);
xlabel(xLabel,'FontSize',12);
ylabel(yLabel,'FontSize',12);
axis([0 10 min max]);
grid(plotGrid);  %aktifkan grid
 
%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,'%f');       %Baca data serial dalam format float
    
    %Pastikan data yg diterima benar
    if(~isempty(nilaiInput) && isfloat(nilaiInput))          
        cacah = cacah + 1;    
        waktu(cacah) = toc;             %ambil waktu saat ini
        data(cacah) = nilaiInput(1);    %ambil data saat ini         
        cekWarna = mod(cacah,2);
        
        %Set Axis sesuai dengan nilai lebarScroll
        if(lebarScroll > 0)
        set(plotGraph,'XData',waktu(waktu > waktu(cacah)-lebarScroll), ...
            'YData',data(waktu > waktu(cacah)-lebarScroll));
        axis([waktu(cacah)-lebarScroll waktu(cacah) min max]);
        else
        set(plotGraph,'XData',waktu,'YData',data);
        axis([0 waktu(cacah) min max]);
        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...');

Hasil yang diperoleh ketika potensiometer diputar-putar, namun disaat yang bersamaan Arduino masih membangkitkan gelombang sinus adalah sebagai berikut:

Untuk percobaan selanjutnya, kita dapat menempatkan beberapa sensor di masing-masing pin ANALOG INPUT pada Arduino. Demikian, semoga ulasan ini bermanfaat. Terima kasih.

5.694
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.