abant izzet baysal üniversitesi mühendislik mimarlık
Transkript
abant izzet baysal üniversitesi mühendislik mimarlık
ABANT İZZET BAYSAL ÜNİVERSİTESİ MÜHENDİSLİK MİMARLIK FAKÜLTESİ ARDUINO GÖMÜLÜ SİSTEMLERİYLE PPG SİNYALİNİN ELDE EDİLMESİ VE KALP HIZI ORANININ TESPİT EDİLMESİ Onur YOLAL LİSANS BİTİRME TEZİ ELEKTRİK-ELEKTRONİK MÜHENDİSLİĞİ BOLU, 2014 DANIŞMAN ONAY Bu tez çalışması Abant İzzet Baysal Üniversitesi Mühendislik Mimarlık Fakültesi Elektrik-Elektronik Mühendisliği Bölümü Mühendislik Tasarımı I-II dersleri kapsamında hazırlanmıştır. Lisans Bitirme Tezi olarak uygun bulunmuştur. Tez Danışmanı Doç. Dr. Kemal POLAT Tarih: İmza: ARDUINO GÖMÜLÜ SİSTEMLERİYLE PPG SİNYALİNİN ELDE EDİLMESİ VE KALP HIZI ORANININ TESPİT EDİLMESİ Onur YOLAL Anahtar Kelimeler: Arduino, Gömülü Sistem, Kan, Fotopletismografi, Biyomedikal Özet: Kandaki oksijen miktarının ölçülmesi gerektiğinde insan vücudunun kan dokusuna doğrudan erişmeden (noninvaziv) ölçüm alınmasında bir metot olarak kullanılan Fotopletismografi sinyallerinin ölçümünü Arduino gömülü sistemleri üzerinde sağlamak ve elde edilen bu sinyaller doğrultusunda donörün bir dakikadaki toplam kalp atım hızını elde etmek bu çalışmamızın amacıdır. Birçok doku ve organ yeterli oksijeni kan dokusundan alamazsa vücutta geri dönülemez zararlar oluşabilir ve oksijen yetersizliğinde kalp, karaciğer ve böbrekler kalıcı olarak zarar görebilir. Bu sebepten ötürü kan ile doğrudan temas etmeden hastanın kan değerleri hakkında hızlı ve pratik bilgi edinilebilinirse alınan örnekler hayat kurtarıcı olabilecektir. Kullanışlı yapıları sayesinde Arduino gömülü sistemleri tercih edilmiştir. Hem hızlı bir işlemci hem de tüm devre çıkışlarındaki çeşit sebebiyle bu gömülü devreler tercih edilmiştir. Tüm hastalara uygulanabilir ve gerçek zamanda kan değerleri hakkında hızlı ve net bilgi sahibi olunabilir. Fotopletismografi sinyallerinin elde edilmesinde yazılım temelli algoritmalar kullanılır ve bu değerlerin yorumlanması üzerinde bazı özel algoritmalar kullanılmaktadır. ii DISPLAYING HEART RATE USING ARDUINO EMBEDDED SYSTEMS AND PPG SIGNALS Onur YOLAL Keywords: Arduino, Embedded System, Blood, Photopletismography, Biomedical Absract: When measuring the amount of oxygen from blood is necessary in order to predict body's situation noninvasivly, photophletismography measurement is a method to measure Photoplethysmography signals of measuring Arduino embedded systems provide over and the thus obtained signal in accordance with the donor's one minute total heart rate to achieve the purpose of this study is. If tissues and organs in the body does not receive enough oxygen from the blood, tissue and/or organs may get damaged and the lack of oxygen in the heart, liver and kidneys could be permanently damaged for human beings. For this reason, blood obtaining from patient's blood gives us an information about the values taken thus a very fast and practical measuring would be life saving. And thanks to a handy Arduino embedded systems is preferred. Arduino kits have fast processor and a lot of circuit output points. That’s why we preferred. With using Arduino kits, patient’s blood values can be measurable in real time, this may provide quick and precise information. Photoplethysmography signal measuring depends on the preparation of software algorithms based on the interpretation of these values will be used, especially some specific algorithms will be used. Signal samples taken from patients to be obtained and specific formulations will be applied. ii ÖNSÖZ ve TEŞEKKÜR Günümüzde biyomedikal konusu ile ilgili zor problemlerle karşılaşılmaktadır. Bu problemlerin çözümünde kullanılan yaklaşımlar ise belli derecelerde yetersiz kalmaktadır. İnsanların günlük hayatlarında sağlıkları hakkında anlık bilgi sahibi olmak istemeleri ile ortaya çıkan sağlık durumlarının anlık takibi ve izlenmesi dikkat çeken konuların arasında gelmektedir. Sağlık sektörünün hayatımızdaki yerini düşünürsek bu türde ihtiyaçların karışılanması için kullanılan sistemlerin var olduklarını çok rahat bir şekilde söyleyebiliriz. Bu sistemlerin hızlı bir şekilde gelişmesindeki en önemli sebeplerden biri kuşkusuz üretim teknolojisindeki gelişmelere paralel olarak elektronik devre ve sistemlerinin sağlık alanına sağladığı katma değer, tasarruf ve esnekliktir. Fotopletismografi (Kısaca PPG) sinyallerinin elde edilmesinde kullanılan aktif devre elemanları ve elektronik devrelerden oluşan devre kartları sayesinde biyomedikal sinyaller elde edilirken band geçiren filtreler tasarlanarak frekans bandı genellikle iki bileşene bölünmektedir. 0.4Hz ile 0.15Hz arası alçak geçiren, 0.15Hz ve 0.6Hz arası yüksek geçiren filtre yapıları birlikte kullanılmaktadır. Dolayısıyla, PPG sinyallerinin gürültü sinyallerinden ayırt edilebilmesi için uygun frekans aralık değerlerini geçirebilecek filtre yapıları aktif devre elemanlarıyla tasarlanmaktadır. Bu tasarımın zahmetli olduğunu bu yolda çalışmaya başlayınca doğrudan fark edebiliyoruz. Özellikle tasarlanan devrenin hızı, çözünürlüğü, band genişliği, kapladığı alan, harcadığı güç, dinamik ve statik parametreleri oldukça önemlidir. Tasarım yaparken bunların hepsi birden düşünülmektedir. Bu yüzden analog tasarım yapmak oldukça zor bir iştir. Bu çalışmamızda algoritma tabanlı olarak Arduino IDE üzerinde ve Processing üzerinde kod geliştirerek bu analog tasarımın zahmetini en aza indirmekteyiz. Türkiye’de biyomedikal özellikte cihazların üretilmesi için kullanılan tümleşik devre tasarımları üzerine yapılan çalışmalar diğer konulara göre oldukça az sayıdadır. Bu yüzden yapılan bu çalışmanın ileride bu tür çalışma yapacak olanlara yardımcı olacağına inanıyorum. Bu çalışma adına hiçbir zaman beni yalnız bırakmayan, bilgi ve birikimleri ile beni yönlendirip çalışmalarımın mükemmel olmasında katkısı olan sayın hocam Doç. Dr. Kemal POLAT’a çok teşekkür ederim. Beni bu zamanlara getiren, her zaman ve her koşulda beni destekleyen, sevgilerini hiç esirgemeyen anneme, babama ve abime çok teşekkür ederim. İÇİNDEKİLER ÖZET ................................................................................................................ ii ABSTRACT ........................................................................................................... iii ÖNSÖZ ve TEŞEKKÜR .......................................................................................... iv İÇİNDEKİLER ........................................................................................................ vi SİMGELER DİZİNİ ve KISALTMALAR .............................................................. xv ŞEKİLLER LİSTESİ ............................................................................................ xvii TABLOLAR DİZİNİ .............................................................................................. xx 1. GİRİŞ ................................................................................................................. 1 1.1. Hemoglobin .................................................................................................. 1 1.2. Hemoglobinle Bağ Yapmış Oksijenin Ölçüm Teknikleri ............................... 1 1.2.1. Fotopletismografi (Photopletismography – PPG) ................................... 1 1.2.2. Darbe Oksimetresi ................................................................................. 2 1.3. Amaçlar ve Hedef.......................................................................................... 3 1.4. Tezin Organizasyonu ..................................................................................... 3 2. GERÇEKLEŞTİRİLEN SİSTEM.......................................................................... 4 2.1. Darbe Oksimetresi ve Sensör Devre Kartı...................................................... 5 2.2. Arduino ....................................................................................................... 10 2.3. Bilgisayar Ortamı ........................................................................................ 16 2.4. Processing ................................................................................................... 17 2.5. Sonuçlar ...................................................................................................... 20 3. SONUÇ .............................................................................................................. 24 3.1. Öneriler ....................................................................................................... 25 KAYNAKLAR ....................................................................................................... 26 EKLER ............................................................................................................... 27 ÖZGEÇMİŞ............................................................................................................ 28 SİMGELER VE KISALTMALAR DİZİNİ IEEE INL LSB MSB PPG ROM VLSI HbO2 AC DC WIFI LED : Instute of Electrical and Electronical Engineers : Integral Non-Linearity—Tümlevsel Doğrusalsızlık : Least Significant Bits—En Değerliksiz Bit : Most Significant Bits—En Değerlikli Bit : Photoplethysmogram : Read Only Memory—Salt Okunur Bellek : Very Large Scale Integration : Oksijenli Hemoglobin : Alternatif Akım : Doğru Akım : Wireless Fidelity – Kablosuz Ağ : Light Emitted Diode – Işık emilimli diyot ŞEKİLLER DİZİNİ Şekil 1.1: Parmağın çeşitli bölgelerinden geçen ışınlar ............................................. 2 Şekil 2.1: Blok şeması.............................................................................................. 4 Şekil 2.2: Parmağa yerleştirilebilen kıskaçlı darbe oksimetresi ................................. 5 Şekil 2.3: Sensörün şematik gösterimi ...................................................................... 6 Şekil 2.4: Osiloskop ekranında görüntülenen PPG sinyali ........................................ 7 Şekil 2.5: PPg sinyalinin üretilmesini sağlayan devre kartı ....................................... 8 Şekil 2.6: Parmaktan sinyal elde edilmesini sağlayan harici bileşen.......................... 9 Şekil 2.7: Parmak ile uyumlu harici bileşen kauçuk profili ....................................... 9 Şekil 2.8: Arduino Mega 2560 ............................................................................... 11 Şekil 2.9: Arduino Mega 2560 ve Wi-Fi Katmanının Birleştirilmesi....................... 13 Şekil 2.10: Arduino IDE üzerinden geliştirilen kod satırları ................................... 15 Şekil 2.11: Arduino Mega 2560’ın bilgisayarda tanımlanması ................................ 16 Şekil 2.12: Launch4j başlangıç hatası Bluetooth bileşeninden kaynaklıdır .............. 17 Şekil 2.13: Processing logosu ve bazı örnekleri ...................................................... 18 Şekil 2.14: Processing çizim alanında PPG sinyalleri ve kalp atış oranı .................. 19 Şekil 2.15: Hem osiloskopta hem de Processing ile bilgisayarda sinyaller .............. 22 Şekil 2.16: PPG sinyallerinin eldesindeki devre kartının şeması ............................. 23 Şekil 3.1: Xively üzerinde PPG sinyalinin görüntülenmesi (WIFI Shield) .............. 25 TABLOLAR DİZİNİ Tablo 2.2: On farklı kişiden alınan ölçümler .................................................. 24 1. GİRİŞ 1.1. Hemoglobin Canlı vücudunda kan dokusu içerisinde yer alan hemoglobinin büyük bir kısmı oksijen taşımaya yarayan formdadır. Fonksiyonel hemoglobin, oksijen taşıma kapasitesine sahip olan hemoglobindir ve oksihemoglobin adı verilen oksijene bağlı hemoglobini (Oksijenli hemoglobin, HbO2) içerir. Oksijeni taşıma kapasitesine sahip olmayan hemoglobine disfonksiyonel hemoglobin (dishemoglobin) adı verilir. Normal şartlar altında oksijenli hemoglobin kandaki toplam hemoglobinin %99’u olarak ölçülür. [1] 1.2. Hemoglobinle Bağ Yapmış Oksijenin Ölçüm Teknikleri 1.2.1. Fotopletismografi (Photopletismography-PPG) Fotopletismografi (PPG), canlı vücudunun cilt yüzeyinde seçilen bir test bölgesinde akan kanın deriye yakın bölgelerinden alınan ve kan dokusu hakkında bilgi veren noninvaziv türde, elektro-optik bir metottur. Bu metoda göre yerleştirilen fotopletismografi düzenekleriyle ölçümlenen fotopletismografi sinyalleri vücudun ilgili bölgesini aydınlatmak suretiyle deriden geri yansıyan ya da iletimi sağlanan ışık taneciklerinin yakalanmasıyla elde edilir. PPG’yi elde etmek için parmağın veya kulağın bir tarafına dalga boyu λ olan bir ışık kaynağı, diğer tarafına kaynağın tam karşısına iletilen ışığı yakalayacak şekilde ayarlanmış fotodedektör yerleştirilir. Tipik bir PPG sinyali kan damarlarının içinden geçmeden deri, kas ve kemikten geçen büyük bir DC bileşenden, deri, kas ve kemikten ayrılarak doğrudan kan damarlarından geçen küçük bir AC bileşenden ve arteriyel kan damarlarından da geçen ışıktan meydana gelen kalp atımının frekansındaki bileşenden meydana gelir. Kalbin sistolik hareketi meydana geldikten hemen sonra atardamarlardaki kan miktarı artar ve böylece PPG için alınan ışık şiddeti de düşer. Diyastol boyunca damarlardaki kan miktarı azalır ve ışık iletiminde bir artış görülür. Temel bir ölçüm bölgesinde sinyalin %99’u deri, kas ve kemikten, %0,9’u toplardamardan, %0,1’i 1 atardamarlardan gelir. Parmağın çeşitli bölgelerinden geçen ışık seviyeleri şekil 1.1’de gösterilmiştir. Darbe oksimetresi metodunda biri kırmızı diğeri kızılötesi bölgede olan iki PPG sinyali kullanılarak oksijen saturasyonu seviyesi noninvaziv olarak elde edilir [7]. Şekil 1.1: Parmağın çeşitli bölgelerinden geçen ışınlar 1.2.2. Darbe Oksimetresi Darbe oksimetresi kandaki oksijen saturasyonunun devamlı ve noninvaziv olarak ölçümüdür. Bu pratik yöntem genellikle kişisel gözlemler ile saptanamayan arteriyel hipokseminin erken fark edilmesini sağlar. Darbe oksimetresi cihazının temel işlevi bir kişinin kanındaki oksijen doygunluğunun belirlenmesidir. Bir hemoglobin maksimum dört tane oksijene bağlanabilir. Darbe oksimetresi cihazları uyku apnesi ve solunum hastalıklarının teşhisinde kullanılır. Örneğin; astım, kronik bronşit, amfizem, konjestif kalp yetmezliği ve pulmoner ödemi gibi hastalıklarda kullanılır [1]. 2 Literatürde, darbe oksimetresi ile birçok çalışma yapılmıştır. Bunlar arasında, Reddy ve arkadaşlarının yaptığı çalışmada darbe oksimetresinin temellerinden, fotoelektrik pletismografi ile olan ilişkisinden bahsedilmiştir. [3] Reddy ve arkadaşlarının diğer bir çalışmasında ise ilk çalışmada kullanılan kalibrasyon eğrisi bırakılarak emilim katsayıları ile hesaplama yapılmıştır.[4] Shafique ve arkadaşlarının çalışmasında 20 hasta insanla deney yapılmış ve bütün darbe oksimetresi çeşitleri için sonuçlar karşılaştırılmıştır.[5] Adochiei ve arkadaşlarının çalışmasında RF teknolojisi kullanılarak wireless darbe oksimetresi tasarlanmıştır. Ayrıca WiFi veya GSM/GPRS teknolojisi kullanılarak telemonitörize edilmiştir.[6] Kandaki ışık emilim miktarı bu moleküllerin sayısı arasındaki farkı görmeyi sağlar. Bu amaçla darbe eklimetrelerinde genel olarak red (kırmızı) ve IR (kızılötesi) ışınları kullanılır. Normal koşullar altında arteriyel kan %97 oksijen ile doymuştur. Sağlıklı bir insanda oksijen saturasyonu %95 ile %100 arasında değişir. 1.3. Amaçlar ve Hedef Bu çalışmanın ana amacı kalp hızı oranının elde edilmesinde kullandığımız PPG sinyalinin elde edildiği devre tasarımının çıkışını Arduino Gömülü Sistem devrelerine giriş olarak aktarıp sinyal değerlerinin mikroişlemci tarafından okunarak Arduino gömülü devresinden seri haberleşme çıkışı olarak alınıp Processing programı tarafından seri porttan okunarak anlamlandırılması ve algoritmaların geliştirilerek kalp hızı oranının elde edilmesiyle osiloskoba ihtiyaç duyulmadan sinyallerin elde edilerek anlamlı hale getirilmesidir. 1.4. Tezin Organizasyonu Bu tez çalışması 5 bölümden oluşmaktadır. 1. bölümde PPG sinyallerinin alınırken meydana gelen gürültülerin ve olası sensör hatalarının giderilmesinden, bu çalışmanın amaçları ve hedefleri anlatılmış ve kullandığımız SpO2 devresinin çalışma mantığı, temelleri ve fotopletismografi sinyalleri üzerine temel bilgiler verilmiştir. 2. bölümde Arduino Gömülü Sistemleri hakkında bilgiler verilmiştir. 3 Çalışmanın yapıldığı Arduino kart çeşidi ile ilgili bilgiler verilerek donanım ve yazılım kısımları anlatılmıştır. Donanım kısmında fiziksel olarak tasarlanmış Arduino devre yapısı işlenmiştir. Yazılım kısmında Arduino IDE üzerinde gömülü sistemler için C (Embedded C) dilinin kullanımı açıklanmıştır. Kullanılan sistem Creative Commons (CC) açık kaynak lisansı altında Processing tabanlı Arduino IDE geliştirme ortamı tarafından geliştirilmiş kodlar ile AtmelTM 2560 entegresi programlanarak gömülü devre kartın içine bu yazılım gömülmüştür. 3. bölümde Arduino gömülü sistemin seri haberleşme ile bilgisayara veri aktardığı gerçek zamanlı verileri seri porttan veri okuyan yapı açıklanmıştır 4. Bölümde gerçek zamanlı olarak bilgisayardan okunan verilerin Processing açık kaynak kodlu programı ile işlenip C dilinde yazılmış özel geliştirilmiş kütüphaneler yardımıyla okunan veri yığınları gerçek zamanda işlenerek belirli bir örnekleme frekansıyla örneklenip Analog sinyale dönüştürülüp çizim alanında işlenmekte ve PPG sinyallerinin zamansal oranı ile kalp hızı oranı elde edilmektedir. 5. bölümde bu çalışmayı doğrulamak için yapılan simülasyonların ve deneylerin sonuçlarına yer verilmiş ve sonuçlar vurgulanmış ve tartışılmıştır. 2. GERÇEKLEŞTİRİLEN SİSTEM Bu tez çalışmasında gerçekleştirilen aşamalar 5 kısımda toplanabilir. Bu kısımlar; PPG Sinyalini Almak (sensör ile), Arduino Gömülü Devre Kartı, Bilgisayar’a Veri Aktarılması, Processing Programı ve Bilgilerin Görüntülenmesi kısımlarıdır. Şekil 3.1’de gerçekleştirilen düzeneğin blok şeması yer almaktadır. Şekil 2.1: Blok şeması 4 Gerçekleştirilen sistemde ilk olarak; parmağın optik sensör üzerine yerleştirilip dokuya uygulanan ışığın kırılmasıyla oluşan değişimin algılandığı ve filtre görevi gören devre elemanlarını kullanılarak fotopletismografi sinyalleri üretilmektedir. Bu sinyalleri devre kartının sinyal çıkışı kısmında yer alan “output” noktasından toprak bağlantısıyla birlikte alıyoruz. Tek damarlı zil teli kablosu ile bu uca lehimlenen kablo vasıtasıyla Arduino devre kartının analog veri girişinin olduğu A0 ucuna yerleştiriyoruz. Bu şekilde Arduino’ya gelen analog veriler belirli örnekleme frekansına göre örneklenip bilgisayara USB kablo üzerinden seri yollu haberleşme ile veri aktarımını sağlar. Bilgisayarın COM portlarına düşen bu veriler Processing programı tarafından okunarak geliştirilen algoritma tarafından sayısal olarak işlenerek analog değerlikli PPG sinyalini bilgisayar ekranında ortaya çıkartır. Aynı zamanda, geliştirilen kod blokları ile kalp atım oranının sayısal değeri ekrana aktarılır. Sistemi oluşturan kısımlar aşağıda detaylı olarak açıklanmıştır. 2.1. Darbe Oksimetresi ve Sensör Devre Kartı Darbe oksimetresinde bir ışık kaynağı ve ışık dedektöründen oluşan sensörün kıskaçları arasına yerleştirilen parmak ile ya da kulak memesi gibi iyi perfüze olan dokuların yerleştirilmesi ile ölçüm yapılabilir. Şekil 2.1’de parmak tipi darbe oksimetresi görünmektedir. Şekil 2.2: Parmağa yerleştirilebilen kıskaçlı darbe oksimetresi 5 Oksimetreler için temel kural, oksijeni ve redükte hemoglobini ayırt edebilmesidir. Bu ayrım red ve IR ışınların emilim oranının bir mikrodenetleyici yardımıyla analiz edilmesi ile sağlanır. Işık yayma diyotlarından gönderilen kırmızı (660 nm dalga genişliğinde) ve kızılötesi ışık (940 nm dalga genişliğinde) dokunun karşı tarafında bulunan fotodedektöre iletilir ve ışığın emilim derecesi belirlenir. Kırmızı ışık (660 nm) hemoglobin, kızılötesi ışık (940 nm) oksihemoglobin tarafından absorbe edilir. Darbe oksimetre probu temas yüzü doku yüzeyine değecek şekilde arterial perfüzyonlu bir doku üzerine yerleştirildiğinde, fotodedektör ışın yayma diyotlarından damarın karşısına gönderilen ışığın şiddetini ölçer ve kaydeder. Sensörün şematik gösterimi Şekil 2.2’deki gibidir. Şekil 2.3: Sensörün şematik gösterimi Fotodedektörden alınan sinyal, analog filtrelerden geçirilerek gürültülerden arındırılır. Filtreleme sonucu çok küçük bir AC sinyal kalır ve kuvvetlendiricilerle 6 osiloskoba aktarılır. Bu kısımda parmaktan alınan PPG sinyali elde etme işlemi şekil 2.3’te osiloskop ekranında gösterilmiştir. Şekil 2.4: Osiloskop ekranında görüntülenen PPG sinyali Bu çalışmamızda kullandığımız PPG sinyalini elde etmemizi sağlayan devre kartının sinyal çıkışını osiloskopta görmemizin sebebi olarak elde edilen sinyalin nasıl bir şekilde değer aldığını zaman ve genlik eksen takımı üzerinde gözlemlemek ve çalışmamızda kıyas yapabilmek amaçlıdır. Kullandığımız devre kartı SpO2 Demo Board olup versiyonu 1.1’dir ve şekil 2.4’te gösterilmiştir. 7 Şekil 2.5: PPG sinyalinin üretilmesini sağlayan devre kartı Bu devre kartını seçmemizdeki temel sebep devre kartı üzerinde yer alan sensör genişleme modül desteğinin (bakınız şekil 2.5) bulunması ve kalp atışlarını yakalayan ve her atışta LED’in yanmasını sağlayan sürücülerin bulunmasıdır. Bazı diğer özellikleri ise hem kızılötesi ışınlarını hem de kırmızı renkli LED ışığında çalışma imkanı sunmasıdır. Modül üzerinde yer alan sabit enerji kaynağı olarak akü grupları yerine saat pillerinin kullanılması modül için büyük bir esneklik sağlamakta ve üzerindeki açma kapama anahtarı sayesinde devrenin çalışması durdurulup başlatılabiliyor. Sinyalin genlik seviyesinin ayarlanması için yerleştirilmiş genlik değiştiren potansiyometre sayesinde çıkış sinyalinin tepe genlik değeri ayarlanabilmektedir. 8 Şekil 2.6: Parmaktan sinyal elde edilmesini sağlayan harici bileşen Şekil 2.5’te gösterilen harici sinyal elde edici devre elemanı kalp hızı oranı elde edilecek kişinin parmak yapısına uygun şekle getirilmesi için harici bileşen kartı üzerine dört adet muhafaza delikleri açılmıştır. Şekil 2.6’da bu kısımlara yerleştirilen kauçuk malzemeden yapılmış bir kılıf tasarımı yer almaktadır. Biyomedikal sinyaller üzerinde gerçekleştirilen çalışmalarda özellikle bu noktada oldukça hassas olunması gerektiği oldukça çok bilinir. Olası sensör hataları başında gelen sensörlerin uygun yerleştirilememiş olması ve sonucunda doğacak istenmeyen sinyal bileşenleri ve gürültüler işlemimizde hatalı sonuçlar elde etmemizi ve yanlış varsayımlar üretmemize yol açmaktadır. Bununla ilgili olarak kullanılan kauçuk model şekil 2.6’da gösterilmiştir. Şekil 2.7: Parmak ile uyumlu harici bileşen kauçuk profili 9 Sensör devre kartının sinyal çıkış noktasında yer alan “Output” ve “Signal GND” noktalarını kullanıp mikrodenetleyici kartımızın analog veri girişi kısmına veri göndermek için kullanacağız. Devre kartımız 3 voltluk gerilime ihtiyaç duymaktadır. Bu gerilimi sabit güç kaynağından sağlamaktayız. Bu kısımda gönderdiğimiz verileri aynı zamanda osiloskopta da görmek için şekil 2.3’teki gibi osiloskop cihazının bağlantılarını bu iki noktaya CH1 kısmından bağlandı. Osiloskop probunun ucu output ucuna bağlanarak Signal GND ucu da toprak ucuna bağlanmıştır. Şekil 2.1’de yer alan darbe oksimetresi ile de kişinin kalp atış oranını görüp kıyaslama işlemini yapıyor ve SpO2 değerinin ölçülmesini sağlamak için kullanıyoruz. 2.2. Arduino Arduino gömülü sistem devre kartları ve mikrodenetleyicileri bir giriş çıkış kartı olarak Processing/Wiring dilinin bir çeşit özelleştirilmiş uygulaması olan geliştirme ortamının temelde mikroişlemcileri hedef alan fiziksel programlama platfomu olarak tanımlanır. Arduino devre kartlarına enerji verildiğinde tek başlarına çalışan interaktif programlar ve yazılımlar geliştirmek için kullanılabilir. Ayrıca geliştirilmiş donanım mimarisine sahip eklentiler sayesinde hazır olarak üretilmiş açık kaynak yapısındaki donanımlara sahip birimler doğrudan eklenebilmektedir. Arduino kartları bir Atmel AVR mikrodenetleyicisi (Atmega8, Atmega328 gibi) ve kod programlaması için gerekli yan elemanlardan meydana gelmiştir. Üretilmiş her Arduino kartında 5 voltluk regüle entegresi ve bir 16MHz kristal osilatör bulunmaktadır. Mikrodenetleyiciye önceden bir bootloader programı yazılı olduğundan programlama için harici bir programcıya ihtiyaç duyulmamaktadır.[8] Arduino IDE kod editörü birçok işletim sistemi üzerinde çalışabilen kod editörü ve derleyicisi olarak çalışmaktadır. Derlenen kodların devre kartına gömülmesini sağlayan geliştirme ortamı Processing mimarisinin geleneğini taşımaktadır. 10 Genel olarak kullanılan malzemeler, hazır kütüphaneler ve kaynak kodları “Creative Commons Attribution Share-Alike 2.5 açık kaynak lisansı ile sunulmaktadır. Bu sebeple tasarım yapan araştırmacılar ve program geliştiricileri için büyük bir kolaylık ve esneklik sağlanmıştır. Bu yönüyle Arduino’nun herkes tarafından oldukça popüler bir kullanıma kavuşması ve herkes tarafından kullanılabilir kolay bir yapı olması sağlanmıştır. Bu çalışmamızda kullanmış olduğumuz Arduino Mega 2560 kartının genel özelliklerini inceleyelim. Şekil 2.7’de Arduino Mega kartı yer almaktadır. Şekil 2.8: Arduino Mega 2560 Atmega2560 tabanlı bir Arduino kartı olan Arduino Mega, 54 dijital giriş çıkış pininden 14 tanesini PWM olarak tanımlamıştır. 16 analog giriş ve 4 UART (seri port), 16 MHz kristal osilatör, USB bağlantısı, adaptör girişi, ICSP çıkışı ve bir adet reset butonu barındırır. Tüm Arduino kartlarındaki donanımlar açık kaynak kod mimarisine sahiptir. Arduino Mega 2560 5 voltluk gerilim seviyesinde çalışır Arduino Due 3.3 voltla çalışır dolayısıyla her Arduino kartı ilgili ihtiyaca yönelik üretildiğinden kartı kullanmadan önce ön bilgiler mutlaka okunulmalıdır. Arduino Mega 2560 harici olarak 6 ila 20 volt arasında bir gerilim kaynağı ile beslenebilir. Eğer 7 voltun aşağısında harici besleme kullanılacaksa çıkış pini 5 volt vermekte zorlanabilir ve arıza meydana getirebilir. 12 volttan fazla bir gerilim seviyesi 11 verildiğinde ise gerilim regülatörü fazla ısınıp kartın yanmasına yol açabilir. İdeal olarak 7 ila 12 volt arasında gerilim düzeyi seçilmelidir. Arduino Mega 2560’ın diğer kartlardan farkı FTDI USB-to-serial sürücü entegresi kullanılmamış olmasıdır. USBto-Serial entegresi yerine Atmega 16U2 USB-to-serial dönüştürücü olarak programlanmıştır. Aşağıda Arduino Mega 2560 kartı üzerinde özel olarak tanımlanmış bileşenler yer almaktadır.[9] Seri: 0 (RX) ve 1 (TX) seri veri almak (RX) ve göndermek (TX) için kullanılır. 0 ve 1 pinleri aynı zamanda ATmega16U2 USB-to-TTL seri entegresine bağlıdır. Harici Kesme: 2 (interrupt 0), 3 (interrupt 1), 18 (interrupt 5), 19 (interrupt 4), 20 (interrupt 3), ve 21 (interrupt 2). Bu pinler harici kesmeler için kullanılır, düşen kenar kesmeleri, yükselen kenar kesmeleri, “Interrupt on change” kesmeleri bu kısımlara attachInterrupt() fonksiyonunun kullanılmasıyla hangi kesmenin ne şekilde kullanılacağı belirtilir. PWM: 0 ila 13. pinler 8-bitlik PWM çıkış verir. AnalogWrite() fonksiyonu kullanılarak PWM işaretlerinin kullanılması sağlanır. SPI: 50 (MISO), 51 (MOSI), 52 (SCK), 53 (SS). Bu pinler SPI kütüphanesi kullanılarak SPI türü iletişimin kurulmasını sağlar. SPI pinleri aynı zamanda ICSP tarafından da kullanılır. LED: 13 numaralı pinde bir LED bulunmaktadır. Çıkış “High” edildiğinde LED yanar, “LOW” edildiğinde sönmektedir. TWI: 20 (SDA) ve 21 (SCL). “Wire” kütüphanesi kullanılarak TWI tarzı iletişim bu yolla sağlanır. Genel olarak Arduino gömülü sistem devre kartları “Shield” adı verilen gömülü eklentilerle yapabildiklerini genişletmektedir. Şekil 2.8’de Arduino Mega 2560 ile Wi-Fi katmanının (shield) yapabileceklerinin gösterilmektedir. 12 nasıl bir araya getirildiği Şekil 2.9: Arduino Mega 2560 ve Wi-Fi Katmanının Birleştirilmesi Arduino Mega 2560 bu çalışmamızda enerjisini USB B tipi kablo ise doğrudan bilgisayarın USB kısmından almaktadır. Aynı zamanda USB üzerinden haberleşme ve bilgisayara veri gönderimi yapılmasını sağlamaktadır. Bu çalışmamızda herhangi bir shield kullanmadan bu işlemi gerçekleştirebiliyoruz. Eğer doktora veya belli bir telemonitörize işlemiyle bir yere bilgi gönderilecekse Wi-Fi ağının bulunduğu noktalar için Wi-Fi katmanıyla internete veri gönderilebilir yoksa Ethernet katmanı ile internete veri gönderilip uzaktan bilgi edinme işlemi gerçekleştirilebilir. Arduino Mega 2560 gömülü devre kartımız üzerine yazdığımız kodlar vasıtasıyla gerçekleştirdiğimiz algoritma kod bloğu aşağıdaki şekil 2.9’da verilmiştir. Arduino 13 devre kartları için tasarlanan algoritmaların gömülü C dili ile (Embedded C) yazıldığı ve üzerinde geliştirme yapılabildiği kısım Processing tabanlı olarak çalışan ve Arduino gömülü devre kartları için özel olarak tasarlanan Arduino IDE ortamıdır. C dilinde geliştirilen kod satırlarını “Verify” özelliği ile doğrulayabiliyor ve yazılan kod satırlarındaki hataları daha kodları yazarken görebiliyoruz. Bu açıdan oldukça esnek bir kullanım kolaylığı sağlayan uygulama birçok işletim sistemi üzerinde çalışabilecek şekilde üretilmiştir. Açık kaynak lisansına sahip olduğu için program ücretsizdir ve hazır kütüphaneleri kendi içinde barındırarak son kullanıcıya ulaşmaktadır. 14 Şekil 2.10: Arduino IDE üzerinde geliştirilen kod satırları 15 2.3. Bilgisayar Ortamı Çalışmamızın üçüncü aşamasında bir önceki aşamada Arduino Mega 2560 devre kartımızın “Analog Read” kısmından okuduğumuz gerçek zamanlı verileri 5 milisaniye aralıklarla örnekleyip USB kablo vasıtasıyla bilgisayara aktarımını gerçekleştirmiştik. Aynı zamanda Arduino devre kartımız enerjisini USB kablo üzerinden 5 volt olarak almaktaydı ve Arduino Due 3.3Volt ile çalıştığı özellikle vurgulanmıştı. Çalışmamızın üçüncü aşamasında ise Arduino Mega 2560 devre kartımızı bilgisayara bağladıktan sonra ne yapmamız gerektiğinden bahsedeceğiz. Arduino kartımızı ilk defa bilgisayara taktığımızda kartta yer alan tak-çalıştır (plug & play) özelliği sayesinde aygıtın yazılımı otomatik olarak bilgisayara Arduino Mega adıyla tanıtılır ve haberleşmenin sağlanması amacıyla o anda bilgisayar tarafından sıradaki boş COM portu tanımlanır. Bu işlem otomatik olarak gerçekleşirken bilgisayarınız Arduino kartını otomatik olarak tanıyacaktır. Şekil 2.10’da kendi Arduino kartımızın yer aldığı genişleme yuvasının bilgisayarımızda tanımlandıktan sonraki bağlantı durumu görülmektedir. Şekil 2.11: Windows aygıt yöneticisi, Arduino IDE ve COM numarasıyla Arduino Mega 2560’ın bilgisayarda tanımlanması 16 Eğer Arduino IDE başlatılırken hata alınıyorsa bilgisayarınızda bulunan dahili Bluetooth modülünün çalışmasını durdurmalısınız. Aksi takdirde Arduino.exe programını başlatan komutu verdikten sonra programın açılması çok uzun sürer ve şekil 2.11’de görüldüğü gibi hata ile karşılaşırsınız. Şekil 2.12 Launch4j başlangıç hatası Bluetooth bileşeninden kaynaklıdır 2.4. Processing Processing, dijital sanatlar, animasyon gibi konularla uğraşan sanatçılar ve etkileşimli programlar geliştirmek isteyenlere yönelik tasarlanmış bir görsellik ağırlıklı programlama dilidir. Geniş kütüphane desteğine sahip olan Processing programlama platformu, son dönemde geniş bir kullanıcı çevresine ulaşmıştır. Bu bölümde, Processing programlama diliyle bilgisayarda oluşturduğumuz arayüzlerle Arduino Mega 2560 devre kartımız arasında etkileşimde bulunan çalışmamızı nasıl gerçekleştirdiğimiz anlatılacaktır. Arduino IDE kod geliştirme ortamı temelde Processing’e dayanır. Kolay bir şekilde görsel programlama yapmak için geliştirilmiş bir programlama dili olarak Processing, Arduino IDE üzerinde çalışmış olanlar için kullanımı çok kolay olarak öğrenilebiliyor. 17 Processing içerisindeki “Serial” kütüphanesi ile Arduino ile bilgisayar arasında seri haberleşme üzerinden iletişim kuran projeler gerçekleştirilebilir. Arduino’da olduğu gibi Processing de diğer işletim sistemlerinde çalışabilmektedir. Şekil 2.12’de Processing arayüzü, logosu ve güneş sisteminden bir kesit gösterilmiştir. Şekil 2.13 Processing Logosu ve bazı örnekleri 18 Bu çalışma için Processing programını PPG sinyallerini çizdirmek ve bu sinyaller arasındaki ilişki vasıtasıyla kalp hızı oranını bulmak için kullanmaktayız. Arduino Mega 2560 devre kartımızdan gelen veriler sayısal veri olacak şekilde 5 milisaniye aralıklarla örneklenip analog biçimden sayısal türe çevrilmişti. Bilgisayar ortamında çalıştırdığımız Processing programı ile çizim alanında grafik çizdirip kalp hızı değerine ulaşmaktayız. Bununla ilgili olarak geliştirdiğimiz kod satırları aşağıdaki Ek 1’de verilmiştir. Processing programımıza yazdığımız kodlardan sonra çalışmamızın sonucunda elde ettiğimiz veriler şekil 2.13’de gösterilmiştir. Şekil 2.14: Processing çizim alanında PPG sinyalleri ve kalp atış oranı Processing programında yer alan kod satırlarında kullandığımız filtreleme işlemi Moving Average yöntemine dayanmaktadır. Moving Average filtrelemesindeki temel gerekçe olarak SpO2 modülümüzden alınan PPG sinyalinden Arduino Mega 2560 devre kartından geçiş ve bilgisayar ortamına kadar gelen süreçte meydana gelen gürültü bileşenlerinin ve istenmeyen hataların ortadan kaldırılması içindir. Moving Average yöntemi ile aritmetik ortalamayı zaman düzlemi üzerinde ilerleterek elimizdeki verileri adım adım işleyip ortalama alan ve her işlemde ortalama değeri 19 bir önceki değeri dahil edip hesaplamak temel prensip olarak yer almaktadır. Ayrıca bu işlemin Embedded C dili ile algoritma bazlı geliştirilmesi kolaydır. Arduino devre kartımızdan gelen 5 milisaniye ile örneklenmiş veriler Processing’e de 5 milisaniye ile örneklenmiştir diye tanımlanması gerekmektedir. Alınan verilerden çizilen grafik için eğri uydurma yöntemi kullanılmıştır. Alınan veriler 5 milisaniye arasında kalan boş geçen zamanda eğri oluşturacak şekilde veriler birleştirilmiş ve bir eğri olacak şekilde çizim alanına aktarılmıştır. Çizim alanında çizilen grafik üzerinde ilk on sanıda örnek için bir tepe bulma fonksiyonu çalıştırılmıştır. Bu işlem 3 defa tekrarlandıktan sonra bulunan tepe noktaları arasında geçen sürenin çarpma işlemine göre tersinin 60 ile çarpılıp, 2 aralık için iki değer elde edilir ve bu iki değerin aritmetik ortalaması hesaplanılarak “BPM” birimiyle çizim ekranına yazdırılır. (Beats Per Minute – Dakikadaki kalp atım birimi) Bu şekilde geçen bir dakikalık süre boyunca yaklaşık olarak kalp atım hızı belirlenmiş olur. Processing kodlarımızla aslında SpO2 modülümüzün üzerinde yer alan aktif ve pasif devre elemanlarının fiziksel olarak yaptığı algoritmik akış sabit kalmak koşuluyla birer birer Embedded C dili tarafından kod satırlarına dönüştürülmüştür. Bu yapıda kullanılan yüksek geçiren ve alçak geçiren filtrelerin transfer fonksiyonları çıkartılmak suretiyle elde ettiğimiz eşitlikler kod satırlarına yerleştirilip geliştirilen kodların fiziksel bir devre elemanı gibi görev yapması sağlanmıştır. Sensör içinde bulunan fotodiyot LED’lerin yanında ortam ışığını da sinyale dahil edebilir. Kırmızı LED’lerden gönderilen PPG sinyallerinin frekansı 0-5 Hz aralığındadır. Bu nedenle dış ışıktan kaynaklanan, frekansı 5 Hz’nin üzerinde kalan gürültülerin filtrelenmesi gerekir. Alçak geçiren filtrede, kesme frekansı yaklaşık 5 Hz’dir. 20 PPG sinyalinin DC bileşeni kirli kan, kemik ve dokulardan alındığı için sağlıklı bir ölçüm yapabilmek için DC bileşenlerin filtrelenmesi gerekir. Yüksek geçiren filtrede, kesme frekansı yaklaşık 0,5 Hz’dir. 2.5. Sonuçlar SpO2 devre kartı, op-amplar ve değişik değerlerdeki direnç ve kondansatörler kullanılarak devre çıkışına sinyal aktarımını sağlıyordu. Osilaskop bağlanarak elde edilen sinyalin görüntülenmesi yapıldığından söz edilmişti. Osiloskop cihazımız dijital osiloskop olduğundan dolayı bilgisayar ekranında elde ettiğimiz osiloskop görüntüsü ile kendi çalışmamızla elde ettiğimiz grafiği şekil 2.14’te karşılaştıralım. Şekil 2.14’teki sonuçlara göre osiloskop ekranında görüntülenen sinyaller benzer şekilde Processing geliştirme ortamına da aynen aktarılmaktadır. Aktarılan değerler arasında en yüksek tepe genliğine sahip değer siyah çarpı işaretiyle işaretlenip çizim ortamında belirtilmiştir. Üniversitemizin temel elektronik laboratuarlarında bulunan ADS-3102B kodlu dijital masaüstü osiloskobun arkasında yer alan USB çıkışını yine laboratuarımızda bulunan Windows XP işletim sistemi yüklü bilgisayarımıza USB kablo ile bağlayıp EasyScope program CD’si ile bilgisayara yükleyip hem osiloskop ekranını bilgisayar ekranına aktarabiliyor hem de bu aktarılan verileri. CSV, .BMP ve bilinen diğer dosya türlerinde kaydedebiliyoruz. Osiloskobun desteklediği ölçüde kanal sayısına göre değerler elde edebiliyor ve bilgisayar ekranında bu değerleri görüntüleyip geniş ekranda analizini oldukça esnek bir biçimde gerçekleştirebiliyoruz. Yaptığımız bu çalışma ile elimizde osiloskop olmadığı zamanlarda Processing programını bir çeşit osiloskop gibi kullanabileceğimiz ortaya çıkmaktadır. Eğer gerekli tasarımlar USB giriş kısmı için gerçekleştirilirse bilgisayarın osiloskop olarak kullanılması gerçekleştirilmiş olacaktır. 21 Şekil 2.15: Hem osiloskopta hem de Processing ile bilgisayarda sinyaller 22 Analog PPG sinyallerini elde etmek amacıyla kullanılan devre şeması şekil 2.15’te gösterilmiştir. Şekil 2.16: PPG sinyalinin eldesindeki devre kartının şeması SpO2 deney kartından elde edilen sinyal, dijital verilere dönüştürülerek Arduino Mega 2560 gömülü devre kartı üzerinde yer alan mikroişlemciye örneklenerek aktarılmış ve bu değer dijital olarak USB yoluyla bilgisayara seri yoldan veri girişi olarak sağlanmıştır. Processing programı içerisinde algoritma geliştirerek aynı programın arayüzü ile görüntülenmiş olup PPG sinyalinin nasıl olduğu çizim alanına aktarılmış, tepe değerleri bulunmuş ve kalp atım hızı oranı elde edilmiştir. Bu işlemler gerçekleşirken kullanılan Moving Average yöntemi (hareketli ortalama) kullanılmıştır. Çünkü Moving Average yöntemi, ham verilerin farklı alt kümelerini oluşturup başlangıç noktalarının bir dizisini analiz etmek için kullanılan bir sonlu dürtü yanıtı filtre türüdür. Bu tez çalışmasında filtreleme tek değerde yapılmıştır. Bu değer Processing kod satırlarında uzun bir işlem satırları arasında belirtilmiştir. Örnekleme için 5 ayrı kişiden örnek alınarak karşılaştırma yapılmıştır. Çıkan sonuçlar Tablo 2.2’de gösterilmiştir. 23 Tablo 2.2: On farklı kişiden alınan ölçümlerin karşılaştırılması Kişi Darbe Oksimetresi ile Kalp Atım Hızı Değeri(dk) 1 2 3 4 5 6 7 8 9 10 68 82 70 59 71 79 56 77 75 76.9 Tez Çalışması Sonucu ile Kalp Atım Hız Değeri(dk) 68.8 81.1 71.2 60.3 71.9 79.2 56.2 75.7 75.2 77 Cinsiyet Yaş Boy Kilo Vücut/Kitle Endeksi (Kg2/boy) E E E E E E E E E E 23 21 23 24 22 20 21 21 21 20 1.80 1.77 1.67 1.74 1.79 1.90 1.89 1.77 1.75 1.77 100 65 65 68 88 84 88 71 73 66 55.55 23.87 25.29 26.57 43.26 37.13 40.97 28.48 30.45 24.61 3. SONUÇ Bu çalışmanın asıl amacı darbe oksimetresinin gerçekleştirdiği ölçümlemeleri Arduino gömülü devre kartları üzerinden de yapabilmektir. Geliştirilen yazılımın büyük bir çoğunluğu Processing programı üzerinde yazıldığından dolayı bir bilgisayara ihtiyaç duyulmuştur. Darbe oksimetresi cihazının verdiği deney sonuçları ile bizim yaptığımız bu çalışmadaki sonuçları karşılaştırdığımızda yaklaşık %70 oranında eşitlik olduğu gözlemlenmiştir. Tez çalışmasının literatür tarama kısmında konuyla ilgili Türkiye’de yapılan çalışmaların çok az sayıda olduğu, genellikle yabancı kökenli kaynaklara ulaşılabildiği gözlenmiştir. Bu da Türkiye’de bu konuya daha çok önem verilmesi gerektiğini göstermektedir. Aynı zamanda cihaz üretimi konusunda dışa bağımlı durumda olduğumuz ve üretici firmaların cihazın içyapısını paylaşmakta istekli 24 olmadıkları görülmüştür. Bu da cihazın içyapısı üzerine yeni fikirler geliştirmeyi zorlaştırmaktadır. Uygulama kısmında ise kullanılan malzemelerin çok hassas olması nedeniyle gürültünün fazlalığı dikkat çekmiştir. Bu durum, ileriki çalışmalarda, bilinen gürültü filtreleme yöntemleri dışında daha hassas yöntemler geliştirilmesi gerekliliğini ortaya koymaktadır. 3.1. Öneriler Bu çalışmanın hedeflerinden biri de kalp hızı oranının doktora internet yoluyla bildirilmesi için Şekil 3.1’de Xively (IOE veya IOT) servis sağlayıcısı ile PPG sinyalinin internet ortamına gönderilip telemonitorize işlemi gerçekleştirilmiştir. Bu değerler doktora doğrudan aktarılmak suretiyle hasta ile doktor arasındaki iletişim kurulması sağlanabilir. Şekil 3.1: Xively üzerinde PPG sinyalinin görüntülenmesi(Wi-Fi Shield) 25 EK 1. Tablo 2.1: Processing üzerinde geliştirilen kod satırları //www.onuryolal.com // Sinyal Parametrelerinin Tanımlanması int Sampling_Time = 5; //Örnekleme frekansının Arduino ile optimizasyonu int Num_Samples = 600; int Peak_Threshold_Factor = 80; int Minimum_Range = 500; int Minimum_Peak_Separation = 50; // 50*5=250 ms int Moving_Average_Num = 10; int Index1, Index2, Index3, i, j, k, ZeroFlag; float Pulse_Rate, Temp1, Peak1, Peak2, Peak3, PR1, PR2, ADC_Range; float Amplification_Factor,Peak_Magnitude, Peak_Threshold, Minima, Range, temp, Sum_Points, Num_Points; float[] ADC_Value = new float[Num_Samples]; int[] ADC_Index = new int[Num_Samples]; // Görüntü ekranının tanımlanması float plotX1, plotY1; float plotX2, plotY2; float labelX, labelY; int rowCount; int columnCount; int currentColumn = 0; int count = 0; int yearMin, yearMax; int[] years; int xInterval = 10; int yInterval = 200; PFont plotFont; 1 import processing.serial.*; //Serial kütüphanesinin eklenmesi Serial myPort; // Seri portun tanımlanması void setup() { size(720, 450); //Analiz ekranının ekran genişliğinin en-boy şeklinde gösterimi // Köşe takımlarının tanımlanması plotX1 = 20; plotX2 = width - 20; labelX = 120; plotY1 = 50; plotY2 = height - 150; labelY = height - 100; plotFont = createFont("SansSerif", 20); textFont(plotFont); smooth(); println(Serial.list()); myPort = new Serial(this, Serial.list()[0], 115200); //115200 Baud Rate kullanımı myPort.bufferUntil('\n'); } void draw() { background(224); // Çizim alanının arka planının beyaz olmasını ve detaylarını sağlıyoruz fill(255); rectMode(CORNERS); 2 noStroke(); rect(plotX1, plotY1, plotX2, plotY2); drawTitle(); drawAxisLabels(); drawSampleLabels(); ReadSamples(); RemoveDC(); if(ADC_Range < 50) { ZeroFlag = 1; ZeroData(); } else ZeroFlag=0; ScaleData(); FilterData(); ComputeHeartRate(); // Çizim alanına gelen verilerden uzun bir eğri uyduruluyor noFill(); stroke(32, 128, 192); strokeWeight(2); drawDataCurve(); DisplayHeartRate(); DisplayParameters(); } void drawTitle() { fill(0); textSize(20); textAlign(LEFT); String title = "Arduino A0'dan gelen sinyalin çizdirilmesi"; text(title, plotX1, plotY1 - 10); 3 } void drawAxisLabels() { fill(0); textSize(16); textLeading(15); textAlign(CENTER); text(" ("+nfc(Sampling_Time, 0)+" ms'lik çizilen veri seti)", (plotX1+plotX2)/2, labelY); } void drawSampleLabels() { fill(0); textSize(14); textAlign(CENTER); stroke(224); strokeWeight(1); for (int row = 0; row <= Num_Samples; row++) { if (row % 100 == 0) { float x = map(row, 0, Num_Samples+1, plotX1, plotX2); text(row, x, plotY2 + textAscent() + 10); line(x, plotY1, x, plotY2); } } } //Alınan örneklerin okunduğu fonksiyonun tanımlanması void ReadSamples(){ count = 0; 4 do{ if(myPort.available() > 0){ String inString = myPort.readStringUntil('\n'); if (inString != null) { inString = trim(inString); float inByte = float(inString); // float inByte = float(inString); ADC_Value[count] = inByte; ADC_Index[count] = count; count = count + 1; } } } while (count < Num_Samples); } void RemoveDC(){ Find_Minima(0); Find_Peak(0); ADC_Range = Peak_Magnitude-Minima; println("Peak Magnitude2= "+ Peak_Magnitude + ", Minima = "+ Minima); println("Range of ADC_Samples= "+ Range); // DC (minima) bileşenin bulunması for (int i = 0; i < Num_Samples; i++){ ADC_Value[i] = ADC_Value[i] - Minima; } Minima = 0; // New Minima is zero } void ZeroData(){ for (int i = 0; i < Num_Samples; i++){ 5 ADC_Value[i] = 0; } } void ScaleData(){ // Tepe değerin bulunarak işaretlenmesi Find_Peak(0); Range = Peak_Magnitude - Minima; // 1 ila 1023 arasında örnekleme işlemi for (int i = 0; i < Num_Samples; i++){ ADC_Value[i] = 1 + ((ADC_Value[i]-Minima)*1022)/Range; } Find_Peak(0); Find_Minima(0); println("Peak Magnitude1= "+ Peak_Magnitude + ", Minima = "+ Minima); } void FilterData(){ Num_Points = 2*Moving_Average_Num+1; for (i = Moving_Average_Num; i < Num_Samples-Moving_Average_Num; i++){ Sum_Points = 0; for(k =0; k < Num_Points; k++){ Sum_Points = Sum_Points + ADC_Value[i-Moving_Average_Num+k]; } ADC_Value[i] = Sum_Points/Num_Points; } Find_Peak(Moving_Average_Num); Find_Minima(Moving_Average_Num); println("Peak Magnitude2= "+ Peak_Magnitude + ", Minima = "+ Minima); } 6 void ComputeHeartRate(){ // Tepe noktasının genlik ve zaman ekseninde moving average filtresiyle çizilmesi Find_Peak(Moving_Average_Num); Find_Minima(Moving_Average_Num); println("Peak Magnitude3= "+ Peak_Magnitude + ", Minima = "+ Minima); Range = Peak_Magnitude - Minima; Peak_Threshold = Peak_Magnitude*Peak_Threshold_Factor; Peak_Threshold = Peak_Threshold/100; // Now detect three successive peaks Peak1 = 0; Peak2 = 0; Peak3 = 0; Index1 = 0; Index2 = 0; Index3 = 0; // İlk tepe noktasının bulunarak çizdirilmesi işlemi for (j = Moving_Average_Num; j < Num_Samples-Moving_Average_Num; j++){ if(ADC_Value[j] >= ADC_Value[j-1] && ADC_Value[j] > ADC_Value[j+1] && ADC_Value[j] > Peak_Threshold && Peak1 == 0){ Peak1 = ADC_Value[j]; Index1 = j; } // Bir sonraki tepe noktasının bulunması if(Peak1 > 0 && j > (Index1+Minimum_Peak_Separation) && Peak2 == 0){ if(ADC_Value[j] >= ADC_Value[j-1] && ADC_Value[j] > ADC_Value[j+1] && ADC_Value[j] > Peak_Threshold){ Peak2 = ADC_Value[j]; Index2 = j; 7 } } // Peak1 > 0 // Sonraki 10 örnek için üçüncü tepe noktasının bulunması if(Peak2 > 0 && j > (Index2+Minimum_Peak_Separation) && Peak3 == 0){ if(ADC_Value[j] >= ADC_Value[j-1] && ADC_Value[j] > ADC_Value[j+1] && ADC_Value[j] > Peak_Threshold){ Peak3 = ADC_Value[j]; Index3 = j; } } // Peak2 > 0 } PR1 = (Index2-Index1)*Sampling_Time; // Milisaniyedeki PR2 = (Index3-Index2)*Sampling_Time; println("PR1 = "+PR1+", PR2 = "+PR2); if(PR1 > 0 && abs(PR1-PR2) < 100){ Pulse_Rate = (PR1+PR2)/2; Pulse_Rate = 60000/Pulse_Rate; // In BPM println("Index2= "+ Index2 + ", Index1 = "+ Index1+", PulseRate= "+Pulse_Rate); println("Peak Magnitude= "+ Peak_Magnitude + ", Minima = "+ Minima); } } // Verilerden Eğri uydurma fonksiyonunun tanımlanması void drawDataCurve() { beginShape(); if(ZeroFlag == 0){ for (int row = Moving_Average_Num; Moving_Average_Num; row++) { 8 row < Num_Samples- stroke(32, 128, 192); float value = ADC_Value[row]; float x = map(ADC_Index[row], 0, Num_Samples, plotX1, plotX2); float y = map(value, 0, Peak_Magnitude, plotY2, plotY1+15); if(row == Index1 || row == Index2 || row == Index3){ textSize(20); text("x", x,y); } curveVertex(x, y); // if(row == Index2){ //stroke(204, 102, 0); // triangle(x,y-4, x-3, y+4, x+4, y+4 ); // } // if(row == Index3){ //stroke(204, 102, 0); // triangle(x,y-4, x-3, y+4, x+4, y+4 ); //} } } else{ for (int row = Moving_Average_Num; row < Num_Samples- Moving_Average_Num; row++) { float value = ADC_Value[row]; float x = map(ADC_Index[row], 0, Num_Samples, plotX1, plotX2); float y = 200; curveVertex(x, y); } } endShape(); 9 } void DisplayHeartRate(){ fill(200,0,0); textSize(20); textAlign(LEFT); text("BPM", plotX2-40, plotY1 - 10); if(ZeroFlag == 0){ text(nfc(Pulse_Rate, 1), plotX2-100, plotY1 - 10); }else { text("000", plotX2-100, plotY1 - 10); } } void Find_Minima(int Num){ Minima = 1024; for (int m = Num; m < Num_Samples-Num; m++){ if(Minima > ADC_Value[m]){ Minima = ADC_Value[m]; } } } void Find_Peak(int Num){ Peak_Magnitude = 0; for (int m = Num; m < Num_Samples-Num; m++){ if(Peak_Magnitude < ADC_Value[m]){ Peak_Magnitude = ADC_Value[m]; } } } void DisplayParameters(){ 10 fill(250,00,00); textSize(18); textAlign(LEFT); text("ADC örnekleme aralığı = "+ ADC_Range, plotX1+5, plotY2+80); text("www.onuryolal.com", plotX1+500, plotY2+80); } 11 EK 2. Ek 2: Arduino Kodları /* ONUR YOLAL TARAFINDAN GELISTIRILMISTIR. THESE CODES WRITTEN BY ONUR YOLAL. tr.linkedin.com/in/onuryolal ABANT IZZET BAYSAL UNIVERSITY ELECTRICAL AND ELECTRONICS ENG. */ void setup() { Serial.begin(115200); } void loop() { int sensorValue = analogRead(A0); //A0 ANALOG GIRISINDEN VERI OKUNUR Serial.println(sensorValue); //AYNI ZAMANDA OKUNAN VERI SERI MONITORE YANSITILIR delay_x(5); //5 MILISANIYE KADAR ORNEKLENIR } void delay_x(uint32_t millis_delay) { uint16_t micros_now = (uint16_t)micros(); while (millis_delay > 0) { if (((uint16_t)micros() - micros_now) >= 1000) { millis_delay--; micros_now += 1000; }}} 1 KAYNAKLAR [1] http://www.emo.org.tr/ekler/aa87b54ed6c1dbc_ek.pdf?dergi=892 (Son Erişim: Haziran, 2014) [2] M. E. Altuğ, R. Gönenci, “Pulse Oksimetre ile Arteriyel Oksijenasyonun İzlenmesi”, Veteriner Cerrahi Dergisi (2003), 9 (3-4), 58-62. [3] K. A. Reddy, B. George, N. M. Mohan, V. J. Kumar, “A Novel Method for The Measurement of Oxygen Saturation in Artierial Blood”, Instrumentation and Measurement Technology Conference Proceedings, 2008. IMTC 2008. IEEE, 2008. [4] K. A. Reddy, B. George, N. M. Mohan, V. J. Kumar, “A Novel Calibration-Freee Method of Measurement of Oxygen Saturation in Arterial Blood”, IEEE Transactions on Instrumentation and Measurement, 58(5), 2009, 1699-1705 [5] M. Shafique, P. A. Kyriacou, S K Pal, “Investigation Of Pulse Oximeter Failure Rates During Artificial Hypoperfusion Utilising A Custom Made Multimıde Pulse Oximetry Sensor”, 33rd Annual International Conference of the IEEE MEMBS, August 30 – September 3, 2011 [6] F. Adochiei, C. Rotariu, R. Ciobotariu, H. Costin, “A Wireless Low-Power Pulse Oximetry System for Patient Telemonitoring”, The 7th International Symposium on Advanced Topics In Electrical Engineering, May 12-14, 2011. [7]. J. Bailey, M. Fecteau, N. L. Pendleton, “Wireless Pulse Oximeter”, Bachelor Degree Thesis, Worcester Polytechnic Institute, April 24,2008 [8] Http://arduino.cc/ (son erişim 01.06.2014) [9] http://arduino.cc/en/Main/ArduinoBoardMega2560 (son erişim 01.06.2014) [10] http://processing.org/examples/setupdraw.html (son erişim 01.06.2014) ÖZGEÇMİŞ 1991 yılında İstanbul Göztepe’de doğdu. İlköğretim ve lise öğrenimini İstanbul’da tamamladı. 2009 yılında Öğrenci Seçme Sınavına (ÖSS) girerek Bolu’da Abant İzzet Baysal Üniversitesi Elektrik ve Elektronik Mühendisliği bölümünü kazandı. Elektrik ve Elektronik Mühendisliği Bölümü’nde son sınıf öğrencisi olarak mezun olma aşamasındadır. İletişim Adresi: E-posta : [email protected] LinkedIn: tr.linkedin.com/in/onuryolal