Пульсоксиметр

Рівень кисню у крові став важливим показником у зв'язку з недавніми подіями. Доволі поширеними останнім часом стали пульсоксиметри та розумні годинники з аналогічною функцією.
Ці вимірювання є доволі прості і я хотів би їх повторити. До цього мене спонукала ця стаття, хоча в залізі і програмно мій проект є інакший.

Принцип вимірювання

Якщо пропускати, наприклад через палець світло, то воно буде затьмарюватись тканинами тіла, пульсуюсою кров'ю, гряззю на пальцях. Кров пульсує в пальці, а отже це затьмарення буде теж пульсувати:

На різних довжинах хвиль це затьмарення буде різне. Крім того кров на різних довжинах хвиль матиме різне поглинання (і колір) в залежності від того наскільки вона насичена киснем. Наприклад, але артеріальна і венозна кров має різний колір (розпоріть руку аби перевірити) саме через насичення киснем та вуглекислим газом.

Кисень в крові переносить білок гемоглобін. Гемоглобін з киснем і без має різне поглинання:

Зазвичай вимірюють на довжинах хвиль, де поглинання значно різниться: наприклад на червоному та інфрачервоному світлі. Хоча існують дослідження, що вимірювання у зеленому і червоному світлі є більш точні. Найбільш вживані пари кольорів: 665/910 нм, 730/880 нм, 520-525/620-625 нм, 525/660 нм.

На кожному кольорі пари вимірюють відпошення пульсуючої частини до постійної:

R=AC/DC=(Vmax-Vmin)/Vmin

Рівень насичення киснем визначається як:

SaO2=A-B*Rred/Rir

Практика

Отже, для пульсоксиметрії потрібно 2 діоди і оптоприймач, плюс мікроконтроллер. Мікроконроллер у мене - це Ардуїно Уно, приймач OPT101, IR діод QED-123 і безім'янний червоний діод.
Діоди варто підбирати з наведених вище пар або рекомендованих довжин хвиль. Особисто я робив з чого мав. Єдине у мене був вибір кількох типів червоних діодів. Я не маю спектрометра вдома,
але порівняти червоні діоди по довжині хвилі можна з напруги відкриваня діода. Довжина хвилі випромінювання залежить від напруги відкривання як:

lamba [µm]=1.24 / Vled [V]

Струм через діоди бажано дати побільше, тоді вимірювальний сигнал буде менш шумний (від струму світлодіода залежить його яскравість, а отже і рівень сигналу оптоприймача). З іншої сторони, не варто перебільшувати максимальний струм через діод (20 мА для червоного і 100мА для інфрачервоного).
В буль якому разі це струми в кілька разів більші тих, що може видати ніжка мікроконтроллера, тому ввімкнення діодів здійснюється через транзистор. Я використав PNP транзистор, бо такий мав під рукою:

Струмообмежуючі резистори я підібрав таким чином, аби мати комфорний рівень сигналу на оптоприймачі. Варто зазначити, що струм червоного світлодіоду є дещо більше максимально дозволеного, але це ок, бо він працює лише 20% часу. Потреба великого струму (близько 22мА) червоного світлодіода зумовлена більшим поглинанням (ймовірно) і меншою квантовою ефективністю приймача у червоному світлі.
Приймач OPT101 поєднує світлодіод і підсилювач в одному корпусі. Це спрощує схематику і ще й до того вимірювальний сигнал є доволі чистим.

OPT101 схема включення і крива чутливасті

Вимірювання відбувається в 5 кроків:

  1. Вмикається червоний світлодіод. Затримка 1 мс. Йде вимірювання в червоному світлі.
  2. Вимикається червоний світлодіод. Затримка 1 мс.
  3. Вмикається інфрачервоний світлодіод. Затримка 1 мс. Йде вимірювання в інфрачервоному світлі.
  4. Вимикається інфрачервоний світлодіод. Затримка 1 мс.
  5. Обробка сигналів.

Зміна кроку відбувається по перериванню (500 Гц). Затримки в перериваннях, це зло, але хотілося просте рішення. Скрипт ось.

Псевдо-одночасно вимірюються фотоплетизмограма у червоному та інфрачервоному світлі:

Наступний крок це виокремлення інформації (віднощення та період). Для цього я зберіг вибірку даних і в матлабі написав скрипт обробки і згодом імплементував його в Ардуїно. В результаті я виміряв свій пульс 70 ударів в секунду і відношення Rred/Rir=0.91. Наступним кроком мало би бути калібрування рівня кисню (аби знайти коефіціенти А та В), але мені це не цікаво.

Мій фінальний скрипт.

Модуль MAX30102

По суті, все вище перелічене вже є вбудоване у мікросхему max30102. Недоліків є два: на моєму дешевому китайському модулі 3 підтягуючі резистори були підтягнуті на 1.8 В (напруга живлення мікросхеми) а тому мікросхема не знаходилась Ардуїно. Це вирішується відпаюванням усіх 3х резисторів на платі і перепаюванням їх з підтяжкою 3.3 В. Другий мінус, що це відбиваюча пульсоксиметрія, що начебто є менш точною. З переваг є те, що нічого не треба городити з аналогової електроніки і регульований струм світлодіодів.

Так само як і в попередньому випадку, потрібно власноруч писати алгоритм обробки сигналу (або позичити). В мене відразу запрацював приклад від Sparkfun, але його точність є сумнівною. В будь якому випадку, цей модуль це лише аналогове рішення, що потребує ручного доведення.