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
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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);
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;