Einfaches EKG mit ARM

Vor kurzem bin ich von AVR Mikrocontrollern auf ARM umgestiegen.
Nach ein wenig Herumprobieren fehlt jetzt ein anständiges Projekt.
Ich hab lange überlegt und jetzt endlich was Passendes gefunden.
Dann mal los …

Was soll das Ding können:

Erste Ableitung nach Einthofen anzeigen und sagen wir mal noch die Pulsfrequenz messen.

ErsteAbleitung

Was man so braucht:

Schaut dann erstmal so aus:

KomponentenEkg

Erste Schritte:

Zuerstmal wollte ich prüfen ob das Ganze grundsätzlich funktioniert.
Bei der Seite des Ardurino-Shields findet man den Link zu ElectricGuru ein einfaches Anzeigeprogramm
eigentlich für Neurofeedback – taugt aber auch für EKG Messungen.

ElectricGuru empfängt seine Daten über die serielle Schnittstelle.
Das Protokoll dafür ist unglaublich einfach:

0xA5 | 0x5A | 0x02 | Paketzähler | CH1 high | CH1 low | … | CH6 high | CH6 low | 0x01

Also am STM32 den Virtuellen COM-Port aktivieren ein paar ADC Messungen und das ganze an ElecGuru senden.
( Dank CubeMX ein absolutes Kinderspiel )

Erste Messung:

ElecGuru

So sah die erste Messung aus – man erkennt zwar den Herzschlag ganz gut aber so
wie ich mir das vorgestellt hab ist das noch lange nicht.
Das größte Problem scheint die Störung bei 50 Hz zu sein, wie man gut aus dem Spektrum erkennen kann.
Als nächstes werde ich mal versuchen diese herauszufiltern.

Nach 50Hz Filter:

Nach50HzFilter

Den Filter hab ich (meiner Ausbildung zum Trotz) einfach mit WinFilter berechnet:

WinFilter

Der C-Code wird einfach von WinFilter generiert.
Einfacher geht’s nicht – tolles Tool :-)

Ach ja die Elektroden hab ich jetzt schon zum zehnten mal oder so wiederverwendet
haben scheinbar immer noch guten Kontakt – Ich glaub 100 Stück reichen bis an mein Lebensende :-)

1. Ableitung:

1kHzUndElektrodenRichtig

Nach etwas Herumprobieren ist die 1. Ableitung sichtbar.
Die Abtastrate ist jetzt 1kHz da die höchste Frequenz im EKG bei etwa 500 Hz liegt.
ElectricGuru misst normalerweise mit einer Abtastrate von 256 Hz und muss
jetzt ersetzt werden. Trotzdem – tolles Programm.

Eigenes Anzeigeprogramm:

ErsatzFuerElecGuru

Wie gesagt taugt ElecGuru nun nicht mehr. Ein Ersatz in QT war schnell geschrieben.
Verwendet QLineChart und QSerialPort. Leider halt erstmal keine FFT mehr.
Das Rauschen hat wieder zugenommen – liegt aber nicht am Anzeigeprogramm.
Bei ElecGuru siehts im Moment genauso aus – keine Ahnung was grad wieder ist.

Etwas besser:

Besser

Der Störer lag wieder bei 50Hz – hab vergessen die Abtastrate für den Filter anzupassen.
Da ich ja ElecGuru nicht mehr verwenden kann hab ich die FFT von FreeMat verwendet – Super Alternative.

FreeMat

Musste auch mal schaun wie das wieder geht – hier die Befehle:

–> dat = csvread(‚E:\dat.txt‘);
–> t = dat(:, 1);
–> x = dat(:, 2);
–> y = fft(x);
–> plot(t,abs(y));

Da die FFT in FreeMat so eindeutig auf eine sinusförmige Störung bei 50Hz hinweist
ist eine Bandsperre wie zuvor mit WinFilter berechnet nicht ideal. Was eigentlich gebraucht wird
ist ein Filter der exakt nur die eine Frequenz zunichte macht aber das so gut wie restlos.
Das ist die Definition von einem Notch- oder Kerbfilter. Den Notch-Filter haben wir
im Studium mal toll erklärt bekommen (Danke Prof. Wackersreuther).
Hab’s aber nicht selbst berechnet sondern da gespitzt.
Sieht eigentlich schon ganz gut aus:

MitNotch

Erster Schritt mit dem RaspberryPI:

Hab mal ganz einfach angefangen und auf dem funktionierenden Image,
welches beim Display dabei war Qt5 installiert. Die höchste vorkompilierte Version
dafür war 5.3.2. QtCharts gibt es aber erst seit 5.7.
Hab mich dann einfach entschlossen die Charts von QWT zu verwenden – im Grunde
gefallen die mir ja auch viel besser.
Hab erstmal das Oszilloskop-Beispiel von QWT genommen – sieht doch ganz nett aus:

RPI1

Anzeigeprogramm für RaspberryPI:

EkgQwt1

Hab das Anzeigeprogramm auf QWT umgeschrieben und auf den PI portiert.
Funktioniert spitze :-) Leider gab es ein Problem. Und zwar ist das Display dermaßen langsam,
dass ich die Werte nicht mehr kontinuierlich anzeigen kann. Mache jetzt nur jede Sekunde
ein Update. Dafür sieht die Kurve jetzt schöner aus als je zuvor :-)

Ach ja – mein Puls ist wirklich so hoch :-) Grad gemessen

Platine:

Platine

In diesem Fall einfach eine Lochrasterplatine als Träger. Nicht allzu professionell –
Sieht aber halbwegs sauber aus.

Schneller booten mit Buildroot:

 

Das Image, das beim LCD-Display dabei war hab ich nun durch ein eigenes ausgetauscht.
Für die Erstellung hab ich Buildroot verwendet.
Das Ganze ging unglaublich einfach – Es gibt schon eine vorgefertigte Konfiguration für den
Raspberry PI 3. Ich musste eigentlich nur noch anwählen, dass ich
Qt5, Qwt und deren Abhängigkeiten brauche.
Das Tool ist einfach unglaublich und spuckt am Ende ein fertiges SD-Karten Image aus.
Nebenbei bekommt man auch alle Komponenten die man braucht um Software für
das neue System zu bauen – Bin absolut begeistert :-)

Vorteilhaftere Farben: