Tuesday, March 27, 2018

Laporan Tugas 2 Sistem Mikroprosesor Tahap 1

PERANCANGAN PENGOLAHAN SINYAL DIGITAL BERBASIS MIKROKONTROLER: 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
Percobaan ini adalah mengenai desain rangkaian analog dalam instrumentasi pengukur pulse oximetry. Pada percobaan ini dibuat sebuah rangkaian analog filter dan input yang dapat berfungsi untuk mengukur pulse oximetry. Rangkaian tersebut dibuat menggunakan LTSpice dan kemudian disimulasikan untuk dilihat keberjalannya.
Kata kunci: Pulse oximetry, rangkaian analog, LTSpice

1.         Pendahuluan
Pulse oxymetry 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. Pada percobaan ini dibahas mengenai desain rangkaian filter implementasi pulse oximeter sederhana.

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

3.        Metodologi
3.1                        Komponen dan Alat
Komponen dan alat yang dipakai dalam percobaan ini adalah sebagai berikut.
  • Komputer.
  • Software LTSpice.
3.2                       Langkah-langkah Percobaan
Langkah-langkah yang dilakukan pada percobaan ini adalah sebagai berikut.
  • Menyalakan komputer kemudian membuka software LTSpice.
  • Menggunakan LTSpice, membuat rangkaian analog pulse oximetry sesuai dengan gambar 3-1.

Gambar 3-1 Rangkaian filter

Gambar 3-2 Rangkaian input yang berasal dari phototransistor


Gambar 3-3 Rangkaian lengkap pulse-oxymeter

4.        Hasil dan Analisis
Pada percobaan ini akan dirancang sensor Oximeter.  Oleh karena itu akan dihasilkan sinyal output dari rangkaian LED dan phototransistor. Sinyal  tersebut terdiri dari rangkaian sinyal DC dan tegangan sinyal kecil yang berasal dari efek detak jantung yang mengalir di ujung jari. Oleh  karena itu, sinyal informasi yang dibutuhkan adalah sinyal yang berupa sinyal kecil.
Biasanya sinyal ini sangat kecil yang dapat bernilai hingga 2% dari sinyal total. Oleh karena itu, dibutuhkan rangkaian yang berfungsi untuk menyaring sinyal informasi tersebut dan memperbesarnya sehingga dapat diproses oleh mikroprosesor. Untuk merealisasikannya, digunakan rangkaian filter DC berupa kapasitor yang nilainya cukup besar.
Kemudian, sinyal tersebut juga difilter dari sinyal sinyal noise serta sinyal gangguan lainnya. Kisaran sinyal informasi adalah dibawah 5 Hz. Oleh karena itu, frekuensi yang lebih besar dapat dihilangkan agar tidak mengganggu rangkaian.
Salah satu rangkaian tersebut adalah sinyal dengan frekuensi 50-60 Hz yang bersumber dari tegangan jala-jala. Selain itu, sinyal juga terdiri dari noise yang memiliki frekuensi yang beragam. Oleh karena itu, rangkaian filter diatur sedemikian rupa agar nilai cut offnya dapat diubah-ubah. Cara mengubahnya adalah dengan mengunakan resistor variable R13 (pada gambar 3-1) sampai memiliki nilai 150kOhm.
Untuk menghasilkan LPF tersebut, dapat digunakan dengan menggunakan rangkaian filter Butterworth orde 2. Rangkaian yang digunakan adalah rangkaian Sallen-Key seperti pada gambar 4-1 dibawah.

Gambar 4-1 Rangkaian Sallen-Key filter Butterworth
Dari rangkaian tersebut dapat diperoleh nilai frekuensi cut off dari rangkaian filter.
Sedangkan untuk nilai komponennya adalah sebagai berikut,
C = 220nF         ; n = 1
R = 500 Ohm    ; m = 100
Sehingga didapat nilai frekuensi cut off sebesar 144,68 Hz
Nilai R13 pada gambar dapat diubah sedemikian rupa sehingga nilainya adalah 50kOhm. Tujuannya adalah untuk menghasilkan frekuensi cut-off yang lebih rendah dan dapat menghilangkan noise yang lebih besar.
C = 220nF             ; n = 1
R = 50000 Ohm    ; m = 1
Sehingga didapat nilai frekuensi cut off sebesar 14,468 Hz.
Untuk frekuensi transfernya adalah sebagai berikut


Gambar 4-2 Rangkaian input untuk R13 = 50 Ohm


Gambar 4-3 Fungsi transfer untuk R13 = 50 Ohm


Gambar 4-4 Rangkaian input dengan R13 = 500 Ohm


