laporan praktikum 4- andam dr - 13309013
TRANSCRIPT
LAPORAN PRAKTIKUM MODUL 4
Akuisisi Data dengan Mikroprosessor
Andam Deatama Refino
13309013
Kelompok 7 (Shift Rabu)
Asisten : Rizky Fadila
Hari,Tanggal Praktikum : Rabu, 30 Maret 2011
PROGRAM STUDI TEKNIK FISIKA
FAKULTAS TEKNOLOGI INDUSTRI
INSTITUT TEKNOLOGI BANDUNG
2011
1. Akuisisi Data dengan Data Mentah (Raw Data) 1.1. Foto Rangkaian
1.2. Data Hasil Percobaan & Kode Pemrograman
Data Percobaan
Berikut gambar grafik bit PWM yang merepresentasikan besar tegangan terhadap
waktu:
Kemudian berdasarkan plotting dari tabel data percobaan, didapat grafik sebagai
berikut:
Plot Grafik tersebut yaitu berupa tabel bit terhadap waktu terlampir dengan nama
file “Data Raw.doc”
Kode Pemrograman
Kode Arduino
/**
Program Akuisisi Data dengan menggunakan
data raw
*/
#include <MsTimer2.h>
#define MASUKAN_ANALOG A1
#define BAUD 9600
#define SAMPLING 10
#define PIN_SWITCH 3
#define REFF A0
#define INPUT_VAL A1
#define TIME_UP 3000
#define TIME_DOWN (TIME_UP+4000)
long time;
int valReff, valInput;
void setup(){
Serial.begin(BAUD);
pinMode(PIN_SWITCH,OUTPUT);
MsTimer2::set(SAMPLING,kirimData);
MsTimer2::start();
time = 0 + SAMPLING;
valReff = 0;
valInput = 0;
}
void kirimData(){
valReff = analogRead(REFF);
valInput = analogRead(INPUT_VAL);
//Data dari tegangan referensi
//dijadikan 1 paket dengan tegangan
//dari kapasitor dengan model di bawah ini
//"Tegangan Reff|Tegangan kapasitor\n"
Serial.print(valReff);
Serial.print("|");
Serial.println(valInput);
time = time + SAMPLING;
}
void loop(){
if(time==TIME_UP){
digitalWrite(PIN_SWITCH,HIGH);
}
else if(time==TIME_DOWN){
digitalWrite(PIN_SWITCH,LOW);
}
}
Kode Processing
/** * Grafik Akuisisi Data * * Program untuk menerima data dari USB dan mencatat waktu penerimaan. * Hasil ditampilkan sebagai grafik dan disimpan ke file. */ import processing.serial.*; // Create object from Serial class Serial comm; // Data received from the serial port int value; int time; //Identitas untuk file penyimpan hasil akuisisi data PrintWriter fileOutput; String namaFile = "dataRaw.txt"; PFont myFont; //Waktu Pengambilan Data 35 detik int detik = 30; long END_TIME = detik*1000; long times[] = new long[1000]; long valuesReff[] = new long[1000]; long valuesKapasitor[] = new long[1000]; long elapsedTime; int ndata = 0; //int GESER_X = 50; float scaleX; int divY = 4;
int sizeX = 1050; int sizeY = 350; void setup() { size(sizeX,sizeY); comm = new Serial(this, Serial.list()[0], 9600); comm.bufferUntil('\n'); for (int i=0; i<1000; i++) { valuesReff[i] = 0; valuesKapasitor[i] = 0; times[i] = i; } fileOutput = createWriter(namaFile); } void serialEvent(Serial comm){ String data[]; long ms = millis(); if(ms > END_TIME){ fileOutput.close(); exit(); } else{ if (ndata > 999) { for (int i=1; i<ndata; i++) { valuesReff[i-1] = valuesReff[i]; valuesKapasitor[i-1] = valuesKapasitor[i]; times[i-1] = times[i]; } ndata--; } // catat waktu dan baca data times[ndata] = ms; String inString = comm.readStringUntil('\n'); if (inString != null) { //Mulai memilah tegangan dari referensi //dan tegangan dari kapasitor inString = trim(inString); data = split(inString,"|"); valuesReff[ndata] = int(data[0]); valuesKapasitor[ndata] = int(data[1]); } fileOutput.println(valuesReff[ndata]+" "+valuesKapasitor[ndata]); ndata++; } elapsedTime = ms; } void draw(){ sizeY = 300; int x1, y1, y2, x0, y0, y01, t0; // tampilkan grafik background(255); stroke(0);
gambarSumbu(); cetakWaktu(); t0 = int(times[0]); x0 = 50; y0 = int(sizeY - (valuesReff[0] / divY)); y01 = int(sizeY - (valuesKapasitor[0] / divY)); if (ndata <= 1) return; scaleX = 1000.0 / (times[ndata-1] - t0); stroke(50); for (int i=1; i<ndata; i++) { x1 = int((times[i] - t0) * scaleX); x1 = x1 + 50; y1 = int(sizeY - (valuesReff[i] / divY)); y2 = int(sizeY - (valuesKapasitor[i] / divY)); line(x0, y0, x1, y1); line(x0, y01, x1, y2); x0 = x1; y0 = y1; y01 = y2; } } void gambarSumbu(){ int nData = 1000; nData = nData / divY; line(50,0,50,sizeY); line(50,sizeY,sizeX,sizeY); myFont = createFont("Arial", 12); textFont(myFont); fill(0, 102, 153, 51); for(int x=0; x<=(sizeX); x=x+50) { for (int y=0; y<=sizeY; y = y + 25){ point((x+50),y); text(y*4,50-30,(sizeY-y)); } } } void cetakWaktu(){ myFont = createFont("Arial", 12); textFont(myFont); fill(0, 50, 153, 100); text("Running Time: ",200,sizeY+30); text(round(elapsedTime/1000),290,(sizeY + 30)); text("detik",310,(sizeY + 30)); }
1.3. Analisis
Pada percobaan ini dilakukan akuisisi (pengambilan sampel) data dengan teknik Raw
Data. Yaitu teknik pengambilan data dengan memanfaatkan interupsi secara
langsung. Data yang terkirim tiap satuan waktu masuk ke processing dan secara
langsung ditampilkan pada grafik bit terhadap waktu. Bit-bit tersebut
merepresentasikan besarnya tegangan dengan perbandingan tegangan:bit adalah
5:1024. Data yang ditampilkan apa adanya, dalam artian langsung ditampilkan
begitu saja. Dapat dilihat pada grafik bahwa terdapat 2 buah grafik yaitu grafik yang
berbentuk persegi dan grafik yang melengkung. Grafik persegi menunjukkan
tegangan referensi. Yaitu tegangan sebelum melalui kapasitor. Besar tegangan naik
begitu saja ketika terbaca adanya tegangan. Sedangkan setelah melalui kapasitor,
tegangan naik perlahan dan turun perlahan secara eksponensial. Hal ini dikarenakan
adanya energy yang tersimpan dalam kapasitor terisi secara perlahan dan terbuang
secara perlahan pula.
2. Akuisisi Data dengan Menggunakan Rata-rata (Average) 2.1. Foto Rangkaian
Rangkaian yang digunakan sama persis dengan percobaan sebelumnya
2.2. Data Hasil Percobaan & Kode Pemrograman
Data Percobaan
Berikut gambar grafik bit PWM yang merepresentasikan besar tegangan terhadap
waktu:
Kemudian berdasarkan plotting dari tabel data percobaan, didapat grafik sebagai
berikut:
Plot Grafik tersebut yaitu berupa tabel bit terhadap waktu terlampir dengan nama
file “Data Rata2.doc”
Kode Pemrograman
Kode Arduino /** Program Akuisisi Data dengan menggunakan data rata-rata */ #include <MsTimer2.h> #define BAUD 9600 #define SAMPLING 10 #define PIN_SWITCH 3 #define BUFFER_SIZE 20 #define TIME_UP 3000 #define TIME_DOWN (TIME_UP+5000) #define REFF A0 #define INPUT_VAL A1 unsigned long time; int valReff; int valInput; void setup(){ Serial.begin(BAUD); pinMode(PIN_SWITCH,OUTPUT); MsTimer2::set(SAMPLING,fungsiTimer); MsTimer2::start(); time = 0 + SAMPLING; } void kirimData(){ Serial.print(valReff); Serial.print("|"); Serial.println(valInput); } void fungsiTimer(){ time = time + SAMPLING; valReff = 0; valInput = 0;
for(int i=0; i<BUFFER_SIZE; i++){ valReff = valReff + analogRead(REFF); valInput = valInput + analogRead(INPUT_VAL); }
valReff = (int) ((valReff + (BUFFER_SIZE /2)) / BUFFER_SIZE ); valInput = (int) ((valInput + (BUFFER_SIZE /2)) / BUFFER_SIZE ); kirimData(); } void loop() { if(time==TIME_UP){ digitalWrite(PIN_SWITCH,HIGH); } else if(time==TIME_DOWN){ digitalWrite(PIN_SWITCH,LOW); } }
Kode Processing
Kode Processing yang digunakan secara garis besar sama seperti percobaan
pertama, namun pada baris 19:
String namaFile = "dataRaw.txt";
Diubah menjadi:
String namaFile = "dataRata2.txt";
2.3. Analisis
Pada percobaan kedua, dilakukan pengambilan data dengan teknik Rata-rata. Teknik
ini bekerja dengan cara menampilkan grafik berupa rata-rata dari beberapa data
yang masuk dan tersimpan terlebih dahulu. Rata-rata dari data-data tersebut lah
yang kemudian ditampilkan pada grafik. Pembacaan bentuk grafik serupa dengan
percobaan sebelumnya. Teknik ini memberikan keuntungan tersendiri yaitu
meminimalisir noise (data tidak diinginkan) yang sering kali muncul pada
pengambilan data yang malah mengganggu pembacaan hasil percobaan.
3. Akuisisi Data dengan Menggunakan Rata-rata Semu
(Pseudo-Average) 3.1. Foto Rangkaian
Rangkaian yang digunakan sama persis dengan percobaan sebelumnya
3.2. Data Hasil Percobaan & Kode Pemrograman
Data Percobaan
Berikut gambar grafik bit PWM yang merepresentasikan besar tegangan terhadap
waktu:
Kemudian berdasarkan plotting dari tabel data percobaan, didapat grafik sebagai
berikut:
Plot Grafik tersebut yaitu berupa tabel bit terhadap waktu terlampir dengan nama
file “Data Rata2Semu.doc”
Kode Pemrograman
Kode Arduino /** Program Akuisisi Data dengan menggunakan rata-rata semu (pseudo average) */ #include <MsTimer2.h> #define BAUD 9600 #define SAMPLING 10 #define PIN_SWITCH 3 #define BUFFER_SIZE 20 #define TIME_UP 3000 #define TIME_DOWN (TIME_UP+5000) #define REFF A0 #define INPUT_VAL A1 unsigned long time; int valReff;
int valInput; int nData;
int rata2Reff; int rata2Input; void setup(){ Serial.begin(BAUD); pinMode(PIN_SWITCH,OUTPUT); MsTimer2::set(SAMPLING,fungsiTimer); MsTimer2::start(); time = 0 + SAMPLING; nData = 0; valReff = 0; valInput = 0; rata2Reff = 0; rata2Input = 0; } void kirimData(){ Serial.print(rata2Reff); Serial.print("|"); Serial.println(rata2Input); } void fungsiTimer(){ if(nData < BUFFER_SIZE){ valReff = valReff + analogRead(REFF); valInput = valInput + analogRead(INPUT_VAL); nData = nData + 1; } else{ valReff = valReff - rata2Reff + analogRead(REFF); valInput = valInput - rata2Input + analogRead(INPUT_VAL); } rata2Reff = (int) ((valReff) / nData); rata2Input = (int) ((valInput) / nData); kirimData(); time = time + SAMPLING; } void loop() { if(time==TIME_UP){ digitalWrite(PIN_SWITCH,HIGH); } else if(time==TIME_DOWN){ digitalWrite(PIN_SWITCH,LOW); } }
Kode Processing
Kode Processing yang digunakan secara garis besar sama seperti percobaan
pertama, namun pada baris 19:
String namaFile = "dataRaw.txt";
Diubah menjadi:
String namaFile = "dataRata2Semu.txt";
3.3. Analisis
Hampir serupa dengang teknik rata-rata yang dilakukan sebelumnya, rata-rata semu
dilakukan dengan merata-ratakan sejumlah data. Ketika hadir data baru, dicari lagi
rata-rata sejumlah data lama+1 (1 adalah jumlah data baru yang masuk). Demikian
seterusnya sampai sejumlah data tertentu. Setelahnya data dirata-rata sejumlah
data awal kembali dan proses ini berulang terus menerus. Dengan demikian, data
yang tidak terukur akibat adanya proses perata-rataan seperti yang terjadi pada
teknik average dapat diminimalisir/tercover.
4. Akuisisi Data dengan Menggunakan Rata-rata Berjalan
(Moving-Average) 4.1. Foto Rangkaian
Rangkaian yang digunakan sama persis dengan percobaan sebelumnya
4.2. Data Hasil Percobaan & Kode Pemrograman
Data Percobaan
Berikut gambar grafik bit PWM yang merepresentasikan besar tegangan terhadap
waktu:
Kemudian berdasarkan plotting dari tabel data percobaan, didapat grafik sebagai
berikut:
Plot Grafik tersebut yaitu berupa tabel bit terhadap waktu terlampir dengan nama
file “Keluaran File.doc”
Kode Pemrograman
Kode Arduino Kode Pemrograman Arduino yang digunakan pada percobaan ini sama dengan percobaan pertama.
Kode Processing /** * Grafik Akuisisi Data *
* Program untuk menerima data dari USB dan mencatat waktu penerimaan. * Hasil ditampilkan sebagai grafik dan disimpan ke file. */ import processing.serial.*; // Create object from Serial class Serial comm; // Data received from the serial port int value; int time; //Identitas untuk file penyimpan hasil akuisisi data PrintWriter fileOutput; String namaFile = "KeluaranFile.txt"; PFont myFont; // buffer data mentah, yang akan diterima dari arduino int NCHANNEL = 2; int NBUFFER = 128; int rawData[][] = new int[NCHANNEL][NBUFFER]; int head = 0; //Waktu Pengambilan Data 35 detik int detik = 15; long END_TIME = detik*1000; long times[] = new long[1000]; //long values[] = new long[1000]; long valuesReff[] = new long[1000]; //long values2[] = new long[1000]; long valuesKapasitor[] = new long[1000]; long elapsedTime; int ndata = 0; //int GESER_X = 50; float scaleX; int divY = 4; int sizeX = 1050; int sizeY = 350; //void putData(int[] data) { // for (int i=0; (i<NBUFFER) && (i<data.length); i++) { // rawData[i][head] = data[i]; // } // head = (head + 1) % NBUFFER; //} void putData(String[] data) { for (int i=0; (i<NBUFFER) && (i<data.length); i++) { rawData[i][head] = int(data[i]); } head = (head + 1) % NBUFFER; } int movingAverage(int ch) { long sum=0;
for (int i=0; i< NBUFFER; i++) { sum = sum + rawData[ch][i]; } return (int) sum / NBUFFER; } void setup() { size(sizeX,sizeY); comm = new Serial(this, Serial.list()[0], 9600); comm.bufferUntil('\n'); for (int i=0; i<1000; i++) { valuesReff[i] = 0; valuesKapasitor[i] = 0; times[i] = i; } fileOutput = createWriter(namaFile); } void serialEvent(Serial comm){ String data[]; long ms = millis(); elapsedTime = ms; if(ms > END_TIME){ fileOutput.close(); exit(); } else{ // baca data secepatnya String inString = comm.readStringUntil('\n'); if (inString == null) return; //Mulai memilah tegangan dari referensi //dan tegangan dari kapasitor inString = trim(inString); data = split(inString,"|"); putData(data); } if (ndata > 999) { for (int i=1; i<ndata; i++) { valuesReff[i-1] = valuesReff[i]; valuesKapasitor[i-1] = valuesKapasitor[i]; times[i-1] = times[i]; } ndata--; } // catat waktu dan baca data valuesReff[ndata] = movingAverage(0); valuesKapasitor[ndata] = movingAverage(1); times[ndata] = ms; fileOutput.println(valuesReff[ndata]+" "+valuesKapasitor[ndata]); ndata++; } void draw(){ sizeY = 300; int x1, y1, y2, x0, y0, y01, t0; // kalau buffer belum penuh, jangan gambar dulu if (ndata < NBUFFER) return;
// tampilkan grafik background(255); stroke(0); gambarSumbu(); cetakWaktu(); t0 = int(times[0]); x0 = 50; y0 = int(sizeY - (valuesReff[0] / divY)); y01 = int(sizeY - (valuesKapasitor[0] / divY)); scaleX = 1000.0 / (times[ndata-1] - t0); stroke(50); for (int i=1; i<ndata; i++) { x1 = int((times[i] - t0) * scaleX); x1 = x1 + 50; y1 = int(sizeY - (valuesReff[i] / divY)); y2 = int(sizeY - (valuesKapasitor[i] / divY)); line(x0, y0, x1, y1); line(x0, y01, x1, y2); x0 = x1; y0 = y1; y01 = y2; } } void gambarSumbu(){ int nData = 1000; nData = nData / divY; line(50,0,50,sizeY); line(50,sizeY,sizeX,sizeY); myFont = createFont("Arial", 12); textFont(myFont); fill(0, 102, 153, 51); for(int x=0; x<=(sizeX); x=x+50) { for (int y=0; y<=sizeY; y = y + 25){ point((x+50),y); text(y*4,50-30,(sizeY-y)); } } } void cetakWaktu(){ myFont = createFont("Arial", 12); textFont(myFont); fill(0, 50, 153, 100); text("Running Time: ",200,sizeY+30); text(round(elapsedTime/1000),290,(sizeY + 30)); text("detik",310,(sizeY + 30)); }
4.3. Analisis
Perbedaan yang terdapat pada pecobaan ini dengan percobaan pertama adalah
kode pemrograman processing. Juga grafik yang muncul menunjukkan perbedaan
yang cukup signifikan. Hal ini dikarenakan pada teknik Moving-Average ini, awalnya
data disimpan dalam slot-slot sampai membentuk satu paket data berjumlah
tertentu. Data tersebut kemudian dirata-ratakan. Ketika masuk data berikutnya,
semua data bergeser sehingga data di ujung lain slot harus dieliminasi. Dari
kombinasi data baru ini pula diambil rata-rata baru. Kemudian setiap rata-rata itu
ditampilkan dalam bentuk grafik. Oleh karena itu dapat dilihat pada grafik data
referensi, bentuknya tidak berupa kotak melainkan trapesium. Hal ini karena
dibutuhkannya waktu untuk mengisi slot-slot tersebut sampai penuh terlebih
dahulu lalu kemudian dapat ditampilkan secara utuh karena data sudah lengkap.