Implementasi Protokol USB pada Pengontrol Mikro Atmega8 untuk Akuisisi Data Sinyal Elektrokardiogram.

(1)

i

IMPLEMENTASI PROTOKOL USB PADA PENGONTROL MIKRO ATMEGA8 UNTUK AKUISISI DATA SINYAL

ELEKTROKARDIOGRAM

Disusun Oleh :

Innocentio Aloysius Loe (0922045)

Jurusan Teknik Elektro, Fakultas Teknik Universitas Kristen Maranatha

Jl. Prof. Drg. Suria Sumantri 65, Bandung 40164, Indonesia

ABSTRAK

Protokol USB diimplementasikan pada pengontrol mikro yang sesungguhnya tidak mendukung komunikasi dengan protokol USB untuk keperluan akusisi data. Pengontrol mikro yang digunakan dalam rancangan sistem adalah Atmel AVR ATMEGA8 dengan basis firmware V-USB.

Pengujian dilakukan dengan instrumen elektrokardiogram (EKG) yang dirancang sendiri, dengan konfigurasi pengukuran Limb Lead (LL) II. Data yang didapat diolah untuk mengukur detak jantung menggunakan algoritma Pan-Tompkins. Sinyal EKG serta hasil pengukuran detak jantung ditampilkan pada suatu GUI (Graphical User Interface).

Hasil pengujian menunjukkan bahwa pengontrol mikro dapat dideteksi sebagai USB device. Dari pengujian didapat kecepatan transmisi maksimum 24 kbps dengan error rate 0%. Keluaran sinyal EKG pada GUI sesuai dengan hasil keluaran instrumen serta memiliki bentuk yang sesuai dengan bentuk umum sinyal EKG LL II.


(2)

ii

USB PROTOCOL IMPLEMENTATION ON ATMEGA8 MICROCONTROLLER FOR DATA ACQUISITION OF

ELECTROCARDIOGRAM SIGNAL

Composed by :

Innocentio Aloysius Loe (0922045)

Department of Electrical Engineering, Faculty of Engineering Maranatha Christian University

Jl. Prof. Drg. Suria Sumantri 65, Bandung 40164, Indonesia

ABSTRACT

USB protocol is implemented on a microcontroller which actually does not support USB protocol communication. The microcontroller used in the system design is Atmel AVR ATMEGA8, where V-USB is used as the base firmware.

The test is done with self-designed electrocardiogram (ECG) instrument using Limb Lead (LL) II configuration. The acquired data is processed to measure heart rate using Pan-Tompkins algorithm. Both the ECG signal and the measured heart rate are displayed on a GUI (Graphical User Interface).

The result shows that the microcontroller is able to be detected as a USB device. The maximum transmission rate is approximately 24 kbps with 0% error rate. The displayed ECG signal on the GUI matched the instrument output with waveforms that correspond to the common form of LL II ECG signal.


(3)

iii

DAFTAR ISI

HALAMAN JUDUL

LEMBAR PENGESAHAN

PERNYATAAN ORISINALITAS LAPORAN PENELITIAN PERNYATAAN PUBLIKASI LAPORAN PENELITIAN

ABSTRAK ... i

ABSTRACT ... ii

Kata Pengantar... iii

DAFTAR ISI ... iv

DAFTAR GAMBAR ... viii

DAFTAR TABEL... x

BAB 1 PENDAHULUAN ... 1

1.1. Latar Belakang ... 1

1.2. Rumusan Masalah ... 2

1.3. Tujuan Pembahasan ... 2

1.4. Batasan Masalah ... 2

1.5. Sistematika Penulisan ... 3

BAB 2 DASAR-DASAR UNIVERSAL SERIAL BUS (USB) ... 5

2.1. Arsitektur Protokol USB ... 5

2.1.1. Topologi Jaringan ... 5

2.1.2. USB Host ... 6

2.1.3. USB Device ... 7

2.1.4. Tipe Aliran Data ... 8

2.2. Enumerasi USB Device ... 8

2.3. Klasifikasi USB Device ... 11

2.4. Human Interface Device (HID) ... 12

2.4.1. Antarmuka HID ... 12

2.4.2. Device Descriptor HID ... 13

2.4.3. HID Descriptor ... 14


(4)

iv

2.5. Dasar Komunikasi USB ... 14

2.5.1. Spesifikasi Elektrik Komunikasi USB ... 14

2.5.2. Sistem Transasksi Paket ... 16

2.5.3. HID USB Request ... 18

2.6. HID Control Transfer ... 19

2.6.1. Enumeration Control Transfer ... 20

2.6.2. HID Report Transfer ... 21

2.7. V-USB Driver API ... 22

BAB 3 DASAR-DASAR ELEKTROKARDIOGRAM (EKG) ... 23

3.1. Terminologi Pokok ... 23

3.2. Fisiologi Jantung Manusia dalam Kaitannya dengan EKG ... 24

3.3. Cara Pengambilan Sinyal EKG ... 26

3.3.1. Mean-Electrical Axis ... 26

3.3.2. Aturan Pembacaan EKG ... 27

