Skocz do zawartości
moderin

Blue Pill jako czujnik HRV

Pomocna odpowiedź

Witam, dzisiaj przedstawię konstrukcję dość nietypową. Już temat brzmi zagadkowo co nie?

"Blue pill" to nazwa taniej chińskiej płytki z mikro-kontrolerem STM32 F103. Kosztuje w Polsce ok 15 zł, za granicą chodzi po $2. Parametry w porównaniu do Arduino Uno na którym zwykłem wcześniej pracować są wręcz astronomiczne. Po chwili zabawy czujemy się jak po przesiadce z Malucha do Ferrari. Mamy na pokładzie kwarc 8MHz, którym według producenta możemy taktować płytkę do 72MHz. To jest oficjalna wartość, przy której producent gwarantuje nam że nasz mikro-kontroler będzie działać. Na własną odpowiedzialność natomiast można podkręcić ją sobie do 128MHz po prostu ustawiając mnożnik PLL-ki na najwyższą wartość. To jest na tyle proste że łatwo to przypadkiem zrobić 🙂 Reszta parametrów porównując do starej poczciwej atmegi to również niebo a ziemia. Mamy 20kB ramu i 64kB flasha, pełnoprawne USB i 12-bitowe ADC. Mamy też całą masę timerów. I to wszystko za góra 15 zł.

Dobra, teraz drugie tajemnicze słowo. HVR to skrót od Hearth Rate Variability. Po polsku przebieg zmienności rytmu serca. Każdy z nas słyszał o tętnie. Serce bije z jakimś tam tempem, 60 BPM, 80 BPM itd. Przy wysiłku bije szybciej, w trakcie spoczynku wolniej. Jednak już znacznie mniej osób wie że odstępy między kolejnymi uderzeniami serca prawie nigdy nie są równe. I to nie mówię tu o małych różnicach. Zdecydowanie nie. Dobra, po prostu pokażę wam wykres.

17_12_18.thumb.png.8728acd5ac1c3d09ce98f0deef75c41b.png

Na osi Y mamy puls w uderzeniach na minutę. Na osi X mamy kolejne uderzenia serca. Czerwona linia to dokładny wykres tętna, a żółty to wartość uśredniona. Robi wrażenie? Pulsometr pokazuje wam tylko wartość uśrednioną. Żółtą linię. Widzicie tętno 80, na prawdę jednak wasze serce skacze od 65 do 95. Dzieje się tak z każdym oddechem. Nie dokładnie, ale z moich obserwacji wynika że tętno względnie synchronizuje się z oddechem. Bynajmniej w stanie koherencji. Ha, teraz co to jest koherencja? O tym za chwilę.

Co do samego urządzenia - jest to nasz ukochany Blue Pill z podpiętym czujnikiem MAX30100. Wszystko siedzi sobie na płytce stykowej. Płytkę można programować programatorem bądz przez UARTa. Co więcej jak byśmy zmienili bootloader to płytka może programować sie sama. Przez USB. Ja akurat wybrałem pierwszą opcję bo przypadkiem miałem pod ręką ST-Linka. Skąd miałem? Otórz dawno dawno temu zachwycony ARM-ami kupiłem sobie o taką płytkę. To było moje pierwsze spotkanie z ARM-ami. I wyglądało tak że spaliłem ją w ciągu jakiś 15 minut od podłączenia. Do tej pory nie wiem jak. Ale nie spaliłem pokładowego programatora który jak się okazuje bardzo chętnie przygarnia obce mikro-kontrolery. Więc naszego Blue Pilla za 15 zł można sobie podebugować nawet 🙂.

Dużo ciekawiej wygląda program. Albowiem postanowiłem nie używać żadnej biblioteki. Nawet CMSIS-a. Tak więc mamy profesjonalną tablice wektorów w Asemblerze i jakże poważnie wyglądające definicje rejestrów.

#define RCC_APB2ENR (*(volatile uint32_t *)(0x40021018))

czyż to nie jest piękne? Dobra, teraz na poważnie. Schemat działania programu jest dosyć prosty:

  1. Czekamy na przerwanie od czujnika
  2. Zczytujemy dane z czujnika
  3. Przepuszczamy je przez filtr DC
  4. ...i przez butterwortha żeby wyciąć wysokie częstotliwości
  5. Teraz mamy dość długi algorytm mający za zadanie wykryć puls.
  6. Jeśli właśnie wykryliśmy uderzenie serca (szczyt tej górki na dolnym obrazku), wyliczamy czas od poprzedniego i robimy z tego puls.
  7.  Na koniec wysyłamy co trzeba UARTem (4 bajty)

