Monday, April 16, 2018

Perancangan Pengolahan Sinyal Digital berbasis Mikrokontroler: Pulse-Oximeter Sederhana

PERANCANGAN PENGOLAHAN SINYAL DIGITAL BERBASIS MIKROKONTROLER: PULSE-OXYMETER SEDERHANA
Theo Gunawan (13215029)
Yoland Nababan (13215053)
EL3014-Sistem Mikroprosesor
Program Studi Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB

  

Abstrak
Setelah sebelumnya merancang serta membuat filter FIR dan rangkaian analog, pada percobaan ini dibuat rangkaian tahap akhir dari pulse-oxymeter sederhana ini. Rangkaian dibuat menggunakan printed circuit board (PCB) dan menjalani serangkaian simulasi menggunakan osiloskop untuk dilihat keberjalanannya.
Kata kunci: Pulse-oxymeter, printed circuit board, simulasi menggunakan osiloskop

1. Pendahuluan
Pulse-oxymeter adalah sebuah alat yang digunakan untuk memeriksa saturasi hemoglobin dalam tubuh dengan cara mendeteksi jari menggunakan phototransistor dan kemudian mengeluarkan sinyal berdasarkan bacaan masukan. Pulse-oxymeter terdiri dari rangkaian utama, ADC, filter FIR, dan DAC. Pada percobaan ini dibahas mengenai rangkaian akhir dari pulse-oxymeter ini dan simulasinya menggunakan osiloskop.

2.Studi Pustaka
Implementasi pulse-oxymeter­ sederhana menggunakan tiga buah komponen, yaitu rangkaian preamplifier, low-pass filter, dan final amplifier dengan low-pass filter. Sinyal input berasal dari phototransistor.[1] Rangkaian lengkap dari pulse-oxymeter sederhana adalah sebagai berikut.
Gambar 2-1 Skema rangkaian lengkap pulse-oxymeter sederhana
Rangkaian pulse-oxymeter ini terhubung dengan analog-to-digital converter (ADC) sebelum melalui filter FIR pada Arduino. Output dari filter dihubungkan dengan digital-to-analog converter (DAC) untuk menghasilkan sinyal output akhir.

3. Metodologi
3.1 Komponen dan Alat
Komponen dan alat yang dipakai dalam percobaan ini adalah sebagai berikut.
  • PCB dengan rangkaian pulse-oxymeter.
  • Arduino.
  • Osiloskop.
3.2 Langkah-langkah Percobaan
Langkah-langkah yang dilakukan pada percobaan ini adalah sebagai berikut.
  • Merangkai pulse-oxymeter pada PCB sesuai dengan rancangan.
  • Menyambungkan rangkaian dengan ADC dan Arduino (filter FIR) dan Arduino pada DAC dan osiloskop.
  • Melakukan simulasi terhadap rangkaian menggunakan osiloskop.
Gambar 3-1 Rangkaian pulse-oxymeter menggunakan PCB

4. Hasil dan Analisis
Pada percobaan ini dibuat rangkaian pulse-oxymeter menggunakan PCB. Pada rangkaian tersebut terdapat penguat 2-stage. Output dari penguat 2-stage tersebut adalah sebagai berikut.
Gambar 4-1 Output penguat 2-stage
Sedangkan output dari phototransistor adalah sebagai berikut.
Gambar 4-2 Output dari phototransistor
Rangkaian pulse-oxymeter memiliki output pada rangkaian analog sebagai berikut.
Gambar 4-3 Output AC pada rangkaian analog
Gambar 4-4 Output DC pada rangkaian analog
Output pada rangkaian analog melalui analog-to-digital converter (ADC) terlebih dahulu sebelum menjadi input pada Arduino. Input pada Arduino (output ADC) adalah sebagai berikut.
Gambar 4-5 Input Arduino
Arduino bekerja sebagai FIR pada rangkaian. Output dari filter FIR adalah sebagai berikut.
Gambar 4-6 Output filter FIR
Sinyal output FIR masuk ke dalam digital-to-analog converter (DAC) sehingga menjadi output akhir sebagai berikut.
Gambar 4-7 Output akhir
Dapat terlihat bahwa pada hasil percobaan rangkaian FIR tidak bekerja dengan baik (sinyal input dan output terlihat sama). Hal ini menyebabkan output akhir memiliki noise. Selain itu rangkaian pulse-oxymeter bekerja baik.
Hasil percobaan lebih lanjut terdapat pada video.