3.3.3. Sistem Limb Lead II ... 27

3.4. Pembacaan Sinyal EKG Limb Lead II ... 28

3.5. Masalah Umum dalam Perancangan Instumen EKG ... 30

3.5.1. Tegangan Common Mode ... 30

3.5.2. Baseline Wander dan Motion Artifact ... 31

3.5.3. Sumber-sumber Noise ... 31

3.5.4. Grounding dan Right Leg Drive (RLD) ... 32

3.5.5. Isolasi Sistem Penguat ... 33

BAB 4 PERANCANGAN DAN REALISASI ... 35

4.1. Rancangan Umum ... 35

4.1.1. Diagram Blok Sistem ... 35

4.1.2. Flowchart Sistem ... 36

4.2. Perancangan Instrumen Elektrokardiogram ... 37

4.2.1. Pemilihan Elektroda ... 37


(5)

v

4.2.3. Regulasi Arus dan Prefiltering ... 38

4.2.4. Instrumentation Amplifier ... 40

4.2.5. Penanggulangan Baseline Wander ... 41

4.2.6. Right Leg Drive dan Shield Driver ... 43

4.2.7. Penguat Tingkat Kedua ... 47

4.2.8. Notch Filter ... 48

4.3. Perancangan Protokol USB pada Pengontrol Mikro ATMEGA8 ... 49

4.3.1. Spesifikasi yang Ingin Dicapai ... 49

4.3.2. Perancangan Perangkat Keras ... 50

4.3.3. Device-Side Software ... 51

4.4. Host-side Software ... 58

4.4.1. Notch Filter Digital ... 59

4.4.2. Highpass Filter Digital ... 62

4.4.3. Pengukuran Laju Detak Jantung... 63

4.4.4. Transmisi Data ... 64

4.4.5. Graphical User Interface (GUI) ... 66

BAB 5 HASIL DAN ANALISIS ... 67

5.1. Hasil dan Analisis Protokol USB ... 67

5.1.1. Deteksi USB-ECG Sebagai HID ... 67

5.1.2. Laju Transmisi Data ... 68

5.1.3. Performansi Transmisi Data ... 69

5.2. Hasil dan Analisis Instrumen Elektrokardiogram ... 69

5.2.1. Rasio CMR ... 69

5.2.2. Respon Frekuensi Penguat ... 70

5.2.3. Impedansi Masukan Penguat ... 72

5.2.4. Sinyal EKG pada Keluaran Penguat ... 73

5.2.5. Sinyal Keluaran Filter Digital ... 77

5.2.6. Perhitungan Laju Detak Jantung ... 80


(6)

vi

BAB 6 PENUTUP ... 84 6.1. Kesimpulan ... 84 6.2. Saran ... 84

DAFTAR PUSTAKA

LAMPIRAN A : USB Device Descriptor LAMPIRAN B : HID Report Descriptor

LAMPIRAN C : Skematik dan PCB USB-ECG LAMPIRAN D : Listing Program


(7)

vii

DAFTAR GAMBAR

1. Gambar 2.1 Topologi Jaringan USB ... 6

2. Gambar 2.2 Skematik Konektor USB host ... 9

3. Gambar 2.3 Skema Low Speed dan High Speed USB Device ... 10

4. Gambar 2.4 Encoding NRZI ... 15

5. Gambar 2.5 Koneksi USB Low Speed Device ... 15

6. Gambar 3.1 Anatomi Jantung Manusia... 25

7. Gambar 3.2 Sistem mean-electrical axis ... 26

8. Gambar 3.3 Contoh skema pemasangan elektroda sistem Limb Lead II ... 28

9. Gambar 3.4 Contoh umum sinyal EKG Limb Lead II ... 29

10. Gambar 3.5 Model pengaruh jala-jala listrik dan stray capacitance ... 33

11. Gambar 3.6 Rangkaian ekuivalen common mode sistem Gambar 3.5 ... 34

12. Gambar 4.1 Diagram blok sistem analog ... 35

13. Gambar 4.2 Diagram blok sistem digital ... 36

14. Gambar 4.3 Flowchartsistem ... 36

15. Gambar 4.4 Elektroda 3M RedDot 2560 ... 37

16. Gambar 4.5 Model elektronika elektroda EKG ... 38

17. Gambar 4.6 Realisasi rangkaian prefilter keseluruhan ... 39

18. Gambar 4.7 Skematik INA114 ... 40

19. Gambar 4.8 Pengaturan penguatan pada INA114 ... 41

20. Gambar 4.9 Penggunaan integrator sebagai umpanbalik ... 42

21. Gambar 4.10 Aplikasi tegangan common mode untuk shield driver ... 43

22. Gambar 4.11 Rangkaian ekuivalen common mode sistem RLD ... 44

23. Gambar 4.12 Sistem RLD closed-loop ... 44

24. Gambar 4.13 Bode plot sistem RLD ... 45

25. Gambar 4.14 Realisasi rangkaian RLD... 46

26. Gambar 4.15 Sistem closed-loop RLD terkompensasi ... 46

