Arduino-проект, получивший название tinyPulsePPG реализован на микроконтроллере (МК) Microchip ATtiny85 и в режиме реального времени отображает динамическую фотоплетизмограмму (график сердечного ритма), частоту пульса и значения SpO2, которые позволяет оценить процентное содержание кислорода в крови. В приборе используется OLED дисплей с разрешением 128×32 точки на контроллере SSD1306 и модуль цифрового датчика MAX30102 компании Maxim. Следует заметить, что расчет значения SpO2 очень приблизительный, никаких калибровок не производилось.
Основной целью проекта является демонстрация возможности реализовать функциональное устройство на МК с объемом оперативной памяти 512 Байт. Это означает, что данные, поступающие от датчика MAX30102, должны обрабатываться на лету. Большинство подобных проектов на Arduino работают иначе: сначала считываются примерно 100 сэмплов, а затем обрабатывают их.
Аппаратная часть и работа прибора
Принципиальная схема прибора изображена на Рисунке 2. МК ATtiny85 настроен на работу с тактовой частотой 16 МГц с использованием ядра ATtinyCore для среды Arduino. Следовательно, согласно спецификации на МК, напряжение питания должно быть больше 4.5 В. Тем не менее, в ходе проверки МК показал стабильную работу от Li-Ion (Li-Po) аккумулятора в диапазоне напряжений 3.7 В – 4.2 В.
Устройство собрано на макетной плате, но можно применить и монтажную плату для быстрого прототипирования. Модуль пульсоксиметра на датчике MAX30102 и OLED дисплей подключаются к микроконтроллеру по интерфейсу I2C.
Собрав схему и запрограммировав МК, после подачи питания на дисплее прибора на дисплее вы увидите надпись «PLACE FINGER», а также дополнительную информацию о напряжении питания и режиме работы.
Когда вы поместите палец на датчик, на дисплее будет отображаться график сердечного ритма, частота пульса и два оценочных значения количества кислорода в крови.
Красный светодиод мигает с частотой сердцебиения, дисплей обновляется каждые 50 мс. Единственная кнопка в приборе предназначена для пробуждения системы, когда она переходит в спящий режим (через 10 секунд, если на датчик не активен), а также для переключения между четырьмя режимами работы. Четыре режима работы позволяют пользователю наблюдать форму сигнала отдельно на красном и инфракрасном светодиоде датчика. В режиме работы «RAW» на дисплее отображается график сердечного ритма без фильтрации (усреднения) данных. В режиме «Avg» график сердечного ритма строится по усредненным данным.
Программная часть
Проблема с драйвером датчика MAX30102 заключается в том, что используемый в приборе датчик выпускается на плате MH-ET LIVE. В спецификации на датчик подразумевается, но не указывается явно, что LED1 – красный светодиод, LED2 – инфракрасный (ИК). Однако, если сигнал управления на LED1 равен 0, красный светодиод остается включенным (как на Рисунке 3), если же сигнал управления на LED2 равен 0, то красный светодиод гаснет. Очевидный вывод состоит в том, что LED1 – это ИК светодиод, а LED2 – красный, который также участвует в измерениях уровня насыщения крови кислородом (см. описание ниже). Мы упоминаем этот момент по причине того, что самый распространенный драйвер датчика MAX30102 для проектов на Arduino – это драйвер SparkFun 3010x, в котором однозначно определено, что LED1 – красный, LED2 – ИК. Это может быть справедливо для модулей с датчиком серии MAX30105, установленных на платах SparkFun, но, похоже, не относится к датчику MAX30102 на плате MH-ET LIVE.
Уровень кислорода в крови обозначает насыщение периферийных капилляров кислородом. Более конкретно, это процент насыщенного кислородом гемоглобина по сравнению с общим количеством гемоглобина в крови (насыщенный и ненасыщенный кислородом гемоглобин).
Насыщенный и ненасыщенный гемоглобин имеют разные характеристики поглощения света для красных и ИК длин волн. На этом принципе основана работа датчиков, таких как MAX30102. В вычислениях используется следующее соотношение:
R = (AC_red/DC_red)/(AC_IR/DC_IR)
где AC_xxx является переменной составляющей сигнала xxx, а DC_xxx является постоянной составляющей сигнала xxx. В приборе вычисляются два значения R. Верхнее значение на дисплее (следующее после частоты пульса) вычисляется по классической формуле:
R = 104 – 1.7 × R
Нижнее значение вычисляется с помощью таблицы из Arduino библиотеки драйвера, которая является приближением формулы:
-45.060 × R × R + 30.354 × R + 94.845
Переменная составляющая вычисляется как размах амплитуды сигнала (от пика до пика) после удаления постоянной составляющей. Постоянная составляющая вычисляется с помощью экспоненциального фильтра скользящего среднего, также фильтр применяется при вычислении переменной составляющей. Автор недостаточно экспериментировал с константами в этих фильтрах, чтобы определить насколько надежным является этот метод вычислений указанных величин.
Построение графика сердечного ритма основывается на красном и ИК сигналах от датчика, и также проходят две стадии фильтрации. Первой, как описано выше, является удаление постоянной составляющей. Второй – это фильтр скользящего среднего, который действует как фильтр нижних частот для удаления переходных процессов до того, как сигнал поступит в детектор пульса. Форму сигнала после каждого из этих фильтров можно отобразить, но в целом более интересна форма сигнала без фильтров.
Например, дикротические выемки, которые можно увидеть на полученном с помощью прибора графике сердечного ритма (Рисунок 1) – «второе движение вверх на нисходящей части траектории, соответствующее увеличению давления в аорте при закрытии аортального клапана. – словарь Merriam Webster». Автор заметил, что если эти дикротические выемки более ярко выраженные – у более молодых людей – они могут преодолеть фильтрацию второго уровня и привести к ошибочному выходному сигналу детектора пульса, который, по сути, ищет пики и впадины в сигнале. Работа над проектом продолжается!
Исходный код (скетч Arduino), необходимые библиотеки, проект корпуса для печати на 3D принтере доступны для скачивания в разделе загрузок.
Таким образом, вы можете экспериментировать с исходным кодом и датчиком.
- 6Поделились
Интересно