Gambar 4-5 Fungsi transfer untuk R13 = 500 Ohm
Kemudian diberikan rangkaian untuk menghilangkan komponen DC. Yaitu menggunakan kapasitor dengan nilai 1mF seperti pada gambar di bawah.


Gambar 4-6 Rangkaian input setelah ditambah kapasitor


Gambar 4-7 Fungsi transfer setelah ditambah kapasitor
Dapat diamati bahwa nilai pada frekuensi rendah menjadi diperkecil. Kemudian dilanjutkan dengan melakukan penguatan pada rangkaian. Penguatan yang dilakukan harus cukup besar karena dapat diamati pada gambar diatas, nilai penguatan pada frekuensi 1 Hz bernilai 1 kali. Oleh karena itu, dilakukan penguatan sebesar 20 kali atau 26dB. Rangkaian yang digunakan adalah rangkaian pada gambar di bawah dan menghasilkan fungsi transfer pada gambar di bawah.
 
Gambar 4-8 Rangkaian penguat 20 kali

Gambar 4-9 Fungsi transfer setelah diberi penguat
Setelah mendapat fungsi transfer tersebut, kita dapat menyimpulkan bahwa rangkaian filter sudah berhasil diterapkan. Namun rangkaian ini, belum diuji untuk melihat apakah sinyal tersebut dapat digunakan pada penerapannya nanti. Pengujian dilakukan pada 2 frekuensi input, yaitu 100 Hz dan 2 Hz. Input yang digunakan merupakan input sinyal 9 DC + 0.12 V AC. Nilai tegangan AC akan mewakili nilai tegangan sinyal kecil yang menjadi sinyal informasi.
Kemudian hasil pengujiannya dapat dilihat pada gambar dibawah ini (hijau = output; merah = input).


Gambar 4-10 Hasil uji coba untuk frekuensi = 2 Hz dan R13 = 500 Ohm


Gambar 4-11 Hasil uji coba untuk frekuensi = 100 Hz dan R13 = 500 Ohm
Dapat diamati pada gambar di bawah, sinyal output (hijau) tidak cukup besar, namun nilai DC nya sudah difilter. Nilai penguatan yang kecil ini diakibatkan karena nilai penguatan pada frekuensi 100Hz semakin kecil, sesuai dengan gambar respons frekuensinya.
Simulasi tersebut merupakan simulasi yang cukup ideal karena tidak memiliki sinyal noise. Untuk membuat simulasi semakin mirip dengan kenyataan, maka akan ditambahkan sinyal noise seperti pada gambar di bawah ini.


Gambar 4-12 Sinyal ideal (biru) dan sinyal noise (hijau) untuk frekuensi input sebesar 100 Hz
Penggabungan sinyal noise dengan sinyal informasi dapat dilihat pada gambar di bawah ini.


Gambar 4-13 Penggabungan sinyal noise dengan sinyal informasi


Gambar 4-14 Sinyal output (hijau) dan sinyal input (biru) dengan frekuensi input sebesar 100Hz


Gambar 4-15 Sinyal input dan noise untuk frekuensi sebesar 2 Hz


Gambar 4-16 Gabungan sinyal input dan noise untuk f = 2 Hz
Kemudian sinyal tersebut dilewatkan pada rangkaian filter sehingga menghasilkan sinyal sebagai berikut untuk frekuensi input 2 Hz(hijau = input, biru = output)
 Gambar 4-17 Sinyal setelah melewati filter
Dari gambar tersebut dapat dilihat bahwa hasil yang didapatkan sudah sesuai dengan sinyal output yang diinginkan dan sudah siap diterapkan pada bagian pengolahan sinyal.

5.        Kesimpulan
Dari hasil percobaan ini dapat disimpulkan:
  • Rangkaian analog pulse oximeter telah didesain dan diimplementasikan dengan baik.

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.

Friday, March 2, 2018

Laporan Tugas 1 Sistem Mikroprosesor: Jam Digital Multitasking





IMPLEMENTASI JAM DIGITAL PADA SEVEN SEGMENT MENGGUNAKAN ARDUINO BESERTA KEMAMPUAN MULTITASKING SEDERHANA
Theo Gunawan (13215029)
Yoland Nababan (13215053)
EL3014-Sistem Mikroprosesor
Program Studi Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB



Abstrak


Setelah sukses mengimplementasikan jam digital sederhana pada seven segment dengan menggunakan Arduino, percobaan ini adalah mengenai kemampuan multitasking sederhana dari jam digital yang telah dibuat. Pada percobaan ini source code yang telah dibuat pada percobaan sebelumnya dimodifikasi agar dapat melakukan multitasking yang diimplementasikan menggunakan push button. Source code diunggah menuju Arduino untuk diuji keberjalanannya pada rangkaian.
Kata kunci: Implementasi jam digital, seven segment, Arduino, multitasking