27. Gambar 4.16 Bode plot sistem RLD terkompensasi ... 47

28. Gambar 4.17 Penguat tingkat kedua ... 47


(8)

viii

30. Gambar 4.19 Skematik perangkat keras ATMEGA8 ... 50

31. Gambar 4.20 Flowchart proses enumerasi USB device ... 55

32. Gambar 4.21 Flowchart Interrupt Service Routine INT0 ... 56

33. Gambar 4.22 Flowchart fungsi usbPoll ... 57

34. Gambar 4.23 Flowchart program utama device-side software ... 58

35. Gambar 4.24 Pergeseran frekuensi notch dari notch filter digital ... 60

36. Gambar 4.25 Notch filter digital dengan kompensasi model analog ... 60

37. Gambar 4.26 Respon frekuensi highpass filter digital ... 62

38. Gambar 4.27 Ilustrasi pemrosesan sinyal algoritma Pan-Tompkins ... 64

39. Gambar 4.28 Flowchart program host-side software ... 65

40. Gambar 4.29 Graphical User Interface (GUI) ... 66

41. Gambar 5.1 Deteksi USB-ECG sebagai HID ... 67

42. Gambar 5.2 Grafik rasio CMR ... 70

43. Gambar 5.3 Respon frekuensi penguat ... 71

44. Gambar 5.4 Impedansi masukan penguat ... 73

45. Gambar 5.5 Sinyal EKG diukur pada kondisi (a) ... 74

46. Gambar 5.6 Sinyal EKG dengan noise 50 Hz ... 75

47. Gambar 5.7 Sinyal noise 50 Hz muncul pada kondisi (b) ... 75

48. Gambar 5.8 Baseline wander akibat pernapasan ... 76

49. Gambar 5.9 Sinyal pada pengukuran kondisi (d) ... 76

50. Gambar 5.10 Respon frekuensi keseluruhan... 77

51. Gambar 5.11 Pengaruh filter digital pada kondisi (a) ... 78

52. Gambar 5.12 Pengaruh filter digital pada kondisi (b) ... 78

53. Gambar 5.13 Pengaruh filter digital pada kondisi (c) ... 79

54. Gambar 5.14 Pengaruh filter digital pada kondisi (d) ... 80

55. Gambar 5.15 Hasil implementasi algoritma Pan-Tompkins ... 80

56. Gambar 5.16 Hasil pengukuran laju detak jantung dalam BPM... 81


(9)

ix

DAFTAR TABEL

1. Tabel 2.1 Klasifikasi USB device berdasarkan device class ... 11

2. Tabel 2.2 Contoh Device Descriptor HID ... 13

3. Tabel 2.3 Format HID Descriptor ... 14

4. Tabel 2.4 PID Value yang mungkin pada Low-Speed USB Device... 16

5. Tabel 2.5 Penjelasan isi USB Request ... 18

6. Tabel 2.6 USB Request GET_DESCRIPTOR ... 19

7. Tabel 2.7 USB Request GET_REPORT ... 19

8. Tabel 4.1 Device Descriptor USB-ECG ... 51

9. Tabel 4.2 Configuration Descriptor USB-ECG ... 52

10. Tabel 4.3 Interface Descriptor USB-ECG ... 52

11. Tabel 4.4 HID Descriptor USB-ECG ... 53

12. Tabel 4.5 Report Descriptor USB-ECG ... 53

13. Tabel 5.1 Laju transmisi data USB-ECG ... 68

14. Tabel 5.2 Data pengukuran rasio CMR ... 69

15. Tabel 5.3 Data pengukuran respon frekuensi... 71

16. Tabel 5.4 Data pengukuran impedansi masukan penguat ... 72


(10)

1

Universitas Kristen Maranatha

BAB 1

PENDAHULUAN

Bab ini membahas tentang latar belakang masalah, perumusan masalah, tujuan pembahasan, batasan masalah, dan sistematika penulisan tugas akhir.

1.1. Latar Belakang Masalah

Perkembangan teknologi pengontrol mikro pada masa sekarang sangat pesat, sehingga dapat diaplikasikan dalam banyak bidang. Salah satu bidang yang umum menggunakan pengontrol mikro adalah instrumentasi (pengukuran).

Dalam bidang instrumentasi, pengontrol mikro umumnya digunakan dalam instrumen (alat ukur) untuk mengubah besaran terukur menjadi sinyal atau data digital. Terkadang data tersebut perlu diproses lebih lanjut di komputer (misal untuk ditampilkan dalam bentuk grafik, dicari hubungannya dengan data lain, dll.), sehingga dibutuhkan suatu cara pengiriman (transmisi) data dari pengontrol mikro ke komputer.

Protokol transmisi yang umum digunakan untuk komunikasi pengontrol mikro ke komputer adalah protokol serial. Pengontrol mikro memiliki protokol serial UART, sedangkan pada komputer terdapat protokol serial RS-232. Kecepatan transmisi protokol ini maksimum 250 kbps dengan penggunaan daya yang cukup besar (RS-232 membutuhkan tegangan positif dan negatif minimal 3 V).

