Článek nám zaslal František Hruška, děkujeme.
Zajímavým senzorem v nabídce Arduino je senzor MAX30100 vedle podobných, např. Max30102. Je určen pro měření tepu srdce a okysličení krve. Používá principy shodné s profesionálními snímači u zařízení v nemocnicích nebo také u chytrých hodinek.
Princip měření
Měření probíhá neinvazivně optickou metodou pulzní oxymetrie. Tkáň prstu se střídavě prosvěcuje impulzně paprskem světla Red o vlnové délce 650 nm a paprskem IR o vlnové délce 950 nm. Velikost odražených paprsků je různá podle velikosti okysličení hemoglobinu a podle vlnové délky. Rozdíly absorbance jsou patrné na obr.1. Vyhodnocení se provádí v programu aplikace, eliminují se rušivé vlivy a provádí se i kalibrace.
Obr.1: Princip měření okysličení krve, snímání paprsků Red a IR z prstu, a) velikost absorpce z tepny (okysličený hemoglobin), b) velikost absorpce ze žíly (hemoglobin bez kyslíku)
Rekonstrukce senzoru
Nakupovaný senzor MAX30100 má konstrukční vadu. Signály SCL, SDA, INT jsou napájeny v nakoupeném stavu napětím 1,8V přes odporu R1, R2, R3, což je velmi nízké napětí pro vytvoření signálů pro kvalitního propojení I2C a pro přerušovací systém. Viz schéma.
Obr. 1: Schéma senzoru MAX30100 (1)
Oprava se týká rekonstrukce obvodu senzoru. Nabízí se dvě možnosti. Jedna možnost je přerušit napojení napájení odporů R1, R2, R3 napětím 1,8V a napojit je na napětí 3,3V. Toto vyžaduje provést přerušení a přepojení na plošném spoji velmi jemným způsobem a se zkušenostmi.
Druhá možnost znamená vyletování SMD odporů R1, R2, R3 z plošného spoje senzoru, obvod senzoru s vyletovanými odpory napojit podle původního zapojení a vyletované odpory nahradit standardními odpory 4,7 K vně zapojení senzoru. Tak je zajištěna funkčnost senzoru celkem jednoduchým způsobem. (Doporučuje se vyletování SMD odporu provést způsobem vhodným pro zapojení SMD plošného spoje a osobou se zkušenostmi pro tuto operaci).
Umístění SMD odporů R1, R2, R3 je na obr. 2a. v části b) obrázku 2 je uvedeno nové zapojení senzoru na Arduino s vnějšími odpory R1, R2, R3.
Obr.2: a) označené odpory R1,R2,R3 pro vyletování, b) náhradní zapojení senzoru a vnějších odporů na desku Arduino.
Programování aplikace
Po otevření vývojového prostředí IDE a zapojení senzoru na Arduino a zapojení sestavy na USB lze postupovat v těchto krocích:
- Zkontroluje se nainstalování knihovny MAX30100lib by OXullo Intersecans. Chybí li, provede se její instalace.
- Programy pro otestování jsou v různém provedení k dispozici na webu, viz seznam v kapitole použitá literatura v závěru. Po zkušenostech s testováním programů na webu jsem napsal univerzální program MAX30100_FH.ino. Zdrojový text je přiložen.
- Po jeho vložení do IDE do New Sketch se zkontroluje a přeloží v položce Sketch/Ověřit/Kompilovat.
- Program má možnost řídit výpisy na obrazovce podle hodnot dvou proměnných, flag_HR=1 nebo 0 a flag_SpO2=1/0. Po spuštění dodaného programu jsou nastaveny obě hodnoty =1. Jsou vypisovány všechny hodnoty (viz výpis) pro situaci přiloženého prstu na LED senzoru:
10:36:18.190 -> HP(bpm) 52.88, SpO2(%) 97, red 16358 ,ir 16256 - Ve výpisu hodnoty času je uveden první údaj tepu srdce: HP(bpm) jako hodnota HR, dále je hodnota okysličení, SpO2 v %, a dále snímané primární hodnoty absorpce red a ir paprsků Red a IR .
- Hodnoty absorbance lze vypisovat na grafu při hodnotě flag_plot=1.
- Hodnoty flagů lze měnit ve zdrojovém programu v úvodní časti deklarace a výpisy sledovat po nahrátí přeloženého programu do modulu.
- Jako centrální jednotku lze použít všechny typy již od nejjednodušších.
Zdrojový text programu MAX30100_FH
/* upravený program podle návodů na webu pro MAX30100 */
// výstup přímo HP a SPO2, a nebo IR a LED, a nebo graf
#include <Wire.h>
#include „MAX30100_PulseOximeter.h“
#define REPORTING_PERIOD_MS 1000
// Create a PulseOximeter object
PulseOximeter pox;
MAX30100 sensor;
byte flag_HP=1; byte flag_plot=0;byte flag_redIr=1; // nastavení flagů
void onBeatDetected() {
Serial.println(„♥ Beat!“); }
void setup() {
Serial.begin(115200);delay(2000);
Serial.print(„Initializing pulse oximeter..“);
// Initialize sensor
if (!pox.begin()) {
Serial.println(„FAILED“);
for(;;);
} else {
Serial.println(„SUCCESS“);
}
pox.setIRLedCurrent(MAX30100_LED_CURR_7_6MA); // konfiguruje senzor pro 7,6 mA odběru LED
pox.setOnBeatDetectedCallback(onBeatDetected); // nastavení rutiny Callback
}
void loop() {
uint16_t ir, red;
pox.update();
if (flag_HP==1) {
Serial.print(„HP(bpm) „);
Serial.print(pox.getHeartRate());
Serial.print(„, SpO2(%) „);
Serial.print(pox.getSpO2());
if (flag_redIr==0) { Serial.println(“ „);}
}
if (flag_redIr==1) {
sensor.getRawValues(&ir, &red);
Serial.print(„, red „);Serial.print(red);
Serial.print(“ ,ir „);
Serial.println(ir);
if (flag_plot==0) { Serial.println(“ „);}
}
if (flag_plot==1) {
Serial.print(„, „);Serial.print(pox.getHeartRate());
Serial.print(„, „);
Serial.print(pox.getSpO2());
if (flag_HP==0||flag_redIr==0) { Serial.println(“ „);}
}
}
Použitá literatura:
- Interface MAX30100 Pulse Oximeter Sensor with Arduino
- Interfacing MAX30100 Pulse Oximeter and Heart Rate Sensor with Arduino (lastminuteengineers.com)
- Detektor srdečního tepu MAX30100 | LaskaKit
- Interface MAX30100 Pulse Oximeter Sensor with Arduino (microcontrollerslab.com)
- Interface MAX30100 Pulse Oximeter Sensor with Arduino (microcontrollerslab.com)
Článek nám zaslal František Hruška, děkujeme.
Jedna odpověď
Moc zajímavé a dobře zpracované. Jen ta forma vložení testovacího kódu je pro mě
taková nějaká nepřehledná.