— Ну не знаю – ударов 150.
— Да? А чего у меня 840?
— 840 в минуту?!
— А что, надо было в минуту считать что ли?
— А ты как считал?
— Ну, просто считал, пока не сбился… Так, ладно, я пошел пересчитывать.
(х/ф «День выборов»)
Почти точно про китайский пульсометр. Как говорится, если хочешь сделать что-то хорошо, то сделай это сам. И если устройство работает не так, как от него требуется, то возможно его получится улучшить?
![](https://habrastorage.org/webt/fe/pp/23/fepp230sxqy_lyvvcnoihcc1_ey.png)
Многие люди из тех, кто интересуется спортом, следят за частотой сердечных сокращений во время тренировок. Для этого и используются мониторы сердечного ритма. Рассматривать все их виды в задачу данной статьи не входит, но одними из самых надежных и проверенных являются нагрудные датчики пульса, принимающие электрические сигналы от сердца.
В связи с моей сильно повышенной физической активностью и был приобретен монитор ЧСС Kyto 2809. Пульс — это хорошо, но была потребность относительно точного замера RR интервалов. Пульсометр поддерживает два протокола: ANT+ и BLE. По спецификациям они оба, помимо непосредственно ЧСС, передают длительность RR интервалов.
![](https://habrastorage.org/webt/yd/in/ea/ydineadtr4darurwgdkucttqlse.png)
Величина RR интервалов не постоянна, а изменяется. Это называется вариабельностью сердечного ритма. Анализируя вариабельность можно делать выводы о состоянии спорстмена, наличии перетренированности (см. статью Александра Вертышева «Анализ записи RR интервалов» в журнале «Лыжный спорт»). Также есть исследования по определению аэробного и анаэробного порогов.
Для записи данных с обоих каналов было написано приложение на Android под свои нужды с логом данных в текстовые файлы. Как более-менее адекватный эталон был взят аналоговый пульсометр, посылающий сигнал на частоте 5.3кГц, подключенный через ардуину непосредственно к ПК.
Первое сравнение слегка опечалило.
![](https://habrastorage.org/webt/kf/yp/xw/kfypxwjqzbjd1jif9yp-dh9kto0.png)
«Устройство» на один реальный удар сердца выдавало 4-5 несуществующих (на синем графике видно обилие точек). Пульс, даже с учетом возможного усреднения, точностью не блещет. Про замер RR интервалов речи вообще не идет.
Общение с производителем результатов не принесло. Кроме нескольких видеозаписей, попыток меня убедить, что все отлично, и фразы: «KYTO2809 heart rate datas are accurate!», я от них ничего не добился. Тут взгляд упал на коробку с отвертками. Открыв корпус, обнаружил чип nRF51422.
![](https://habrastorage.org/webt/au/wi/0b/auwi0bchg8cuiqj74jaz-elv49g.jpeg)
Зная, что для этих МК есть SDK, я решил попробовать его перепрошить. Программа там нужна простейшая: с усилителя электросигналов сердца (черная капля на фото) сигнал поступает на вход МК, а дальше дело техники, ловим импульсы через прерывания, замеряем время между ними и выводим все этого через BLE и ANT+. Все просто, но видимо у китайских программистов что-то пошло не так.
Программируются данные чипы через SWD. Родная прошивка была защищена от чтения. Посему без раздумий была выполнена команда
- 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 мс, что вполне допустимо.
![](https://habrastorage.org/webt/aa/rw/qw/aarwqwkdl2sg16sbflzjv2itsw0.png)
Из полезных функций добавлена возможность обновления прошивки 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).
Metotron0
После кода на первой пикче сразу же вспомнился клип Vitalic — Stamina. Хотя я бы не советовал его впечатлительным людям.