Sejak protokol Universal Serial Bus (USB) dirilis pada tahun 1996, penggunaan protokol serial RS-232 maupun UART semakin jarang diperhitungkan dalam desain perangkat-perangkat keras. Protokol USB bisa dikatakan jauh lebih unggul dari RS-232 maupun UART dengan kecepatan transmisi hingga 480 Mbps dengan penggunaan daya yang jauh lebih kecil (maksimum 500 mW pada tegangan 5 V).

Desain motherboard komputer maupun notebook sekarang umumnya sudah tidak memiliki periferal serial RS-232 yang terintegrasi. Hanya tersedia konektor USB untuk komunikasi dengan perangkat keras lain. Hal ini mempersulit


(11)

BAB 1 PENDAHULUAN 2

Universitas Kristen Maranatha komunikasi pengontrol mikro dengan komputer karena tidak semua pengontrol mikro memiliki periferal USB.

Salah satu pemecahan masalah ini adalah hadirnya USB-to-Serial Converter sebagai antarmuka antara pengontrol mikro dengan komputer. Meskipun demikian penambahan alat tersebut ke dalam desain suatu instrumen juga menambah kebutuhan periferal serta biaya produksi. Dibutuhkan suatu cara sehingga pengontrol mikro dapat melakukan komunikasi USB secara langsung dengan komputer tanpa perlu menggunakan periferal tambahan dalam desain instrumen.

Dalam tugas akhir ini akan dirancang suatu instrumen elektrokardiogram (EKG) menggunakan pengontrol mikro Atmel AVR ATMEGA8 yang diharapkan dapat melakukan transmisi data secara langsung dengan komputer melalui komunikasi USB. Cara kerja protokol USB akan dipelajari dan kemudian diimplementasikan dalam pemrograman pengontrol mikro sehingga dapat dilakukan akuisisi data sinyal EKG ke dalam komputer.

1.2. Rumusan Masalah

Permasalahan yang dibahas dalam tugas akhir ini adalah “Bagaimana merancang instrumen EKG dengan sistem akuisisi data menggunakan protokol USB?”.

1.3. Tujuan Pembahasan

Tujuan pembahasan tugas akhir ini adalah “merealisasikan instrumen EKG dengan sistem akuisisi data menggunakan protokol USB”.

1.4. Batasan Masalah

Batasan masalah tugas akhir ini adalah sebagai berikut :

1. Pengontrol mikro yang digunakan adalah Atmel AVR ATMEGA8. 2. USB device yang dirancang merupakan class HID (Human Interface

Device), low-speed device.


(12)

BAB 1 PENDAHULUAN 3

Universitas Kristen Maranatha 4. Akuisisi sinyal EKG hanya menggunakan tiga elektroda dengan

konfigurasi Limb Lead II.

5. Analisa yang dilakukan terhadap sinyal EKG adalah pengukuran laju detak jantung saja.

1.5. Sistematika Penulisan

Laporan tugas akhir ini disusun dalam enam bab sebagai berikut :

1. BAB 1 PENDAHULUAN

Bab ini membahas tentang latar belakang masalah, perumusan masalah, tujuan pembahasan, batasan masalah, dan sistematika penulisan tugas akhir.

2. BAB 2 DASAR-DASAR UNIVERSAL SERIAL BUS (USB)

Bab ini membahas teori dasar protokol USB yang meliputi arsitektur, klasifikasi peralatan USB, Human Interface Device (HID), proses transfer data pada HID, serta firmware V-USB yang akan digunakan pada perancangan.

3. BAB 3 DASAR-DASAR ELEKTROKARDIOGRAM (EKG)

Bab ini membahas teori dasar elektrokardiogram yang meliputi terminologi dasar, fisiologi jantung, cara pengambilan sinyal, serta masalah-masalah yang sering terjadi dalam perancangan instrumen EKG.

4. BAB 4 PERANCANGAN DAN REALISASI

Bab ini membahas proses perancangan dan realisasi alat yang digunakan untuk melakukan akuisisi data sinyal elektrokardiogram serta penerapan protokol USB pada alat tersebut.


(13)

BAB 1 PENDAHULUAN 4

Universitas Kristen Maranatha 5. BAB 5 HASIL DAN ANALISIS

Bab ini berisi data pengamatan yang didapat dari hasil percobaan serta analisa terhadap data-data tersebut. Analisa meliputi perfoma transmisi data melalu protokol USB serta performansi instrumen dan algoritma pemrosesan sinyal yang telah dirancang dan direalisasikan.

6. BAB 6 PENUTUP

Bab ini berisi kesimpulan yang diperoleh dari hasil percobaan serta saran-saran yang dapat digunakan untuk acuan penelitian lebih lanjut.


(14)

84

Universitas Kristen Maranatha

BAB 6

PENUTUP

Bab ini berisi kesimpulan yang diperoleh dari hasil percobaan serta saran-saran yang dapat digunakan untuk acuan penelitian lebih lanjut.

6.1. Kesimpulan

Berdasarkan hasil dan analisa data yang didapat, diperoleh kesimpulan berikut :