1.         Pendahuluan

Arduino merupakan sebuah mikroprosesor yang banyak digunakan dalam pembuatan rangkaian tertentu. Salah satu implementasi yang dapat dilakukan dengan menggunakan Arduino adalah jam digital. Kemampuan multitasking pada jam digital ini dapat diimplementasikan dengan menggunakan push button. Pada percobaan ini dibahas mengenai implementasi jam digital dengan multitasking sederhana dengan menggunakan Arduino.

2.        Studi Pustaka
Berikut adalah beberapa referensi yang digunakan dalam membuat implementasi ini.
Deskripsi register (misal: port output) didefinisikan sebagai berikut.[1]


Gambar 4-1 Deskripsi register
Deskripsi timer/counter didefinisikan sebagai berikut.[1]


Gambar 4-2 Deskripsi timer/counter TCCR
Clock select didefinisikan sebagai berikut.[1]


Gambar 4-3 Daftar clock select dan prescaler
TCNT, OCR, TIMSK, dan TIFR didefinisikan sebagai berikut.[1]


Gambar 4-4 TCNT, OCR, TIMSK, dan TIFR

3.        Metodologi

3.1                        Komponen dan Alat
Komponen dan alat yang dipakai dalam percobaan ini adalah sebagai berikut.
  • Komputer.
  • Software Arduino.
  • Arduino Uno beserta kabel USB.
  • Breadboard.
  • Seven segment.
  • Push button.
  • Kabel jumper.
3.2                       Langkah-langkah Percobaan
Langkah-langkah yang dilakukan pada percobaan ini adalah sebagai berikut.
  • Merangkai implementasi jam digital multitasker pada breadboard menggunakan seven segment dan push button.
  • Memodifikasi source code pada percobaan sebelumnya sesuai dengan lampiran menggunakan software Arduino.
  • Memasang kabel USB pada Arduino dan pada komputer.
  • Mengunggah kode pada Arduino untuk diuji dan dilihat keberjalanannya.

4.        Hasil dan Analisis

4.1                        Hasil Percobaan
Hasil dari percobaan kali ini adalah sebuah jam digital yang dapat diimplementasikan pada seven segment dan melakukan multitasking sederhana dengan menggunakan Arduino. Berikut merupakan gambar implementasinya.

Gambar 4-1 Implementasi jam digital multitasking pada seven segment
Hasil lebih lanjut terlampir pada video.


4.2                       Analisis
Pada tugas kali ini, dibuat sebuah jam digital yang diimplementasikan ke dalam empat buah seven segment. Seven segment yang digunakan terdiri dari empat buah untuk mewakiliki format hh:mm. Seven segment membutuhkan sebanyak 8 pin untuk dapat dinyalakan. Karena menggunakan 4 buah seven segment, maka akan dibutuhkan pin sekitar 32 pin. Sementara pin yang tersedia pada Arduino Uno tidak sebanyak itu. Oleh karena itu, seven segment akan dinyalakan secara bergantian sehingga jumlah pin yang dibutuhkan adalah 12 buah pin. Seven segment harus berganti cukup cepat sehingga mata manusia tidak dapat mendeteksi perubahannya. Akibatnya, seven segment akan menyala seperti dinyalakan secara bersamaan. Untuk menjalankan fungsi sebagai sebuah jam digital, maka dibutuhkan pewaktuan pada jam tersebut. Hal ini dapat tercapai dengan menggunakan timer pada Arduino—dalam hal ini merupakan mikroprosesor ATMEGA 328p. Setelah itu, program ini akan menjalankan program utamanya. Program utamanya adalah sebuah prosedur yang digunakan untuk menyalakan keempat seven segment tersebut. oleh karena itu, program akan selalu berulang untuk menampilkan display tersebut. Prosedur untuk menampilkan seven segment ini berisi prosedur yang berfungsi sebagai decoder pada seven segment. Seven segment yang digunakan menggunakan seven segment dengan common cathode. Oleh karena itu, untuk menyalakan satu buah seven segment, pin katoda diberikan nilai LOW dan pin anodanya diberi nilai HIGH. Sementara untuk memadamkan satu seven segment, nilai anoda tidak perlu diubah ubah, hanya perlu mengubah nilai katoda menjadi HIGH untuk memastikan beda tegangan antara kedua kaki tidak cukup besar untuk menyalakan seven segment. Dalam prosedur tersebut, ada bagian yang berfungsi untuk melakukan fungsi ini. Oleh karena itu, untuk menyalakan seven segment, maka nilai katoda dari masing masing seven segment diubah. Ketika 1 pin bernilai LOW, maka tiga pin lainnya bernilai HIGH dan begitu seterusnya. Sementara metode yang digunakan untuk menghasilkan jam yang cukup akurat adalah dengan menggunakan interrupt dan overflow pada timer. Interrupt berfungsi untuk menjalankan suatu prosedur atau instruksi yang cukup singkat. Program utama akan dihentikan sebentar kemudian prosedur interrupt akan dijalankan. Sementara, memastikan delay yang dihasilkan adalah 1 detik dapat dilakukan dengan melakukan pengesetan terlebih dahulu pada beberapa register timer. Pertama-tama adalah dengan mengeset nilai clock yang digunakan. Selain interrupt, program ini akan berjalan menggunakan konsep overflow. Ketika suatu register counter/timer mencapai nilai maksimumnya, maka overflow akan terjadi. Oleh karena itu, untuk menghasilkan delay 1 detik, maka dilakukan dengan mengisikan suatu nilai awal pada register counter/timer. Untuk percobaan ini akan digunakan TIMER1. Timer ini memiliki nilai maksimum sebesar 65535. Oleh karena itu, untuk menghasilkan delay sebesar 1 sekon, maka dapat dilakukan dengan cara sebagai berikut.