Jak działa czujnik? Czujnik składa się z diody IR i czujnika który ma za zadanie mierzyć natężenie światła z diody. Do czujnika przykładamy palec. Skóra bendzie w różnym stopniu przepuszczać światło, w zależności od chwilowego ciśnienia krwi. MAX30100 ma 16-bitowe ADC i konfigurowalną częstotliwość próbkowania. W moim projekcie używam 1000Hz. Niestety jak chcemy mieć dużo próbek to nie mamy pełnych 16 bitów 😞 . Po przefiltrowaniu mamy coś takiego:

wow!.thumb.png.70c85f860ff4e7f6df3cc83364b620fc.png

Dla jasności: screen jest stary, jak jeszcze nie był na 1kHz, stąd skala inna (wtedy było 50-100Hz, nie pamiętam już).

A tak wygląda wykrywanie uderzeń serca:

Beat_detect.thumb.png.aba85a0b6d65272d2f779c9756051ad8.png

A teraz efekt końcowy. Spójrzcie na dwie sytuacje:

cmp2.thumb.png.4f95bad1f403914be53ec97564001c8b.png

Tak jak na początku mamy puls na osi Y i uderzenia na osi X. W pierwszej sytuacji robiłem pomiar w sytuacji stresowej. Wykres jest zupełnie chaotyczny. W drugiej mamy tzw. stan koherencji. Pomiar robiłem jakąś godzinę później, jak sytuacja stresowa minęła. Serce elegancko przyspiesza i zwalnia. Co więcej ze stanu pierwszego da się w ciągu paru minut świadomie przejść do stanu drugiego, po prostu przywołując pozytywne wspomnienia. Nie chcę tu za dużo opowiadać bo powoli wchodzimy w medycynę. A tutaj, bazując tylko na książkach mogę nie być najlepszym źródłem wiedzy.

Software na komputerze:

  • PlatformIO (po podaniu pliku linkera potrafi działać bez frameworka)
  • SerialPlot - bardzo fajna maszyna do  rysowania wykresów z tego co idzie po uarcie.

Na koniec parę zdjęć konstrukcji:

IMG_5576.thumb.JPG.fea676da5c46cf4120401847db7032b4.JPGIMG_5602.thumb.JPG.cbc89587653650a0f840343fcead611e.JPGIMG_5603.thumb.JPG.09b692aaf8bfb207ee034144a1db1f2c.JPG

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Podoba Ci się ten projekt? Zostaw pozytywny komentarz i daj znać autorowi, że zbudował coś fajnego!

Masz uwagi? Napisz kulturalnie co warto zmienić. Doceń pracę autora nad konstrukcją oraz opisem.

@moderin, witam na forum 😉 Widzę, że to Twoje pierwsze kroki na Forbocie, oto najważniejsze informacje na start:

  • Chcesz przywitać się z innymi członkami naszej społeczności? Skorzystaj z tematu powitania użytkowników.
  • Opis najciekawszych funkcji, które ułatwiają korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzieć?
  • Poszczególne posty możesz oceniać (pozytywnie i negatywnie) za pomocą reakcji - ikona serca w prawym dolnym rogu każdej wiadomości.
21 godzin temu, moderin napisał:

Witam, dzisiaj przedstawię konstrukcję dość nietypową. Już temat brzmi zagadkowo co nie?

Właśnie zaakceptowałem Twój opis. Dziękuję za opis ciekawego projektu, zachęcam do prezentowania kolejnych DIY oraz aktywności na naszym forum 😉

Udostępnij ten post


Link to post
Share on other sites

Świetny projekt, ciekawe podejście i temat. Trochę kłuje w oczy to pisanie w "czystych rejestrach",  bo trochę nie rozumiem, po co się tak katować 🙂 

Udostępnij ten post


Link to post
Share on other sites

@moderin Bardzo ciekawy projekt, sam kupię ten czujnik, szczególnie nie mówimy o astronomicznych kwotach 🙂

Mam jednak pytanie - puls to ilość uderzeń serca w określonej jednostce czasu. I ta ilość zmienia się z każdym wdechem/wydechem? Czyli wykres to puls=f(czasu)? Co ile następuje taka zmiana, można powiedzieć "okres" niby-sinusoidy?

Udostępnij ten post


Link to post
Share on other sites

Wykres może wyglądać jak sinusoida, ale  nie musi. Zależy to od naszego stanu emocjonalnego - wszelkie negatywne emocje oraz stres sprawiają że wykres się "psuje", z ładnej eleganckiej sinusoidy robi się totalny chaos (ostatnie dwa wykresy). Podobnie jest z depresją. Często występują też stany pośrednie - wykres przypomina sinusoidę ale wciąż jest nierówny.