5. Kesimpulan
Kesimpulan yang dapat ditarik dari percobaan ini adalah sebagai berikut.
  • Rangkaian pulse-oxymeter dapat diimplementasikan dengan cukup baik menggunakan PCB.


Daftar Pustaka
[1]            Ihsan Hariadi, Percobaan Awal Instrumen Pulse-Oxymeter Sederhana – versi 0.0, https://www.youtube.com/watch?v=hD5Phpbus1o, diakses 27 Maret 2018.

Lampiran
Source code
//#include <Wire.h>
//#include <Adafruit_MCP4725.h>
//
//#define BUFFERLENGTH 11
//#define LENGTH 100
//#define PI 3.14159265
//float koef_filter[BUFFERLENGTH] = {
//    0.0100,    0.0249  ,  0.0668  ,  0.1249,
//    0.1756 ,   0.1957  ,  0.1756   , 0.1249 , 
//    0.0668  ,  0.0249  ,  0.0100
//};
//float buffer[BUFFERLENGTH];
//float x[LENGTH];
//float y[LENGTH];
//float output;
//int i, j;
//Adafruit_MCP4725 dac;
//
//float filter(float input) {
//  float hasil;
//  //buffering
//  for(j = BUFFERLENGTH -1; j > 0; j--) {
//    buffer[j] = buffer[j-1];
//  }
//  //input disimpan di buffer 0 
//  int k=0;
//  buffer[k] = input;
//  // perhitungan filter
//  hasil= 0;
//  for(j = 0; j < BUFFERLENGTH; j++) {
//    hasil = hasil + buffer[(j+k) %BUFFERLENGTH]* round(koef_filter[j]*pow(2,31));
//  }
//  if (k<=0){
//    k=k+BUFFERLENGTH-1;
//  }
//  else{
//    k--;
//  };
// 
//  // kembalikan hasil pemfilteran   
//  return hasil;
//}
//
//  // testing frequency (frequency sampling: 6.5ms, wn 0.1)
//  unsigned long time = 0;
//  unsigned long time1 = 0;
//
//  //bacaan sensor
//  float input = 0;
// 
//  //setelah melewati DSP
//  float output_fir=0;
//
//  float output_dac = 0;
//  unsigned long norm = 1975396352;
//
//
//void setup() {
//  Serial.begin(9600);
//  // For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
//  dac.begin(0x60); // address
//  DDRB |= (1<<0);
//  PORTB |= (1<<0);
//}
//
//void loop() {
//    //siapkan input
//    input = (float(analogRead(A0)))/1023;
//       
//    //inisialisasi buffer dengan nol
//    for(i=0; i < BUFFERLENGTH; i++) {
//      buffer[i] = 0;
//    }
//   
//    //menghitung output
//      output_fir = filter(input);     
//     
//    // menampilkan output 
//    Serial.println(output_fir/17000000);
////    Serial.println(input);
//       
//    // output ke dac
//    output_dac = (int) (output/norm)*4095;
//    dac.setVoltage(output_dac, false);
//
//    PORTB ^= (1<<0);
//}