Untuk mengatur nilai prescaler, dapat dilakukan dengan mengubah nilai register TCCR1B. Nilai prescaler yang digunakan adalah sebesar 1024. Nilai awal ini akan menghasilkan delay jika bertambah dari nilai awal tersebut sampai nilainya overflow. Overflow ini nantinya akan digunakan sebagai sinyal untuk memanggil interupsi. Oleh karena itu, pada saat mendeklarasikan prosedur interrupt (ISR), maka digunakan vector TIMER1_OVF_vect. Sedangkan untuk membuat overflow dapat dimanfaatkan maka akan digunakan sebuah register yang berujuan untuk meng-enable fitur tersebut. Caranya adalah dengan mengubah nilai register TIMSK yang merupkan register yang bertujuan untuk melakukan enable pada fungsi interrupt jika overflow terjadi. Hal inilah yang kita butuhkan untuk menghasilkan perilaku yang kita harapkan. Artinya ketika terjadi overflow pada register TCNT1, maka akan terjadi overflow yang nantinya menjadi pemicu terjadinya interrupt. Bagian prosedur ISR digunakan untuk mengupdate nilai jam, menit, dan detik. Oleh karena itu, pada program interrupt ini, nilai detik akan mengalami penambahan sebanyak 1 dan akan diubah ke dalam nilai jam dan menit. Kemudian nilai counter di-reset ke nilai awal tadi yaitu TCNT1 = 0xC2F7. Kemudian dilakukan implementasi pada program yang sudah dirancang. Dari program tersebut dapat menghasilkan delay yang akurat yaitu 1 detik.

Implementasi multitasker pada jam digital ini dilakukan dengan menggunakan tiga buah push button dan diimplementasikan dengan menggunakan external interrupt.

5.        Kesimpulan
Dari hasil percobaan ini dapat disimpulkan:
  • Jam digital dapat diimplementasikan dengan menggunakan counter/timer dan interrupt.
  • Multitasking dalam jam digital ini dapat diimplementasikan dengan menggunakan interrupt.

Daftar Pustaka
[1]            Mervin T. Hutabarat dkk., Petunjuk Praktikum Sistem Mikroprosesor, ed. 2017-2018, Laboratorium Dasar Teknik Elektro Institut Teknologi Bandung, Bandung, 2018.

Lampiran
Source code proyek
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
#include <avr/interrupt.h>

int val[4] = {0,0,0,0};
volatile unsigned int detik ;
char key;
// merah coklat orens kuning
// abu2  ungu biru hijo

volatile unsigned int menit;
volatile unsigned int jam;
volatile char prev_temp;
volatile unsigned int temp;

int main (void) {
  int mode; // untuk pengesetan mode alat
  detik = 0;
  jam = 0;
  menit = 0;
  temp = 0;
  sevseg_init();
  TIMSK1 |= (1 << TOIE1); //enable overflow interrupt
  sei();// start global interrupt
 
  // inisialisasi interrupt eksternal
  EIMSK |= (1<<INT0);
  MCUCR |= (1<<ISC01);
  EIFR |= (1<<INTF0);
  DDRD |= (0<<PD0);

//  inisialisasi input pullup
  DDRE|= (0<<PE4)|(0<<PE5);
  PORTE|= (1<<PE4)|(1<<PE5);
 
  timer1_init();// timer 1 initialization
  while (1){
    TIMSK1 |= (1 << TOIE1);
    cetakSemua();
      while (temp){
        TIMSK1 =0x00;
        val[3] = 0;
        val[2] = 0;
        val[1] = 0;
        val[0] = 0;
        detik = 0;
        while (temp){
        cetakSemua();
//        val[2] = 1;
        if (!(PORTE&&(1<<PE5))){
            _delay_ms(100);
            if (!(PORTE&&(1<<PE5))){
              jam ++;
              val[3] = jam/10;
              val[2] = jam%10;
              }
          }
        if (!(PORTE&&(1<<PE4))){
          _delay_ms(100);
          if (!(PORTE&&(1<<PE4))){
            menit ++;
            val[1] = menit/10;
            val[0] = menit%10;
            }
          }
        } 
        }
  }
}
ISR(INT0_vect){
     _delay_ms(100);
     if (!(PORTD&&(1<<PD0))){
      temp = !temp;
      }
  }

ISR(TIMER1_OVF_vect){
  detik = detik + 60;
  TCNT1 = 0xC2F7;
  if (detik%60 == 0){
    val[3] = ((detik/60)/60)/10;
    val[2] = ((detik/60)/60)%10;
    val[1] = ((detik/60)%60)/10;
    val[0] = ((detik/60)%60)%10; 
  }
}

void timer1_init(){
    // initialize counter
    TCNT1 = 0xC2F7;   
    //1024 prescaler
    TCCR1B |= ((1 << CS10) | (1 << CS12)); 
}

void cetakSemua(){
    reset();
    PORTB = 0b00001110;
    decoder(val[0]);
  
    reset();
    PORTB = 0b00001101;
    decoder(val[1]);
  
    reset();
    PORTB = 0b00001011;
    decoder(val[2]);

    reset();
    PORTB = 0b00000111;
    decoder(val[3]);
}

void decoder(unsigned char A){
  if(A == 0)
  {
    PORTC = 0b11101101; //edctbagf
  }
  if(A == 1)
  {
    PORTC = 0b00101000;
  }
  if(A == 2)
  {
    PORTC = 0b11001110;
  }
  if(A == 3)
  {
    PORTC = 0b01101110;
  }
  if(A == 4)
  {
    PORTC = 0b00101011;
  }
  if(A == 5)
  {
    PORTC = 0b01100111;
  }
  if(A == 6)
  {
    PORTC = 0b11100111;
  }
  if(A == 7)
  {
    PORTC = 0b00101100;
  }
  if(A == 8)
  {
    PORTC = 0b11101111;

  }
  if(A == 9)
  {
    PORTC = 0b01101111;
  }
}

void reset(){
  PORTC = 0x00;
  PORTB |= (1<<PB3)|(1<<PB2)|(1<<PB1)|(1<<PB0);
}

void sevseg_init(){
  DDRB = 0x0F; // port B jadi output
  DDRC = 0xFF; // port C jadi output 
  }
 
void keypad_init(){
  DDRA = 0x0F;
  PORTA = 0xFF; 
  key = 'x';
  }

void input_key(){
    PORTA =0b11111110;
    if((PINA&(1<<PA4)) == 0) {key = 'D';}
    if((PINA&(1<<PA5)) == 0) {key = 'C';}
    if((PINA&(1<<PA6)) == 0) {key = 'B';}
    if((PINA&(1<<PA7)) == 0) {key = 'A';}

    PORTA =0b11111101;
    if((PINA&(1<<PA4)) == 0) {key = '#';}
    if((PINA&(1<<PA5)) == 0) {key = '9';}
    if((PINA&(1<<PA6)) == 0) {key = '6';}
    if((PINA&(1<<PA7)) == 0) {key = '3';}
   
    PORTA =0b11111011;
    if((PINA&(1<<PA4)) == 0) {key = '0';}
    if((PINA&(1<<PA5)) == 0) {key = '8';}
    if((PINA&(1<<PA6)) == 0) {key = '5';}
    if((PINA&(1<<PA7)) == 0) {key = '2';}
   
    PORTA =0b11110111;
    if((PINA&(1<<PA4)) == 0) {key = '*';}
    if((PINA&(1<<PA5)) == 0) {key = '7';}
    if((PINA&(1<<PA6)) == 0) {key = '4';}
    if((PINA&(1<<PA7)) == 0) {key = '1';}
  }