@wn2001 Wykres jest odświeżany w momencie nadejścia nowych danych z UARTa. Te powstają po wykryciu uderzenia serca. Wykres puls=f(t) wyglądałby trochę inaczej, bo odległości między kolejnymi uderzeniami serca nie są równe. A na osi X punkty są w jednakowej odległości. Różnica niewielka, ale jest. Okres względnie zależy od szybkości oddechu. Względnie bo mam wrażenie że serce jest trochę niezależne. Na przykład gdy po wydechu (puls niski) na chwilę wstrzymamy oddech, puls mimo to pójdzie trochę do góry, jakby "nie zauważył" że wstrzymaliśmy oddech. Zatrzyma się może w 1/3 wysokości amplitudy (z moich obserwacji). Amplituda natomiast zależy np. od wieku. Im człowiek starszy tym będzie mniejsza.

@Zealota Dzięki, co do pisania w rejestrach - najpierw miało być w Asemblerze 🙂 . Nie wiem coś tak mnie naszło. Takie ambicje dziwne. Nawet tutorial zrobiłem na blinka w Asemblerze. Od 2 miesięcy google pokazuje całe 2 kliknięcia 😄 . W końcu się poddałem bo program się robił długi jak dżdżownica i znalezienie jakiegokolwiek błędu graniczyło z cudem. Więc teraz jest w C.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Myślałeś nad dodaniem drugiej diody o innym paśmie i mierzeniu też natlenienia krwi?

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dioda nawet tam jest. I po włączeniu bardzo fajnie świeci  🙂 . Tyle że na ten moment nie bardzo wiem do czego by to mogło służyć.

Sam pomysł na tą maszynę wziął się z pewnej książki - autor jako jeden ze sposobów walki ze stresem i depresją opisywał kontrolowanie własnego serca - pokazując właśnie wykres HRV w stanie koherencji i w stanie chaosu. Mówił jak świadomie ze stanu chaosu przechodzić do koherencji (po prostu przywołując pozytywne wspomnienia) i jakie niesie to za sobą skutki po dłuższym czasie.  Tak średnio w to wierzyłem. I stąd pomysł żeby to sprawdzić. Za 35zł 😄.

Także to był główny cel projektu. Ale jak się dowiem co można ciekawego zrobić z pomiarów SpO2 to wystarczy zmienić program.

Udostępnij ten post


Link to post
Share on other sites

Tu masz świetny dokument od NXP który wyjaśni absolutnie wszystko co mógłbyś chcieć wiedzieć: https://www.nxp.com/docs/en/application-note/AN4327.pdf

Ogólnie krew różnie pochłania światło w zależności od natlenienia. Jak masz dwie diody o różnym widmie to odrobiną matematyki możesz to przeliczyć.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Interesujące. W mojej "sportowej" karierze zajechałem dwa pulsometry i nigdy nie zastanawiałem się głębiej nad rytmem serca. Mam przed gwizdkiem startowym 100 to mam, mam na sprintach lub podjazdach 180 (no, stary już jestem..) to też OK a tu się okazuje, że pomiędzy kolejnymi uderzeniami tyle ciekawych rzeczy się dzieje. Wow. I o ile pulsometrowi wystarczy, że zaliczy uderzenie i dołączy do średniej z kilku(nastu?) ostatnich sekund to tutaj wręcz kluczowe wydaje się precyzyjne określanie punktu w czasie. Napisz może o tym coś więcej, bo to najbardziej smakowita część zadania, reszta to jakieś transmisje i wykresy. Nie oczekuję kodu, ale byłoby fajnie dowiedzieć się w prostych żołnierskich słowach jakich metod (DSP?) użyłeś by jednoznacznie i zawsze w tym samej fazie cyklu wykrywać bit. Możemy na to liczyć? Czy to zwykłe oczekiwanie na zmianę znaku pochodnej przy jednoczesnej dużej amplitudzie (poszukiwanie szczytu), momenty przejścia przez zero? A może zrobiłeś jakieś cyfrowe PLL i określasz przesunięcie fazy? 

BTW: Czy masz jakieś wykształcenie medyczne lub planujesz je mieć? Co Cię zainspirowało do zajęcia się pomiarami HVR? Jakaś literatura? Czy wyniki o których piszesz: synchronizacja z oddechem i sterowanie wielkością koherencji - są to tylko Twoje doświadczenia, czy robiłeś jakieś dłuższe eksperymenty (niekoniecznie na sobie) i czy wyniki ich są powtarzalne? Myślę tu głównie o tym uspakajaniu się, ew. wspomaganym sprzężeniem zwrotnym od pomiaru HVR. To moim zdaniem bardzo fajne spostrzeżenia. Czy takie urządzenia są stosowane w jakichś terapiach? Czy są dostępne handlowo? No, dużo pytań, ale i temat ciekawy, dla mnie zupełnie nowy a jednocześnie jak podkoszulka - bliski ciała 🙂