//====
//
//#include <Wire.h>
//#include <Adafruit_MCP4725.h>
//
//#define BUFFERLENGTH 21
//#define LENGTH 100
//#define PI 3.14159265
//float koef_filter[BUFFERLENGTH] = {
//
//    0.0050 ,   0.0070  ,  0.0125   , 0.0215   , 0.0336,
//    0.0478 ,   0.0627  ,  0.0768   , 0.0882   , 0.0957,
//    0.0983 ,   0.0957  ,   0.0882  ,  0.0768  ,  0.0627,  
//    0.0478 ,   0.0336  ,  0.0215   , 0.0125   , 0.0070 ,
//    0.0050
//};
//float buffer[BUFFERLENGTH];
//float x[LENGTH];
//float y[LENGTH];
//float output;
//int i, j;
//Adafruit_MCP4725 dac;
//
//float filter(float input) {
//  float hasil;
//  //buffering
//  for(j = BUFFERLENGTH -1; j > 0; j--) {
//    buffer[j] = buffer[j-1];
//  }
//  //input disimpan di buffer 0 
//  int k=0;
//  buffer[k] = input;
//  // perhitungan filter
//  hasil= 0;
//  for(j = 0; j < BUFFERLENGTH; j++) {
//    hasil = hasil + buffer[(j+k) %BUFFERLENGTH]* round(koef_filter[j]*pow(2,31));
//  }
//  if (k<=0){
//    k=k+BUFFERLENGTH-1;
//  }
//  else{
//    k--;
//  };
// 
//  // kembalikan hasil pemfilteran   
//  return hasil;
//}
//
//  // testing frequency (frequency sampling 675, wn = 0.12) 6.125ms
//  unsigned long time = 0;
//  unsigned long time1 = 0;
//
//  //bacaan sensor
//  float input = 0;
// 
//  //setelah melewati DSP
//  float output_fir=0;
//
//  float output_dac = 0;
//  unsigned long norm = 3000000;
//;
// 
//void setup() {
//  Serial.begin(9600);
//  // For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
//  dac.begin(0x60); // address
//  DDRB |= (1<<0);
//  PORTB |= (1<<0);
//}
//
//void loop() {
//    //siapkan input
//    input = ((float)(analogRead(A0)))/1023;
//       
//    //inisialisasi buffer dengan nol
//    for(i=0; i < BUFFERLENGTH; i++) {
//      buffer[i] = 0;
//    }
//   
//    //menghitung output
//      output_fir = filter(input);     
//     
//    // menampilkan output 
//    Serial.println(output_fir/10000000);
//       
//    // output ke dac
//    output_dac = (int) (output_fir/norm)*4095;
//    dac.setVoltage(output_dac, false);
//
//    PORTB ^= (1<<0);
//}

//////=====
#include <Wire.h>
#include <Adafruit_MCP4725.h>

#define BUFFERLENGTH 33
#define PI 3.14159265
float koef_filter[BUFFERLENGTH] = {
  0.0015  , -0.0000  , -0.0025 ,
  -0.0023 ,   0.0033 ,   0.0078, 
  -0.0000 ,  -0.0151 ,  -0.0126, 
  0.0168  ,  0.0361  , -0.0000,
  -0.0654 ,  -0.0575 ,   0.0902, 
  0.2998  ,  0.3997  ,  0.2998  ,
  0.0902  , -0.0575  , -0.0654  ,
  -0.0000 ,   0.0361 ,   0.0168,
  -0.0126 ,  -0.0151 ,  -0.0000 ,
  0.0078  ,  0.0033  , -0.0023  ,
  -0.0025 ,  -0.0000 ,   0.0015

};
float buffer[BUFFERLENGTH];

int i, j;
Adafruit_MCP4725 dac;

float filter(float input) {
  float hasil;
  //buffering
  for(j = BUFFERLENGTH -1; j > 0; j--) {
    buffer[j] = buffer[j-1];
  }
  //input disimpan di buffer 0 
  int k=0;
  buffer[k] = input;
  // perhitungan filter
  hasil= 0;
  for(j = 0; j < BUFFERLENGTH; j++) {
    hasil = hasil + buffer[(j+k) %BUFFERLENGTH]* round(koef_filter[j]*pow(2,31));
  }
  if (k<=0){
    k=k+BUFFERLENGTH-1;
  }
  else{
    k--;
  };
 
  // kembalikan hasil pemfilteran   
  return hasil;
}


  // testing frequency
  // (frequency = 160, period = 6.25ms, wn = 0.125)
  unsigned long time = 0;
  unsigned long time1 = 0;

  //bacaan sensor
  float input = 0;
 
  //setelah melewati DSP
  float output_fir=0;

  float output_dac = 0;
  unsigned long norm = 8000000;
 