1. Kecepatan transmisi data yang mencapai 23,79 kbit/s memungkinkan pengontrol mikro ATMEGA dengan firmware berbasis V-USB digunakan untuk akuisisi sinyal-sinyal frekuensi rendah.

2. Alat yang dirancang dapat digunakan untuk akuisisi data sinyal EKG dengan frekuensi sampling 200 Hz, sehingga hanya dapat digunakan untuk analisa laju detak jantung.

3. Instrumen EKG yang dirancang masih rentan terhadap sumber-sumber noise sehingga harus digunakan pada kondisi yang tepat.

6.2. Saran

Saran berikut dapat dijadikan bahan pertimbangan jika akan diadakan penelitian lebih lanjut :

1. Implementasi V-USB sebagai communication class device (CDC) untuk memungkinkan transmisi data yang lebih cepat.

2. Penggunaan process pipe untuk transfer data host software dengan GUI untuk meningkatkan kecepatan pemrosesan data.

3. Perancangan instrumen EKG yang lebih baik agar tahan terhadap gangguan-gangguan.


(15)

Daftar Pustaka

[1]

Technology and Applications

Kaur, Singh, Ubhi, & Rani. 2011. “Digital Filteration of ECG Signal for Removal of Baseline Drift”. International Conference on Telecommunication [2]

Kugelstadt, T. 2005. “Getting the most out of your instrumentation amplifier design”. Texas Instrument Analog Applications Journal

[3]

M.W. Hann. “Ultra Low Power, 18 bit Precision ECG Data Acquistion System”. Texas Instrument Precision Design

[4]

Merck, “Electrical Injuries”. 1997. Pennsylvania : Merck. [5]

Ogata, K. 1970. “Modern Control Engineering”. New Jersey : Prentice Hall [6]

Pan, J. Tompkins, W.J. 1985. “A Real-Time QRS Detection Algorithm”. IEEE Transactions on Biomedical Engineering

[7]

Townsend, Neil. 2001. “Medical Electronics” [8]

USB.org. 2000. “Universal Serial Bus Spesification”. USB.org [9]

USB.org. 2001. “Device Class Definition for Human Interface Devices (HID)”. USB.org

[10]

Van Valkenburg, M.E. 1982. “Analog Filter Design”. Oxford University Press

[11]

Winter, B.B. Webster, J.G. 1983. “Driven-Right-Leg Circuit Design”. IEEE Transactions on Biomedical Engineering


(16)

Lampiran A : USB Device Descriptor

Device Descriptor

Item Keterangan

bLength Panjang device descriptor, selalu 18 byte bDescriptorType Tipe 1 (device descriptor)

bcdUSB Versi USB (1.0, 1.1, atau 2.0) dala m BCD bDeviceClass Nilai tergantung pada kelas device

bDeviceSubClass Perincian kelas device bDeviceProtocol Kualifikasi kelas device bMaxPacketSize Jumlah data paket maksimum idVendor Identifikasi pembuat USB

idProduct Identifikasi produk USB berdasarkan pembuat bcdDevice Seri device dalam BCD

iManufacturer String descriptor pembuat USB iProduct String descriptor produk USB iSerialNumber String descriptor seri device bNumConfigurations Jumlah configuration descriptor

Configuration Descriptor

Item Keterangan

bLength Panjang configuration descriptor, selalu 9 byte bDescriptorType Tipe 2 (configuration descriptor)

wTotallength Panjang keseluruhan device descriptor bNumInterfaces Jumlah antarmuka yang didukung

bConfigurationValue Nilai untuk argumen request SET_CONFIG iConfiguration Indeks untuk string descriptor

bmAttributes Sifat khusus konfigurasi

bMaxPower Arus maksimum pada USB bus

Interface Descriptor

Item Keterangan

bLength Panjang interface descriptor, selalu 9 byte bDescriptorType Tipe 4 (interface descriptor)

bInterfaceNumber Indeks antarmuka

bAlternateSetting Aturan khusus pada antarmuka

bNumEndpoints Jumlah endpoint yang digunakan antarmuka bInterfaceClass Serupa dengan device descriptor

bInterfaceSubClass Serupa dengan device descriptor bInterfaceProtocol Serupa dengan device descriptor


(17)

Lampiran B : HID Report Descriptor

Report Descriptor disusun berdasarkan aturan USB.org, yang tersusun atas tiga tipe item : Main, Global, dan Local. Main item meliputi Input, Output, Feature, Collection, dan End Collection. Global dan Local item menjelaskan properti Main item.

Contoh di bawah adalah HID Report Descriptor dari USB-ECG. Mengingat ada banyak sekali konten report descriptor, maka pada bagian ini hanya diberikan satu contoh saja. Rincian lengkap dari HID report descriptor dapat dilihat pada http://www.usb.org/developers/hidpage.

0x06, 0x00, 0xFF, // USAGE_PAGE (Vendor Defined Page 1); Global Item 0x09, 0x01, // USAGE (Vendor Usage 1); Local Item

