Meranie PPG signálu pomocou senzora MAX30102
1. Teoretický úvod
Modul MAX30102 (Obr. 1) predstavuje integrovaný pulzný oximeter a monitor srdcovej frekvencie. Obsahuje interné LED diódy, fotodetektory a nízkošumové elektronické komponenty, ktoré zabezpečujú potlačenie okolitého osvetlenia. Obvod MAX30102 je ľahko integrovateľný do návrhov mobilných a nositeľných zariadení. Na svoju činnosť potrebuje napätie 1,8 V a samostatný zdroj 3,3 V (typicky) pre napájanie interných LED diód. Napájanie interných LED diód môže byť zvýšené na maximálne 5V bez rizika ich poškodenia. MAX30102 obsahuje 18-bit AD prevodník a komunikuje cez štandardné I2C rozhranie. Modul je možné softvérovo prepnúť do pohotovostného režimu s nulovou spotrebou prúdu.

Modul sníma fotopletyzmografický (PPG) signál na reflektívnom princípe (Obr. 2). Na osvetlenie podkožia sa používajú dve LED diódy s vlnovými dĺžkami 660 nm (červená) a 880 nm (infračervená). Vďaka použitiu rôznych vlnových dĺžok môžeme vypočítať nasýtenie krvi kyslíkom a preto môžeme MAX30102 považovať za oximeter, hoci túto hodnotu priamo nepočíta (musí byť dopočítaná z nameraných PPG kriviek).

Integrovaný obvod MAX30102 sa vyrába iba v prevedení SMD. Pre účely odskúšania a testovania obvodu je vhodné použiť obvod naspájkovaný na rozširujúcej DPS. V laboratórnom cvičení budeme používať rozširujúcu DPS s označením GY-MAX30102 (Obr. 3).

Modul môže byť napájaný vstupným napätím 5 V alebo 3,3 V. Modul obsahuje okrem senzora MAX30102 aj stabilizátor napätia na 3,3 V a 1,8 V, ktoré sú určené na napájanie LED a samotného obvodu MAX30102. Ďalej obsahuje pull-up rezistory, filtračné kondenzátory a obvod na úpravu logických úrovní. Elektrická schéma zapojenia je uvedená na Obr. 4.

1.1 Princíp činnosti senzora
Výstup z fotodetektora je digitalizovaný AD prevodníkom. Maximálne rozlíšenie AD prevodníka je 18-bit/vzorka (necelé tri bajty). Digitálne vzorky sú ukladané do FIFO (First In First Out) zásobníka (buffer). Vďaka zásobníku nemusia byť vzorky čítané po jednej, ale po blokoch alebo môže byť prečítaný naraz celý zásobník. Zásobník FIFO umožní uložiť maximálne 32 vzoriek z červeného kanála a 32 vzoriek z infračerveného kanála. Ak má každá vzorka 3 bajty, tak maximálna kapacita FIFO zásobníka je 192 bajtov: 32 vzoriek × 3 bajty = 96 bajtov pre červený kanál a rovnaký počet bajtov pre infračervený kanál. Pozícia aktuálnej (najnovšej) vzorky v zásobníku je indikovaná pomocou ukazovateľa. Ukazovatele sú dva: pre čítanie a zápis, pretože čítanie vzorky zo zásobníka nemusí prebiehať synchrónne so zápisom. Podrobnosti o čítaní a zapisovaní do zásobníka sú uvedené v katalógovom liste na strane 15 a nebudeme ich ďalej rozvádzať, pretože na prácu so senzorom budeme používať predpripravenú knižnicu.
Senzor môže pracovať v 2 základných režimoch: HR a SpO2. V režime HR (Heart Rate) je aktívna iba červená LED. Názov režimu je odvodený z toho, že umožňuje z jedného kanála PPG vypočítať srdcovú frekvenciu - Heart Rate (HR). V prípade čínskeho klonu senzora MAX30102 sú LED zamenené, to znamená, že v HR móde je aktívna infračervená LED namiesto červenej. Klon je použitý aj pre modul GY-MAX30102, ktorý používame v tomto laboratórnom cvičení. V režime SpO2 sú aktívne obe LED. Z dvoch kanálov PPG, ktoré boli získané z LED rôznych vlnových dĺžok je možné vypočítať nasýtenie krvi kyslíkom (SpO2) a preto bol pre tento režim zvolený taký názov.
Osvetľovacie LED pracujú v pulznom režime. V prípade SpO2 režimu sa striedajú. Počas zasvietenej LED je digitalizovaný údaj z fotodetektora. Čím je trvanie impulzu (doby rozsvietenej LED) dlhšie tým je väčšie bitové rozlíšenie. Najdlhšie trvanie impulzu (411 µs) umožňuje získať maximálne bitové rozlíšenie (18-bit). Nastaviteľné šírky impulzu sú uvedené v hlavičke tabuľky na Obr. 5. Každé skrátenie impulzu znižuje rozlíšenie o jeden bit. Šírka impulzu 69 µs umožňuje bitové rozlíšenie 15-bit/vzorka. Šírka impulzu súvisí s nastavením vzorkovacej frekvencie. Súvislosť medzi vzorkovacou frekvenciou a dobou rozsvietenej LED (šírkou impulzu) je zobrazená na Obr. 5.