void setup() {
  Serial.begin(9600);
  // For Adafruit MCP4725A1 the address is 0x62 (default) or 0x63 (ADDR pin tied to VCC)
  dac.begin(0x60); // address
  DDRB |= (1<<0);
  PORTB |= (1<<0);
}

void loop() {
    //siapkan input
    input = ((float)analogRead(A0))/1023;
       
    //inisialisasi buffer dengan nol
    for(i=0; i < BUFFERLENGTH; i++) {
      buffer[i] = 0;
    }
   
    //menghitung output
      output_fir = filter(input);     
     
    // menampilkan output 

//    Serial.println(output_fir/3000000);
//    Serial.println(input);
    Serial.println( ((int)((output_fir/3000000)*4095)) );
       
    // output ke dac
    output_dac = ((int) ((output_fir/3000000)*4095));
    dac.setVoltage(output_dac, false);
    PORTB ^= (1<<0);
}

Video Perancangan Pengolahan Sinyal Digital berbasis Mikrokontroler: Pulse-Oxymeter Sederhana

Video Perancangan Pulse-Oxymeter Sederhana
Video 1 Sinyal setelah melalui penguatan 2-stage
Video 2 Output dari phototransistor
Video 3 Output analog AC
Video 4 Output analog DC
Video 5 Input pada Arduino (sinyal setelah melalui ADC)
Video 6 Output dari filter FIR
Video 7 Output akhir setelah melalui DAC

Tuesday, April 10, 2018

Laporan Tugas 2 Sistem Mikroprosesor Tahap 3


PERANCANGAN PENGOLAHAN SINYAL DIGITAL BERBASIS MIKROKONTROLER: SIMULASI RANGKAIAN ANALOG INSTRUMENTASI PENGUKUR PULSE OXIMETRY
Theo Gunawan (13215029)
Yoland Nababan (13215053)
EL3014-Sistem Mikroprosesor
Program Studi Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB


Abstrak
Setelah melakukan simulasi menggunakan LTSpice dan pembuatan filter FIR, pada percobaan ini rangkaian pulse oximeter sederhana yang telah dibuat disimulasikan secara real-time. Rangkaian analog dibuat pada breadboard. Simulasi dilakukan menggunakan osiloskop untuk dilihat keberjalanannya.
Kata kunci: Pulse oximeter, simulasi real-time, breadboard

1.         Pendahuluan
Pulse-oximeter merupakan salah satu instrumentasi yang digunakan di dunia medis. Pulse-oximeter dapat digunakan untuk memeriksa saturasi hemoglobin dalam tubuh, dan bekerja dengan mendeteksi jari dan kemudian mengeluarkan sinyal berdasarkan pembacaan jari tersebut. Setelah melakukan simulasi menggunakan LTSpice dan pembuatan filter FIR, pada percobaan ini dibahas mengenai implementasi rangkaian analog pulse-oximeter sederhana pada breadboard dan simulasinya.

2.        Studi Pustaka
Implementasi pulse-oxymeter­ sederhana menggunakan tiga buah komponen, yaitu rangkaian preamplifier, low-pass filter, dan final amplifier dengan low-pass filter. Sinyal input berasal dari phototransistor.[1] Rangkaian lengkap dari pulse-oxymeter sederhana adalah sebagai berikut.
Gambar 2-1 Rangkaian lengkap pulse-oxymeter
Pada percobaan ini disimulasikan rangkaian analog menggunakan LPF biasa. Rangkaian LPF adalah sebagai berikut.


Gambar 2-2 Rangkaian LPF biasa

3.        Metodologi
3.1      Komponen dan Alat
Komponen dan alat yang dipakai dalam percobaan ini adalah sebagai berikut.
  • Rangkaian analog pulse-oximeter pada breadboard.
  • Osiloskop.