0xA1, 0x01, // COLLECTION (Application); Main Item 0x15, 0x00, // LOGICAL_MINIMUM (0); Global Item 0x26, 0xFF, 0x00, // LOGICAL_MAXIMUM (255); Global Item 0x75, 0x08, // REPORT_SIZE (8); Global Item

0x95, 0x02, // REPORT_COUNT (2); Global Item 0x09, 0x00, // USAGE (Undefined) ; Local Item

0xB2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf); Main Item 0xC0 // END_COLLECTION (Application); Main Item

Karena USB-ECG adalah custom device, maka digunakan USAGE dan USAGE PAGE yang bersifat Vendor Defined. COLLECTION menandakan awal dari suatu report data. Nilai report dibatasi dari 0 hingga 255.

Panjang report 8 bit, dengan count 2. Artinya dalam satu kali transmisi, report buffer berisi 16 bit data. Karena fungsinya tidak spesifik, maka diberi USAGE Undefined. Tipe report adalah FEATURE (bidirectional). END COLLECTION menandakan akhir dari report data.


(18)

Lampiran C : Skematik dan PCB USB-ECG


(19)

2) Realisasi Alat

3) Tes Alat

Hasil monitoring pada subyek, dilihat pada osiloskop dan GUI

USB-ECG


(20)

Lampiran D : Listing Program

1)

Device-side Software

#include <avr/io.h> #include <avr/wdt.h>

#include <avr/interrupt.h> #include <util/delay.h> #include <avr/pgmspace.h> #include "usbdrv.h"

#include "func_init.h"

/*---USB INTERFACE---*/ PROGMEM const char usbHidReportDescriptor[22] = { //22

0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1)

0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255) 0x75, 0x08, // REPORT_SIZE (8)

0x95, 0x02, // REPORT_COUNT (2) 0x09, 0x00, // USAGE (Undefined)

0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf) 0xc0 // END_COLLECTION

};

static uchar bytesRemaining;

static int adc_w; static uchar adc_h; static uchar adc_l;


(21)

usbMsgLen_t usbFunctionSetup(uchar data[8]) {

usbRequest_t *rq = (void *)data;

if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) { /* HID class request */

if(rq->bRequest == USBRQ_HID_GET_REPORT) { bytesRemaining = 2;

return USB_NO_MSG; }

}

return 0; }

uchar usbFunctionRead(uchar *data, uchar len) {

if(len > bytesRemaining) len = bytesRemaining; bytesRemaining -= len; *(data) = adc_h;

*(data+1) = adc_l;

return len;

}

/*---MAIN LOOP---*/ int main(void) {

uchar i;

wdt_enable(WDTO_1S); usbInit();

usbDeviceDisconnect(); i = 0;

while(--i) { wdt_reset(); _delay_ms(1); }


(22)

adc_init(); sei(); for(;;) {

wdt_reset(); usbPoll();

adc_w = read_adc(); adc_h = (adc_w >> 8); adc_l = adc_w & 0xff; }

return 0; }

/* --- */

2)

Host-side Software

#include <stdlib.h> #include <string.h> #include <time.h> #include "hiddata.h"

#include "../firmware/usbconfig.h" #include "stdafx.h"

/*Kalau ada Error*/

static char *usbErrorMessage(int errCode) {

static char buffer[80]; switch(errCode) {

case USBOPEN_ERR_ACCESS: return "Access to device denied"; case USBOPEN_ERR_NOTFOUND: return "Specified device not found"; case USBOPEN_ERR_IO: return "Communication error with

device";

default: sprintf(buffer, "Unknown USB error %d", errCode);

return buffer; }

return NULL; /* not reached */ }


(23)

/*Cari USB Device dengan VID dan PID yang sesuai*/ static usbDevice_t *openDevice(void)

{

usbDevice_t *dev = NULL;

unsigned char rawVid[2] = {USB_CFG_VENDOR_ID}, rawPid[2] = {USB_CFG_DEVICE_ID};

char vendorName[] = {USB_CFG_VENDOR_NAME, 0}, productName[] = {USB_CFG_DEVICE_NAME, 0};

int vid = rawVid[0] + 256 * rawVid[1]; int pid = rawPid[0] + 256 * rawPid[1]; int err;

if((err = usbhidOpenDevice(&dev, vid, vendorName, pid, productName, 0)) != 0) {

fprintf(stderr, "1. Error finding %s: %s\n", productName, usbErrorMessage(err));

return NULL; }

else {

fprintf(stderr, "2. No Error\n"); return dev;

} }

static int data_buff, bpm_buffer;

static void DataDump(char *buffer) {

data_buff = (unsigned int)buffer[0]*256 + (unsigned int)buffer[1]; data_buff = Filter(data_buff);

bpm_buffer = PanTom(data_buff);

fprintf(stdout,"%d\n",data_buff); }


(24)

int main(int argc, char **argv) { clock_t start;

usbDevice_t *dev; char buffer[3]; int err;

if(argc < 2) { exit(1); }

if((dev = openDevice()) == NULL) exit(1);

int len = sizeof(buffer);

if(strcasecmp(argv[1], "read") == 0) { start = clock();

while(1) {

if (difftime(clock(),start) >= 5) {

if((err = usbhidGetReport(dev, 0, buffer, &len)) == 0) { DataDump(buffer + 1);

BPM_count(bpm_buffer); }

start = clock(); }

} }

usbhidCloseDevice(dev); return 0;


(25)

3)

