EKG monitor srdeční frekvence obsahuje senzor AD8232. Tento senzor od firmy Analog Devices zajišťuje veškerou detekci srdeční aktivity, která je měřena pomocí tří elektrod. Tyto elektrody je nutné správně nalepit na tělo, kdy na obrázku níže jsou uvedeny dva možné scénáře. Avšak rád bych zde upozornil, že pro lepší výsledky doporučuji druhý scénář, tedy umístění elektrod blíže srdci. Samotný senzor AD8232 je možné napájet napětím v rozmezí 2 až 3,5 Voltu a proudový odběr se typicky pohybuje okolo 170 mikroAmpér.
Pro úspěšné propojení modulu se senzorem AD8232 a Arduino desky je nutné zapojit celkem 5 propojovacích pinů. Propojíme GND se zemí Arduina, 3.3V s 3,3V Arduina, OUTPUT s pinem A0, LO- s pinem D11 a LO+ s pinem D10. Datové piny LO- a LO+ je možné zapojit také na jiné volné piny. Analogový pin OUTPUT pak můžeme zapojit na jiný volný analogový pin. Ale při kterékoliv ze zmíněných změn je nutné tuto volbu provést také na začátku programu. Poslední pin SDN není v tomto příkladu využit, ale slouží pro uspání celého modulu, které lze realizovat připojením tohoto pinu na zem.
Ukázkový kód je rozdělen na dvě části, přičemž první část je nahrána přes Arduino IDE. V tomto ukázkovém kódu se na začátku nachází nastavení čísel propojovacích pinů. V podprogramu setup nastavíme nejprve komunikaci po sériové lince a následně nastavíme směr všech vstupních pinů. Nekonečná smyčka loop pak vždy nejprve zkontroluje digitální piny LO+ a LO-, jestli alespoň jeden z nich není aktivní. Pokud se tak stane, tak po sériové lince vytiskneme znak vykřičníku. Pokud ale žádný ze zmíněných pinů aktivní není, víme, že probíhá správně měření srdeční aktivity, a proto po sériové lince vytiskneme hodnotu načtenou z analogového pinu OUTPUT. Po každé kontrole a odeslání informace po sériové lince následuje už jen krátká pauza po dobu jedné milisekundy a smyčka loop se opakuje.
// Arduino EKG monitor srdeční aktivity // Arduino IDE ukázkový kód // nastavení čísel propojovacích pinů #define LOplus 10 #define LOminus 11 #define output A0 void setup() { // komunikace po sériové lince rychlostí 9600 baud Serial.begin(9600); // nastavení směru vstupních pinů pinMode(LOplus, INPUT); pinMode(LOminus, INPUT); pinMode(output, INPUT); } void loop() { // pokud je alespoň jeden z LO pinů aktivní, vytiskneme // po sériové lince znak vykřičníku if ((digitalRead(LOplus) == 1) || (digitalRead(LOminus) == 1)) { Serial.println('!'); } // v opačném případě vytiskneme načtenou hodnotu // z analogového pinu else { Serial.println(analogRead(output)); } // krátká pauza před odesláním dalších dat delay(1); }
Pro druhou část ukázkového kódu je nutné nainstalovat program Processing verze 2.2.1, který lze stáhnout zde. Tento program umožňuje číst ze sériového portu zpět do počítače načtené hodnoty a převádět je na graf, který nám vykreslí srdeční aktivitu. Ukázkový kód obsahuje na svém začátku importování rozšíření práce se sériovou linkou, vytvoření objektu typu sériová linka a proměnných pro měření a ukládání výsledků. V podprogramu setup nejprve nastavíme velikost okna s výstupem dat a poté vypíšeme do konzole ve spodní části okna programu Processing všechny dostupné sériové linky. V dalším kroku vybereme po prvním spuštění náš vybraný sériový port, který používáme i pro nahrávání programu přes Arduino IDE. V mém případě je to druhý port v pořadí, přičemž pořadí je číslováno od nuly – proto tedy vyberu z listu port 1. Poté pro první volání čekáme na příjem prvního oddělovače řádků a následně nastavíme výchozí pozadí na bílou barvu. Podprogram draw je v tomto případě prázdný, protože veškerá aktivita je v podprogramu serialEvent, který pracuje se sériovou linkou. V něm si načteme do proměnné typu String obsah ze sériové linky do obdržení znaku nového řádku. Následně dekódujeme přijatou zprávu. V prvním kroku po kontrole, že přijatá zpráva není prázdná, z ní vymažeme prázdné znaky a následně zkontrolujeme přijatý znak. Pokud se jedná o vykřičník, tak víme, že měření neprobíhá správně, a proto si nastavíme pro výpis modrou barvu a vstupní hodnotu 512, která odpovídá středu obrazovky. Pokud by se ale jednalo o jinou hodnotu než vykřičník, nastavíme barvu na červenou a do proměnné vstupByte si převedeme vstup na proměnnou typu float. Následně vstupní proměnnou namapujeme na nastavenou výšku okna, vypočítáme novou výšku pulzu a vykreslíme čáru pro aktuální okamžik. Tato čára je z pozice [x-1, stará výška] do pozice [x, nová výška]. Poté uložíme pro další měření do proměnné se starou výškou hodnotu aktuální výšky. Jako poslední se v tomto kódu nachází kontrola pozice na ose X. Pokud dosáhneme maxima vykreslovacího okna, nastavíme si zpět pozici na nulu a vymažeme vykreslovací okno. V opačném případě, kdy ještě na maximu nejsme, si přičteme k pozici X jedničku pro posun dalšího výpisu.
// Arduino EKG monitor srdeční aktivity // Processing ukázkový kód import processing.serial.*; Serial mujPort; int xPozice = 1; float vyska_stara = 0; float vyska_nova = 0; float vstupByte = 0; void setup () { // nastavení velikosti okna s výstupem dat size(1000, 400); // výpis všech dostupných sériových linek println(Serial.list()); // nastavení použitého portu, v mém případě se jedná // o druhý port v pořadí, pořadí je od nuly mujPort = new Serial(this, Serial.list()[1], 9600); // do obdržení konce prvního řádku nebudeme volat serialEvent funkci mujPort.bufferUntil('\n'); // nastavení výchozího pozadí background(0xff); } void draw () { // veškerý běh programu je ve funkci serialEvent } void serialEvent (Serial mujPort) { // načtení vstupu ze sériové linky do obdržení oddělovače nového řádku String vstupString = mujPort.readStringUntil('\n'); if (vstupString != null) { // odstranění prázdných znaků v přijaté zprávě vstupString = trim(vstupString); // pokud je načten znak vykřičníku, nastavíme tisk na modrou barvu if (vstupString.equals("!")) { stroke(0, 0, 0xff); // složky barvy RGB vstupByte = 512; // nastavení středu výpisového okna (max je 1024) } // pokud jsou data v pořádku, nastavíme červenou barvu // a uložíme výsledek do proměnné typu float else { stroke(0xff, 0, 0); vstupByte = float(vstupString); } // přemapování načtené hodnoty pro aktuální vstupByte = map(vstupByte, 0, 1023, 0, height); // přepočtení nové výšky pulzu vyska_nova = height - vstupByte; // vykreslení čáry line(xPozice - 1, vyska_stara, xPozice, vyska_nova); vyska_stara = vyska_nova; // pokud dosáhneme konce výpisového okna, nastavíme tisk // opět od začátku a příkazem background vymažeme okno if (xPozice >= width) { xPozice = 0; background(0xff); } else { // posun v ose X xPozice++; } } }
Po nahrání ukázkového kódu do Arduino desky s připojeným modulem EKG monitor dostaneme například tento výsledek po spuštění programu pro Processing:
Modul EKG monitor srdeční frekvence je velice zajímavým vstupním modulem pro Arduino. Umožňuje vytvořit z Arduina poměrně přesný detektor srdeční aktivity a tím se nabízí jako zajímavý modul pro projekty s fitness trackery, monitory srdce, herním příslušenstvím a další. Jak jsem ale zmínil v úvodu, je doporučeno připojit dané elektrody co nejblíže k srdci a také dodržet pozice jednotlivých elektrod podle jejich názvů dle obrázku. Při připojení dle prvního scénáře na ruce a nohu jsem totiž dosahoval poměrně velkého rušení. A na závěr bych chtěl upozornit, že tento Arduino modul nelze považovat za plnohodnotnou náhradu EKG monitoru srdeční aktivity, protože slouží pouze pro orientační měření.
Seznam použitých komponent:
https://dratek.cz/arduino/974-arduino-uno-r3-atmega328p-1424115860.html