3.2      Langkah-langkah Percobaan
Langkah-langkah yang dilakukan pada percobaan ini adalah sebagai berikut.

  • Menyalakan osiloskop dan memasang kabel pada komponen.
  • Melakukan simulasi pada rangkaian analog.


4.        Hasil dan Analisis
Pada percobaan ini, dilakukan pengujian pada sistem penguat pada sensor. Namun sebelum memasuki bagian penguat sinyal, digunakan sistem sensor seperti pada gambar di bawah.

Gambar 4-1 Sistem sensor pada percobaan
Dapat diamati bahwa untuk menjalankan sensor tersebut, digunakan 2 buah nilai resistor. Resistor pertama yaitu resistor X2, digunakan untuk membatasi arus yang mengalir pada LED. Sumber tegangan yang digunakan adalah sebesar 12V. sementara LED yang digunakan adalah berwarna merah. Jika dipilih nilai resistansi yang cukup besar, maka arus yang mengalir akan cukup kecil sehingga menghasilkan nyala LED yang redup. Hal ini juga berlaku sebaliknya. Jika digunakan nilai resistansi yang semakin kecil, maka akan menghasilkan nyala yang semakin terang. Akibatnya sinyal output yang dihasilkan dari rangkaian sensor phototransistor akan semakin besar.
Oleh karena itu digunakan nilai resistor seminimal mungkin yang dapat membuat LED menghasilkan nyala paling terang. Dari gambar di bawah, dapat diamati pengaruh dari sinyal output sensor akan mengecil ketika digunakan resistansi yang semakin besar.


Gambar 4-2 Pengaruh dari sinyal output sensor saat resistansi sebesar 1 kOhm


Gambar 4-3 Pengaruh dari sinyal output sensor saat resistansi sebesar 200 Ohm
Sementara untuk pemilihan nilai resistansi pada phototransistor, dilakukan pemilihan nilai resistansi sebesar puluhan kiloOhm. Jika nilai resistansi terlalu kecil, maka akan menghasilkan drain arus yang cukup besar ketika phototransistor terpapar cahaya maksimum (saat jari tidak menyentuh bagian sensor). Drain arus yang besar ini akan mengakibatkan peningkatan suhu baik pada phototransistor dan juga resistor. Hal ini kurang disarankan karena dapat merusak komponen sensor.
Oleh karena itu, dilakukan percobaan untuk menguji nilai resistansi yang sesuai untuk menghasilkan sinyal yang lebih baik. Pada percobaan ini, digunakan 3 nilai yang berbeda. Ketiganya adalah 10 kOhm, 120 kOhm, serta 400 kOhm. Secara teori, nilai resistansi yang besar akan menghasilkan output yang semakin besar pula. Hal ini disebabkan oleh karena nilai hambatan yang cukup besar membuat nilai arus yang mengalir akan semakin kecil. Ketika phototransistor terpapar cahaya, terjadi penambahan arus pada rangkaian. Maka penambahan arus tersebut cenderung lebih besar jika dibandingkan dengan kondisi yang terpapar cahaya yang redup. Akibatnya perubahan tegangan output akan lebih signifikan. Lagipula karena resistor yang digunakan cukup besar, ketika terjadi perubahan arus, walaupun sedikit, dihasilkan drop tegangan yang lebih signifikan jika dibandingkan dengan nilai resistansi yang kecil. Hal tersebut dapat dilihat pada hasil percobaan di bawah dimana dapat diamati bahwa ketika digunakan resistansi yang semakin besar, akan dihasilkan output yang semakin besar.



Gambar 4-4 Output saat resistansi sebesar 10 kOhm (skala 20 mV/div)
Gambar 4-5 Output saat resistansi sebesar 120 kOhm (skala 100 mV/div)
Gambar 4-6 Output saat resistansi sebesar 400 kOhm (skala 500 mV/div)
Kemudian dilakukan pengujian untuk melihat bagaimana pengaruh dari penguatan sinyal. Untuk simulasi ini, dilakukan beberapa perubahan pada desain penguat dan filter dari versi yang sebelumnya. Karena sinyal dari sensor terlalu kecil, maka dilakukan penambahan 1 buah stage untuk melakukan penguatan. Penguatan yang dilakukan sebanyak 33 kali dan ada 2 buah stage sehingga kira kira menghasilkan penguatan sebesar 1000 kali. Desainnya dapat diamati pada gambar di bawah.