Časovanie rozsvietenia LED v SpO2 móde pre najväčšiu šírku impulzu a vzorkovaciu frekvenciu 200 Hz je zobrazené na Obr. 6.

Okrem módu, šírky impulzu a vzorkovacej frekvencie je možné nastaviť prúd cez LED diódy, rozsah AD prevodníka a priemerovanie vzoriek. Priemerovanie vzoriek redukuje šum z prostredia. Nastavenie jednotlivých parametrov realizujeme cez funkciu MAX30102_setup, ktorá je opísaná v časti 1.3.
1.2 Komunikácia
MAX30102 komunikuje cez I2C rozhranie. Podporuje frekvenciu do 400 kHz (Fast speed). Adresa senzora (7-bit) pre I2C komunikáciu je 0x57 (0b1010111).
Zápis cez I2C
Zápis sa vykonáva zaslaním adresy senzora (Slave address) spolu s režimom zápisu (bit R/W ̅=0), t.j. 0b10101110 (0xAE). Následne sa zasiela adresa registra (Register address), do ktorého chceme dáta zapísať a následne samotné dáta (Data byte). Prenos je ukončený podmienkou STOP. Zápis jedného bajtu je ukázaný na Obr. 7.

Čítanie cez I2C
Aby sme mohli čítať obsah registrov senzora, musíme najprv zaslať adresu senzora s režimom zápisu, t.j. 0b10101110 (0xAE) a adresu registra (Register address), z ktorého chceme čítať. Potom musí byť zaslaná opakovaná podmienka štart. Následne je zaslaná adresa senzora s režimom čítania (bit R/W ̅=1), t.j 0b10101111 (0xAF). Po tomto kroku nám senzor zašle obsah registra z požadovanej adresy. Na záver pošleme podmienku STOP. Čítanie jedného bajtu je zobrazené na Obr. 8.

Adresa registra sa automaticky inkrementuje, to znamená, že môžeme čítať dáta z nasledujúcej adresy bez toho, aby sme museli znova posielať adresu senzora alebo registra. Čítanie registrov je možné dovtedy pokiaľ nepošleme podmienku STOP. Na Obr. 9 je ukážka čítania N bajtov počítajúc od predtým zaslanej adresy registra (Register address).

