laporan praktikum 4- andam dr - 13309013

18
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

Upload: yeyesrizkiani

Post on 01-Jul-2015

82 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: Laporan Praktikum 4- Andam DR - 13309013

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

Page 2: Laporan Praktikum 4- Andam DR - 13309013

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:

Page 3: Laporan Praktikum 4- Andam DR - 13309013

Kemudian berdasarkan plotting dari tabel data percobaan, didapat grafik sebagai

berikut:

Page 4: Laporan Praktikum 4- Andam DR - 13309013

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(){

Page 5: Laporan Praktikum 4- Andam DR - 13309013

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;

Page 6: Laporan Praktikum 4- Andam DR - 13309013

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);

Page 7: Laporan Praktikum 4- Andam DR - 13309013

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

Page 8: Laporan Praktikum 4- Andam DR - 13309013

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:

Page 9: Laporan Praktikum 4- Andam DR - 13309013

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); }

Page 10: Laporan Praktikum 4- Andam DR - 13309013

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:

Page 11: Laporan Praktikum 4- Andam DR - 13309013

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;

Page 12: Laporan Praktikum 4- Andam DR - 13309013

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";

Page 13: Laporan Praktikum 4- Andam DR - 13309013

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:

Page 14: Laporan Praktikum 4- Andam DR - 13309013

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 *

Page 15: Laporan Praktikum 4- Andam DR - 13309013

* 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;

Page 16: Laporan Praktikum 4- Andam DR - 13309013

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;

Page 17: Laporan Praktikum 4- Andam DR - 13309013

// 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)); }

Page 18: Laporan Praktikum 4- Andam DR - 13309013

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.