Gambar 4-7 Desain setelah ditambah stage penguatan
Pada design pengondisi sinyal ini, bagian DC sinyal dihilangkan terlebih dahulu menggunakan kapasitor, kemudian masuk ke bagian penguat. Proses ini dilakukan  sebanyak dua kali sehingga sinyal dari sensornya cukup besar. Pada desain sebelumnya dilakukan filtering terlebih dahulu pada sinyal. Namun hal ini kurang sesuai karena pada kenyataannya, sinyal informasi akan semakin mengecil dan semakin susah untuk diperbesar. Oleh karena itu, sinyal terlebih dahulu diperbesar yang kemudian pada bagian akhir akan dilakukan filtering untuk sinyal frekuensi tinggi. Filter yang digunakan adalah filter Low Pass Filter. Untuk hasil penguatan 2 stage, dapat diamati pada gambar di bawah dan video terlampir.
 Gambar 4-8 Hasil penguatan 2 stage (1 V/div)
Dapat diamati bahwa sinyal input sudah dapat diperbesar sehingga dapat diamati dalam orde 1V. namun dapat dilihat pada gambar tersebut bahwa sinyal kelihatan seperti berbayangan. Hal ini disebabkan karena noise yang ada pada rangkaian pengondisi sinyal tersebut. jika skala waktunya diubah, dapat diamati bahwa hasil output sinyal adalah sinyal sinusoidal dengan frekuensi 50Hz (seperti pada di gambar). Sinyal noise ini bersumber dari frekuensi jala-jala. Oleh karena itu, dibutuhkan rangkaian filter untuk menghilangkan noise tersebut.

 Gambar 4-9 Noise jala-jala
Kemudian sinyal dilewatkan pada stage akhir yaitu stage untuk filter, namun filter ini belum dapat menghasilkan sinyal output yang sesuai dengan yang diharapkan. Oleh karena itu, untuk bagian LPF, digunakan rangkaian filter biasa menjadi seperti pada gambar di bawah.
  

Gambar 4-10 Rangkaian filter
Frekuensi cut offnya dihitung dengan persamaan di bawah, menghasilkan nilai 7.23 Hz.


Dengan menggunakan rangkaian ini, akan menghasilkan fungsi transfer yang lebih landai jika dibandingkan dengan menggunakan filter LPF Sallen-Key seperti pada gambar di bawah (LPF Sallen-Key(Hijau); LPF biasa (Biru)).
Gambar 4-11 Fungsi transfer dengan LPF biasa dibandingkan LPF Sallen-Key
Walaupun fungsi transfer lebih landai, filter ini berhasil mengurangi noise pada frekuensi tinggi.
Oleh karena itu, didapatkan output sinyal oximeter yang sudah diperkuat dan difilter. Video demonstrasi dapat dilihat pada gambar di bawah. Namun dapat diamati bahwa nilai output nya cukup kecil namun masih dapat dibedakan. sinyal outputnya bernilai kurang lebih 0.3V dengan DC offset sebesar 6 V (dapat diamati pada video simulasi). Dari percobaan ini dapat disimpulkan bahwa sinyal oximeter sudah dapat dihasilkan dan diperkuat menjadi sinyal yang lebih besar.

5.        Kesimpulan
Dari hasil percobaan ini dapat disimpulkan:

  • Simulasi terhadap rangkaian analog pulse-oximeter telah berhasil dengan baik.


Daftar Pustaka
[1]            Ihsan Hariadi, Percobaan Awal Instrumen Pulse-Oxymeter Sederhana – versi 0.0, https://www.youtube.com/watch?v=hD5Phpbus1o, diakses 10 April 2018, 22.31.