Graphical User Interface

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading; using System.IO; using System.Diagnostics; using System.Windows.Forms; namespace USB_ECG_v10 {

public partial class Form1 : Form { public Form1() { InitializeComponent(); }

public Pen drawPen;

public Bitmap imgGraph; public Graphics gpcGraph; public GraphicsPath gpcPath; public bool IsStarted, IsRec;

public int x0, y0, xt, yt, x_null, y_null; public int x_scale, y_scale, bpm;

public String bpm_buffer;

private void Form1_Load(object sender, EventArgs e) {

drawPen = new Pen(Color.Yellow); drawPen.Width= 2;

imgGraph = new Bitmap(pb_Graph.Width,pb_Graph.Height); pb_Graph.Image = imgGraph

gpcGraph = Graphics.FromImage(imgGraph); gpcPath = new GraphicsPath();

x0 = 0; xt = 0; y0 = 0; yt = 0;

x_null = pb_Graph.Width; y_null = pb_Graph.Height/2; x_scale = 0;

y_scale = 3;


(26)

private void bt_Start_Click(object sender, EventArgs e) { if (!IsStarted) { if (proc.Start()) {

IsStarted = true;

proc.BeginErrorReadLine(); proc.BeginOutputReadLine(); } } if (!IsRec) {

bt_Start.Text = "STOP MONITORING"; bt_Start.ForeColor = Color.Red; IsRec = true; }

else {

bt_Start.Text = "START MONITORING"; bt_Start.ForeColor = Color.Black; IsRec = false;

}

}

private void outputData(object sender, DataReceivedEventArgs e) {

if (IsRec) {

if (String.IsNullOrEmpty(e.Data) == false) {

new Thread(() => {

this.label1.Invoke(new Action(() => {

if (e.Data.StartsWith("#") == false) {

if (xt == pb_Graph.Width) {

x0 = 0; xt = 1;

gpcPath.Reset(); }

else {

x0 = xt; xt++; }

y0 = yt;

yt = Convert.ToInt16(e.Data);


(27)

gpcPath.AddLine(x0 >> x_scale,

y_null - (y0 >> y_scale), xt >> x_scale,

y_null - (yt >> y_scale)); gpcGraph.Clear(Color.Transparent); gpcGraph.DrawPath(drawPen, gpcPath); pb_Graph.Refresh(); } else {

bpm_buffer = e.Data.Substring(1); lbl_BpmCount.Text = bpm_buffer; bpm = Convert.ToInt16(bpm_buffer); if (bpm > 110) {

lbl_Brady.Visible = false; lbl_Tachy.Visible = true; lbl_Asystole.Visible = false; } else if (bpm < 60) {

lbl_Brady.Visible = true; lbl_Tachy.Visible = false; lbl_Asystole.Visible = false; } else if (bpm == 0) {

lbl_Brady.Visible = false; lbl_Tachy.Visible = false; lbl_Asystole.Visible = true;

} else {

lbl_Brady.Visible = false; lbl_Tachy.Visible = false; lbl_Asystole.Visible = false;

} } })); }).Start(); } } }

private void errorData(object sender, DataReceivedEventArgs e) {

if (e.Data.StartsWith("1")) {

if (MessageBox.Show("An error has occured. Reconnect USB- ECG and restart the application!", "Error",

MessageBoxButtons.OK, MessageBoxIcon.Error) ==

DialogResult.OK) IsStarted = false; proc.CancelErrorRead();

bt_Start.Text = "START MONITORING"; bt_Start.ForeColor = Color.Black; IsRec = false;

proc.CancelOutputRead(); }


(28)

else {

proc.CancelErrorRead(); IsRec = true;

} }

private void Form1_FormClosing(object sender, FormClosingEventArgs e) {

if (IsStarted && proc.HasExited == false)

{

proc.CancelOutputRead();

proc.Kill();

} }

} }

Source code lengkap dengan linker dependencies dapat diakses pada CD Tugas Akhir.


(1)

/*Cari USB Device dengan VID dan PID yang sesuai*/ static usbDevice_t *openDevice(void)

{

usbDevice_t *dev = NULL;

unsigned char rawVid[2] = {USB_CFG_VENDOR_ID}, rawPid[2] = {USB_CFG_DEVICE_ID};

char vendorName[] = {USB_CFG_VENDOR_NAME, 0}, productName[] = {USB_CFG_DEVICE_NAME, 0};

int vid = rawVid[0] + 256 * rawVid[1]; int pid = rawPid[0] + 256 * rawPid[1]; int err;

if((err = usbhidOpenDevice(&dev, vid, vendorName, pid, productName, 0)) != 0) {

fprintf(stderr, "1. Error finding %s: %s\n", productName, usbErrorMessage(err));

return NULL; }

else {

fprintf(stderr, "2. No Error\n"); return dev;

} }

static int data_buff, bpm_buffer;

static void DataDump(char *buffer) {

data_buff = (unsigned int)buffer[0]*256 + (unsigned int)buffer[1]; data_buff = Filter(data_buff);

bpm_buffer = PanTom(data_buff); fprintf(stdout,"%d\n",data_buff);


(2)

int main(int argc, char **argv) { clock_t start;

usbDevice_t *dev; char buffer[3]; int err;

if(argc < 2) { exit(1); }

if((dev = openDevice()) == NULL) exit(1);

int len = sizeof(buffer);

if(strcasecmp(argv[1], "read") == 0) { start = clock();

while(1) {

if (difftime(clock(),start) >= 5) {

if((err = usbhidGetReport(dev, 0, buffer, &len)) == 0) { DataDump(buffer + 1);

BPM_count(bpm_buffer); }

start = clock(); }

} }

usbhidCloseDevice(dev); return 0;


(3)

3)

Graphical User Interface

using System;

using System.Collections.Generic; using System.ComponentModel; using System.Data;

using System.Drawing;

using System.Drawing.Drawing2D; using System.Linq;

using System.Text; using System.Threading; using System.IO;

using System.Diagnostics; using System.Windows.Forms;

namespace USB_ECG_v10 {

public partial class Form1 : Form {

public Form1() {

InitializeComponent(); }

public Pen drawPen;

public Bitmap imgGraph; public Graphics gpcGraph; public GraphicsPath gpcPath; public bool IsStarted, IsRec;

public int x0, y0, xt, yt, x_null, y_null; public int x_scale, y_scale, bpm;

public String bpm_buffer;

private void Form1_Load(object sender, EventArgs e) {

drawPen = new Pen(Color.Yellow); drawPen.Width= 2;

imgGraph = new Bitmap(pb_Graph.Width,pb_Graph.Height); pb_Graph.Image = imgGraph

gpcGraph = Graphics.FromImage(imgGraph); gpcPath = new GraphicsPath();

x0 = 0; xt = 0; y0 = 0; yt = 0;

x_null = pb_Graph.Width; y_null = pb_Graph.Height/2; x_scale = 0;

y_scale = 3;


(4)

private void bt_Start_Click(object sender, EventArgs e) {

if (!IsStarted) {

if (proc.Start()) {

IsStarted = true;

proc.BeginErrorReadLine(); proc.BeginOutputReadLine(); }

}

if (!IsRec) {

bt_Start.Text = "STOP MONITORING"; bt_Start.ForeColor = Color.Red; IsRec = true; }

else {

bt_Start.Text = "START MONITORING"; bt_Start.ForeColor = Color.Black; IsRec = false;

}

}

private void outputData(object sender, DataReceivedEventArgs e) {

if (IsRec) {

if (String.IsNullOrEmpty(e.Data) == false) {

new Thread(() => {

this.label1.Invoke(new Action(() => {

if (e.Data.StartsWith("#") == false) {

if (xt == pb_Graph.Width) {

x0 = 0; xt = 1;

gpcPath.Reset(); }

else {

x0 = xt; xt++; }

y0 = yt;

yt = Convert.ToInt16(e.Data);


(5)

gpcPath.AddLine(x0 >> x_scale,

y_null - (y0 >> y_scale), xt >> x_scale,

y_null - (yt >> y_scale)); gpcGraph.Clear(Color.Transparent);

gpcGraph.DrawPath(drawPen, gpcPath); pb_Graph.Refresh();

}

else {

bpm_buffer = e.Data.Substring(1); lbl_BpmCount.Text = bpm_buffer; bpm = Convert.ToInt16(bpm_buffer);

if (bpm > 110) {

lbl_Brady.Visible = false; lbl_Tachy.Visible = true; lbl_Asystole.Visible = false; } else if (bpm < 60) {

lbl_Brady.Visible = true; lbl_Tachy.Visible = false; lbl_Asystole.Visible = false; } else if (bpm == 0) {

lbl_Brady.Visible = false; lbl_Tachy.Visible = false; lbl_Asystole.Visible = true;

} else {

lbl_Brady.Visible = false; lbl_Tachy.Visible = false; lbl_Asystole.Visible = false;

} } })); }).Start(); }

} }

private void errorData(object sender, DataReceivedEventArgs e) {

if (e.Data.StartsWith("1")) {

if (MessageBox.Show("An error has occured. Reconnect USB- ECG and restart the application!", "Error",

MessageBoxButtons.OK, MessageBoxIcon.Error) ==

DialogResult.OK) IsStarted = false;

proc.CancelErrorRead();

bt_Start.Text = "START MONITORING"; bt_Start.ForeColor = Color.Black; IsRec = false;

proc.CancelOutputRead(); }


(6)

else {

proc.CancelErrorRead(); IsRec = true;

} }

private void Form1_FormClosing(object sender, FormClosingEventArgs e) {

if (IsStarted && proc.HasExited == false) {

proc.CancelOutputRead(); proc.Kill(); }

} } }

Source code lengkap dengan linker dependencies dapat diakses pada CD Tugas