1.3 Knižnica funkcií
Cez I2C zbernicu sa dá prostredníctvom registrov nastaviť pomerne veľa parametrov a funkcionalít modulu MAX30102. Zostavenie vlastnej knižnice by bolo vzhľadom na množstvo registrov časovo náročné. Kvôli uľahčeniu práce s modulom použijeme knižnicu funkcií MAX30102.c. Jedná sa o upravenú knižnicu od spoločnosti Adafruit, ktorá taktiež predáva senzor MAX30102 na rozširujúcej DPS. Mapa registrov a deklarácia funkcií sú zahrnuté v hlavičkovom súbore MAX30102.h. V nasledujúcej časti si opíšeme iba tie funkcie, ktoré budeme používať v rámci laboratórneho cvičenia.
Deklarácia funkcie | bool MAX30102_init(uint8_t i2caddr) |
Popis funkcie | Funkcia slúži na inicializáciu I2C zbernice s frekvenciou 400 kHz a prečítanie identifikátora (ID) senzora s adresou i2caddr. |
Vstupné parametre | i2caddr – 7-bit adresa senzora MAX30102 posunutá o jeden bit vľavo (0xAE) |
Výstupný parameter | True - podarí sa prečítať identifikátor senzora správne. False - nepodarí sa prečítať identifikátor senzora správne. |
Deklarácia funkcie | void MAX30102_setup(uint8_t powerLevel,uint8_t sampleAverage, uint8_t ledMode, int sampleRate, int pulseWidth, int adcRange) |
Popis funkcie | Funkcia slúži na nastavenie senzora MAX30102. |
Vstupné parametre | powerLevel – Nastavenie prúdu cez LED. Hodnoty: <0÷255>. (0 = 0 mA; 255 = 50 mA). sampleAverage – počet vzoriek, z ktorých sa robí priemer. Hodnoty: 1, 2, 4, 8, 16, 32. ledMode – výber medzi módom HR (aktívna iba červená LED) a SpO2 (aktívne obe LED). Hodnoty: 1=HR mód (červená LED) 2=SpO2 mód (červená + infračervená LED) 3=Multi-LED sampleRate – voľba vzorkovacej frekvencie pre oba kanály. Hodnoty: 50, 100, 200, 400, 800, 1000, 1600, 3200. pulseWidth – trvanie zasvietenej LED (spoločne pre obe LED) v [µs]. Hodnoty: 69, 118, 215, 411. adcRange – plný rozsah AD prevodníka v [nA]. Hodnoty: 2048, 4096, 8192, 16384. |
Výstupný parameter | - |
Deklarácia funkcie | void MAX30102_wakeUp(void) |
Popis funkcie | Funkcia slúži na "prebudenie" MAX30102 z power-safe módu. |
Vstupné parametre | - |
Výstupný parameter | - |
Deklarácia funkcie | void MAX30102_shutDown(void) |
Popis funkcie | Funkcia slúži na "uspatie" MAX30102 do power-safe módu. |
Vstupné parametre | - |
Výstupný parameter | - |
Deklarácia funkcie | uint16_t MAX30102_check(void) |
Popis funkcie | Funkcia kontroluje nové PPG dáta. Ak sú k dispozícii nové dáta, tak aktualizuje FIFO zásobník (doplní ich). Funkcia sa musí volať pravidelne. |
Vstupné parametre | - |
Výstupný parameter | Počet nových vzoriek. |
Deklarácia funkcie | uint8_t MAX30102_available(void) |
Popis funkcie | Zistí koľko vzoriek sa nachádza v FIFO zásobníku. |
Vstupné parametre | - |
Výstupný parameter | Počet vzoriek v FIFO zásobníku. |
Deklarácia funkcie | uint32_t MAX30102_getFIFORed(void) uint32_t MAX30102_getFIFOIR(void) |
Popis funkcie | Získa najstaršiu vzorku z FIFO zásobníka pre červenú LED (getFIFORed) a pre infračervenú LED (getFIFOIR). |
Vstupné parametre | - |
Výstupný parameter | Vráti najstaršiu hodnotu v FIFO zásobníku pre daný LED kanál. |
Deklarácia funkcie | void MAX30102_nextSample(void) |
Popis funkcie | Presunie ukazovateľ zásobníka na ďalšiu vzorku. Funkcia by sa mala volať po prečítaní vzorky/vzoriek z FIFO zásobníka. Ak používame oba LED kanály, tak funkciu voláme po MAX30102_getFIFORed a MAX30102_getFIFOIR. |
Vstupné parametre | - |
Výstupný parameter | - |
Deklarácia funkcie | void MAX30102_timerProc(void) |
Popis funkcie | Funkcia zabezpečuje čakanie počas definovaného času na určitú odozvu. Funkcia sa musí volať v prerušení časovača každú milisekundu [ms]. |
Vstupné parametre | - |
Výstupný parameter | - |
2. Použité vybavenie
- Hardvér
- Vývojová doska Mega Development Board 2 (MDB2)
- PPG senzor MAX30102 (GY-MAX30102)
- PC
- Softvér
- MATLAB
- Microchip Studio
3. Schéma zapojenia

4. Úlohy
- Podľa schémy zapojenia (Obr. 10) pripojte senzor MAX30102 k vývojovej doske MDB2. Použite napájanie z adaptéra. Pozície prepojok na MDB2 sú vyznačené červenou. Pre napájanie senzora zvoľte napätie 3,3 V.
- V jazyku C vytvorte program pre MCU, ktorý bude získavať zo senzora MAX30102 vzorky PPG signálov z oboch LED. Následne budú získané údaje zasielané do PC cez rozhranie UART. V kóde implementujte nasledujúce parametre a funkcionality:
- Nastavte režim SpO2,
- Prúd cez LED nastavte na hodnotu 200 (približne 39 mA),
- Priemerujte 2 susedné vzorky PPG signálu,
- Vzorkovaciu frekvenciu nastavte na 200 Hz,
- Šírku impulzu nastavte na 411 µs,
- Rozsah AD prevodníka nastavte na 8192 nA,
- Rýchlosť prenosu cez UART nastavte na 76 800 Baud,
- Údaje začnite posielať do PC až po prijatí znaku 'S', posielanie zastavte po prijatí znaku 'X'. Na detekciu prijatia znaku využite prerušenie od UART,
- Pri tvorbe programu postupujte podľa nasledujúceho vývojového diagramu:
- Do pravej časti Obr. 11 vpíšte funkcie z knižnice MAX30102, ktoré zodpovedajú jednotlivým blokom vývojového diagramu.
- V jazyku MATLAB pomocou prostredia AppDesigner vytvorte aplikáciu s grafickým užívateľským rozhraním, ktorá bude zobrazovať PPG signály z červenej a infračervenej LED v reálnom čase (Obr. 12). Aplikácia musí obsahovať nasledujúce prvky:
- Textové pole pre zobrazenie stavu zásobníka (počet bajtov),
- Tlačidlá: 'Otvor port', 'Štart' a 'Stop'.
- Zhodnoťte priebeh laboratórneho cvičenia. Zamerajte sa na nasledujúce body:
- Písanie kódu pre MCU, problematické časti,
- Písanie kódu pre aplikáciu v MATLABe.


Na stiahnutie
MAX30102.hMAX30102.c