— Слушайте, а какой пульс должен быть во время пробежки?
— Ну не знаю – ударов 150.
— Да? А чего у меня 840?
— 840 в минуту?!
— А что, надо было в минуту считать что ли?
— А ты как считал?
— Ну, просто считал, пока не сбился… Так, ладно, я пошел пересчитывать.
(х/ф «День выборов»)
Почти точно про китайский пульсометр. Как говорится, если хочешь сделать что-то хорошо, то сделай это сам. И если устройство работает не так, как от него требуется, то возможно его получится улучшить?

Многие люди из тех, кто интересуется спортом, следят за частотой сердечных сокращений во время тренировок. Для этого и используются мониторы сердечного ритма. Рассматривать все их виды в задачу данной статьи не входит, но одними из самых надежных и проверенных являются нагрудные датчики пульса, принимающие электрические сигналы от сердца.
В связи со своей сильно повышенной физической активностью и был приобретен монитор ЧСС Kyto 2809. Пульс — это хорошо, но была потребность относительно точного замера RR интервалов. Пульсометр поддерживает два протокола: ANT+ и BLE. По спецификациям они оба, помимо непосредственно ЧСС, передают длительность RR интервалов.
Величина RR интервалов не постоянна, а изменяется. Это называется вариабельностью сердечного ритма. Анализируя вариабельность можно делать выводы о состоянии спорстмена, наличии перетренированности (см. статью Александра Вертышева «Анализ записи RR интервалов» в журнале «Лыжный спорт»). Также есть исследования по определению аэробного и анаэробного порогов.
Для записи данных с обоих каналов было написано приложение на Android под свои нужды с логом данных в текстовые файлы. Как более менее адекватный эталон был взят аналоговый пульсометр посылающий сигнал на частоте 5,3кГц, подключенный через ардуину непосредственно на ПК.
Первое сравнение слегка опечалило.

«Устройство» на один реальный удар сердца выдавало 4-5 несуществующих (на синем графике видно обилие точек). Пульс даже с учетом возможного усреднения точность не блещет. Про замер RR интервалов речи вообще не идет.
Общение в производителем результатов не принесло. Кроме нескольких видеозаписей, попыток меня убедить, что все отлично и фразы: «KYTO2809 heart rate datas are accurate!», я от них ничего не добился. Тут взгляд упал на коробку с отвертками. Открыв корпус обнаружил чип nRF51422.

Зная, что для этих МК есть SDK, было решено попробовать его перепрошить. Программа там нужна простейшая: с усилителя электросигналов сердца (черная капля на фото) сигнал поступает на вход МК, а дальше дело техники, ловим импульсы через прерывания, замеряем время между ними и выводим все этого через BLE и ANT+. Все просто, но видимо у китайских программистов что-то пошло не так.
Программируются данные чипы через SWD. Родная прошивка была защищена от чтения. Посему без раздумий была выполнена команда «format c:» «--eraseall». На плате даже выведены соответствующие контакты. Вход с усилителя электрических сигналов сердца P0.07. Распиновка самого BLE-модуля такая (сверху вниз):
- GND
- VDD
- P0.30
- P0.00
- P0.01
- P0.02
- P0.03
- P0.04
- P0.05
- P0.06
- P0.07
- P0.08
SDK содержит много примеров, достаточных для написания своей прошивки. Чип достаточно старый и SDK под него тоже устаревшая 10-й версии. Используя их на пульсометры были подняты BLE-сервисы: Device Information, Battery Service, Heart Rate. Был добавлен профиль HeartRate для ANT+. Таймером замеряем RR интервалы, отправляем данные в профили BLE и ANT+. Для экономии заряда при отсутствии внешних раздражителей (в течение 5 сек) пульсометр переводим в спящий режим. При появлении пульса (прерываний на входе) МК просыпается. В прошивкой от производителя Kyto2809 постоянно передавал advertising пакеты по BLE, т.е. при использовании только ANT+ канала, BLE продолжал слать пакеты и садить батарейку. Я ограничил время advertising 5-ю минутами, что должно положительно сказаться на экономичности.
Испытания показали, что для параметра Calculated Heart Rate лучше ввести фильтрацию (отбрасывать заведомо недостоверные данные, т.е. пульс ниже 30 и выше 240) и усреднение скользящим средним значением. Итоговое сравнение с аналоговым пульсометром ниже. Различия в замерах RR интервалов 0-2 мс, что вполне допустимо.

Из полезных функций добавлена возможность обновления прошивки OTA (оригинальное название DFU OTA). Теперь зашив OTA-bootloader можно без труда обновлять firmware, если захочется что-нибудь поменять в коде. Прошивка делается со смартфона через фирменную утилиту nRFConnect. Так же, если не ошибаюсь, можно сделать поддержку OTA в своем Android приложении, для этого есть библиотеки. К сожалению, чтобы залить в память bootloader нужно подключаться через SWD, т.к. изначально OTA не была предусмотрена производителем.
Порядок прошивки:
- шьем SoftDevice310, это BLE и ANT+ стек от Nordic;
- шьем Kyto_DFU_bootloader.hex (корпус можно собрать);
- через nRFConnect заливаем готовый пакет kyto_hr_dfu.zip
Два последних файла лежат тут. Там же прошивка без OTA (KytoHR.hex).
Автор: greyfox13