Привет, читатель! Вероятность того, что вы пользуетесь устройствами из сферы персональной медицины, весьма высока. Для профессиональных спортсменов есть приборы для контроля состояния сердечно-сосудистой системы во время тренировок, (например, портативный ЭКГ). Для пациентов — медицинские холтеры, которые отслеживают работу сердца. Для всех желающих – фитнес-браслеты на любой вкус и кошелек. А что если собрать такой прибор своими руками? Нюансы, особенности и реализация проектов под катом!
Одно из моих хобби — разработка измерительных средств и приборов. Как робототехнических, так и специального назначения. Среди них есть устройства, помогающие облегчить жизнь медперсонала. Ранее я выполнял некоторые проекты в рамках грантов и научно-исследовательской работы. Изучая возможности ОС «Аврора», решил переписать ряд решений, сделав их более мобильными. Заодно хотел бы познакомить вас с методами, которые применяются для анализаа и встречаются в повседневных приборах.
Используйте навигацию, если не хотите читать текст полностью:
→ Реализация
→ Давление
→ Sp02
→ Электрокардиограмма
→ Что дальше?
Реализация
Большинство описанных решений в рамках данной статьи будут иметь схожую структурную схему: телефон с запущенным ПО, конвертер USB-UART, микроконтроллер подготовки данных и измерительная цепь. Отличаются только выходные формы и методы измерения сигналов.
Зачем здесь отдельный микроконтроллер, спросите вы. Изначальной целью было встроить датчик пульсоксиметрии в R570E, аналогично Galaxy S10. Но мне не удалось установить или собрать i2c-tools на ОС «Аврора 4», т. к. в системе нет зависимостей. Однако я находил информацию, что MT6762 поддерживает этот интерфейс. Раз встроить не получилось, подключаю и предварительно обрабатываю сигнал отдельным устройством.
Программный код для телефона написан на привычном Qt и все основные моменты и нюансы подсвечены в статье о построении графиков.
Давление
Интересный факт: систолическое и диастолическое давление измеряется методом Короткова, где прибор «слушает», когда пульс достаточно четкий.
Один из первых проектов, реализованных совместно с командой Омского государственного медицинского университета (тогда еще Омской медицинской академии), — устройство контроля внутриплеврального давления (RU 2019 141 980 A). Девайс позволяет в режиме реального времени отслеживать расход и разрежение внутри полостей.
Первая серия прототипов была изготовлена на базе планшетов с Windows с парой небольших плат Arduino Nano. Аналоговая часть состояла из дифференциального усилителя и цепи выпрямления сигнала. Позже дополняли прибор промышленным пищевым датчиком расхода воздуха для анализа потока. Собранную информацию прибор хранил как локально, так и отправлял в холодное хранилище для накопления и дальнейшего анализа.
Первый прототип прибора.
Для повторения эксперимента взял датчики 040DR1. Этот модуль представляет собой плату, на которой расположен сенсор MPS20N0040D, пара конденсаторов и HX710. Он проще и доступнее используемых сейчас сертифицированных MMBPTSA20, но сенсоры имеют схожий принцип. Данные модули оснащены необходимой микросхемой усиления и АЦП, что позволяет собирать информацию по цифровому интерфейсу.
Экспериментальная плата повторяет только логику сбора информации. В исходном приборе и патенте описано измерение давления и разрежения.
В рамках НИОКР в исходном проекте выяснили, что минимально необходимая и достаточная частота сбора данных — 10 Гц. Соответственно, каждые 100 мс микроконтроллер проводит опрос и передает на «верхний» уровень значение АЦП.
Отработав получение значения с датчика давления, я приступил к реализации интерфейса для следующих, более известных датчиков.
Sp02
Методы фотоплетизмографии — довольно большая и интересная область. Одно из направлений —- пульсоксиметрия. Этот метод позволяет оценить насыщенность крови кислородом, а также подсчитать количество пульсаций кровотока. Первая волна популярности этих датчиков случилась, когда их стали включать в фитнес-браслеты. А активная массовая закупка портативных сканеров пришлась на времена COVID-19.
Занимательный факт: первое устройство с пульсоксиметром — финский пульсометр Polar, выпущенный в 1977 году. В 1984 фирма выпустила часы с этой же технологией.
Как же работает данный метод? Ученые выяснили, что кислород в крови отлично поглощает свет определенных длин волн. А еще — свет в каком спектре наиболее эффективно просвечивает кожу. Так удалось собрать устройство со светодиодом и датчиком. Первый облучает кожу, а второй определяет количество возвращенного света. О чем-то похожем, кстати, была статья-перевод на Хабре.
Для любителей давно выпускается ряд микросхем, позволяющих снять основные показатели. Наибольшую популярность получили 3010x. В отличие от упомянутой ранее HX710, микросхемы Analog Devices (до 2021 года микросхемы с этой маркировкой производила Maxim Integrated) оснащены интерфейсом I2C. Это позволяет подключить больше различных датчиков через меньшее количество проводов. Также этот интерфейс зачастую имеет аппаратную реализацию в микроконтроллерах.
Забавный факт: интерфейс I2C — нативный для ноутбуков и многих телефонов. Так, в Linux-системах вы можете поставить дополнительный пакет, просматривать устройства и обращаться к их адресам. Еще одно интересное его применение — подключение OLED через VGA именно при помощи указанной шины.
Оптимальной частотой обновления данных выбрал одну секунду. Кстати, на китайском зеленом модуле MAX30102 уже имеются подтяжки I2C к питанию. Учитывайте этот момент при присоединении других компонентов на линию.
Обложка приложения
Для удобства использования некоторую информацию можно выводить в миниатюры на главном экране телефона. Они описываются в QML-файле аналогично основным экранам.
Стандартный проект в Aurora IDE старых версий генерирует устаревший CoverPlaceholder и во время запуска приложения в консоли выдает соответствующую ошибку:
CoverPlaceholder is deprecated, use CoverTemplate instead
Используйте шаблон CoverTemplate для контента превьюшки или другие контейнеры.
Все, что необходимо для настройки превью — указать идентификатор для шаблона CoverTemplate и заполнить поле primaryText той информацией, которая будет заголовком. Дополнительно можно заменить отображаемую иконку или убрать ее. Для работы предпочитаю использовать стандартный набор значков. Пример настроенного шаблона:
…
CoverTemplate {
id: cover
objectName: "applicationCover"
primaryText: "Sp02"
description: "Не подключено."
icon {
source:"image://theme/icon-m-transfer"
sourceSize { width: icon.width; height: icon.height }
}
}
…
Далее описываю логику работы и вывода информации. Обложка аналогично другим QML-страницам может получать информацию от объектов C++. Для этого добавляется элемент Connections, целью выбирается необходимый класс (который предварительно включен в main) и настраивается взаимодействие. Так, при получении сигнала spReady срабатывает onSpReady и выполняется перерисовывание обложки:
…
Connections {
target: deviceCdc
onSpReady: {
cover.secondaryText = "ЧСС: "+ deviceCdc.hr +"nSP02: " + deviceCdc.sp + "%";
cover.description = "Подключено через: " + deviceCdc.name;
}
}
…
Созданная обложка информирует о показаниях датчика на главном экране.
Используйте обложки, это удобно.
Электрокардиограмма
Когда обучался в ОмГТУ, научный коллектив кафедры радиотехнических устройств и систем диагностики проводил разработку интеллектуального кардиомонитора. Он анализировал нагрузку и мог оповещать персонал и пользователя о необходимости дополнительного осмотра.
В магистратуре темой моей выпускной квалификационной работы (а позже и в аспирантуре) был прибор регистрации электромиограммы. Электромиограф — это прибор регистрации сигнала с мышечного волокна. Представляет собой усилитель сигнала и осциллограф. При работе мышцы каждая миофибрилла генерирует небольшую порцию электричества, и сумма этих потенциалов измеряется прибором. Однако, т. к. каждая миофибрилла работает несинхронно с другими, их импульсы не достигают большой величины.
Сердце — тоже мышца, но регистрация сигнала проще. Все волокно сокращается одновременно, давая мощный электрический импульс. Это позволяет регистрировать его практически в любом месте на теле. Такой метод активно используется, например, в Apple Watch. Когда часы находятся на руке, вы замыкаете электрическую цепь, касаясь Digital Crown. Встроенному АЦП достаточно измерять разность потенциалов и выводить данные на экран.
Описываемый кардиомонитор пригодился для оценки замедления процессов в организме мыши и проведения манипуляции после введения наркоза. Для их маленьких лапок печатали специальные «прищепки».
Электрокардиограф — единственный прибор в этой статье, который соприкасается непосредственно с человеком через электроды. Несмотря на то, что это усилитель сигнала, важно обеспечить гальваническую развязку с сетью 230В. Во-первых, это позволит обезопасить себя во время экспериментов. Во-вторых, уменьшит влияние помех от ПК на входной сигнал.
Помимо использования беспроводных устройств для отладки (ноутбук, планшет, телефон, Raspberry Pi на аккумуляторах и т. д.), стоит рассмотреть применение USB-изоляторов, например на базе распространенных ADUM4160, или же подключить плату через беспроводной интерфейс связи и питать от аккумулятора.
На тему разработки кардиографа с несколькими отведениями есть отличный цикл статей от @nikolz. Я уже заказал аналогичные чипы для экспериментов, а пока рассмотрим реализацию на базе простого и популярного AD8266.
Подход аналогичен получению информации о давлении, только здесь источником электрического сигнала является сам человек.
В качестве эксперимента использую максимально простой код: по сигналу прерывания, настроенному на 10 миллисекунд, производится считывание и отправка в UART значения из АЦП.
Забавный факт: для настройки большинства регистров AVR-чипов можно найти готовые калькуляторы. Например, для расчета UART или расчета прерываний (который сразу выдает рабочий код). Если вы только начинаете изучение микроконтроллеров, это может немного упростить жизнь.
DDRB|=0b00100000;
PORTB=0x00;
cli();
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 624;
TCCR1B |= (1 << WGM12);
TCCR1B |= (1 << CS12);
TIMSK1 |= (1 << OCIE1A);
sei();
UBRR0H = 0;
UBRR0L = 0;
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
UCSR0C = 3<<UCSZ00;
ADCSRA = 0b10000100; //16div
ADMUX = 0b01100000;
ADCSRA |= (1 << ADSC); //начало
Для АЦП указано смещение в старший регистр и при отправке берутся значения только из него. Это сделано для автоматического отброса последних двух байт. Такое грубое округление сигнала выдает более стабильные значения.
Далее при каждом прерывании таймера производится ожидание работы АЦП (вдруг оно не закончилось за несколько миллисекунд), вывод в интерфейс UART и перезапуск работы АЦП.
ISR(TIMER1_COMPA_vect){
while((ADCSRA & (1 << ADIF)) == 0);
fastprint(ADCH);
ADCSRA |= (1 << ADSC);
}
Приведенный код позволяет с достаточной оперативностью передавать данные на «верхний» уровень, чтобы отрисовать красивый график работы миокарда.
Результат работы.
Что дальше?
Очевидно, что описанные экспериментальные схемы и приложения не могут «как есть» применяться в медицине. Но благодаря этим подходам можно подключить множество различных датчиков и реализовать прототипы приборов. Например, с помощью датчика давления можно сделать манометр для шин. Или собрать схему с модулем измерения массы, добавить работу с камерой и сделать умные весы.
Пока ожидаю новую плату и микросхемы для измерения нескольких каналов ЭКГ, продолжу эксперименты с подключением приборов к телефону. Например:
- испытаю подключение ft232 в режиме bitbang,
- оценю использование cp2112, которая является конвертером USB-I2C,
- подберу АЦП с последовательным интерфейсом.
Если посоветуете в комментариях микроконтроллеры со встроенным USB (аналогичным atmega32u4 или stm-овским), буду крайне благодарен.
Автор: VRyabchevsky