Moim zdaniem natlenienie jest w tym temacie sprawą trzeciorzędną. Druga dioda jest, bo czujnik zaprojektowano pod pulsometry a w wysiłku i późniejszym odpoczynku tlen jest ważny i pewnie można z tego wyciagać jakies wnioski dotyczące odległości danej mocy od progu mleczanowego. Tutaj chyba nie ma nic do rzeczy - uważam, choć oczywiście kompletnie się na tym nie znam. Czyli jak zwykle.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Samo wykrycie uderzenia wygląda tak:

if((fl < max_value) && (max_value != 0) && (max_value > (last_beat_value/2)) && (max_age <= 10)) {                                                                                                                                                                                                                   
	if (last_beat_age > (uint16_t)((109.0/400.0)*SAMPLING_RATE)) {                                                                                           
        // Mamy uderzenie                                                                                                             
	}                                                                                                                                                       
} 
  • fl - filtered value - aktualny odczyt po filtrach
  • max_value - odczyt może ją podnieść, ale nie może obniżyć (przy wykryciu uderzenia będzie to wartość poprzedniego odczytu)
  • last_beat_value - wartość odczytu z poprzedniego uderzenia serca. Warunek: (max_value > (last_beat_value/2)) ma za zadanie wykluczyć mniejsze szczyty. Nie można ustalić tu stałego poziomu od jakiego akceptujemy uderzenia, bo w zależności od tego jak położymy palec amplituda potrafi parę razy wzrosnąć lub zmaleć.
  • max_age - czas w próbkach od ostatniego podbicia max_value.
  • last_beat_age  - czas od ostatniego uderzenia, żółta linia:

12198355_Screenshotfrom2019-01-1515-12-35.thumb.png.8e84724e45c49b4e2149ebbcdf34c2bd.png

  • (109.0/400.0)*SAMPLING_RATE - wyjdzie 272.5 próbek, tj 0.27s czyli czas między uderzeniami przy tętne 220. Zakładam że nie będe wyżej mierzyć.

Czyli po prostu czekamy aż wykres zacznie spadać i na różne sposoby próbujemy rozpoznać czy to ten szczyt który nas interesuje. Nie wiem na ile jest to precyzyjna metoda - ciężko sprawdzić bez EKG. Ale zdaje się działać.

 

18 godzin temu, marek1707 napisał:

BTW: Czy masz jakieś wykształcenie medyczne lub planujesz je mieć? Co Cię zainspirowało do zajęcia się pomiarami HVR? Jakaś literatura? Czy wyniki o których piszesz: synchronizacja z oddechem i sterowanie wielkością koherencji - są to tylko Twoje doświadczenia, czy robiłeś jakieś dłuższe eksperymenty (niekoniecznie na sobie) i czy wyniki ich są powtarzalne? Myślę tu głównie o tym uspakajaniu się, ew. wspomaganym sprzężeniem zwrotnym od pomiaru HVR. To moim zdaniem bardzo fajne spostrzeżenia. Czy takie urządzenia są stosowane w jakichś terapiach? Czy są dostępne handlowo? No, dużo pytań, ale i temat ciekawy, dla mnie zupełnie nowy a jednocześnie jak podkoszulka - bliski ciała 🙂

W liceum jestem 🙂. Bazuje na dwóch książkach: "Antyrak" i "Zdrowiej!" - obie tego samego autora, dr. Davida Servan-Schreibera. Zacytuje fragment:

"Badania przeprowadzone na kierowniczej kadrze dużych przedsiębiorstw wykazują, że oddziaływanie stanu koherencji na fizjologie znajduje wyraz w łagodzeniu normalnych przejawów stresu: liczba osób twierdzących że dostają palpitacji serca ""często albo niemal cały czas" spada z 47% (!) do 30% w ciągu 6 tygodni, a do 25% w ciągu 3 miesięcy. Objawy wewnętrznego napięcia spadają z 41% do 15%, a później do 6%, bezsenności z 34% do 6%, zmęczenia z 50% do 12%." - tego jest kilka stron.

Czy są dostępne handlowo nie wiem, część smartfonów z takim czujnikiem ma opcję "mierzenia stresu", przypuszczam że może to działać właśnie na takiej zasadzie.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...