この間、私たちは数多くの作品を展示してきました。 電子部品 と互換性があります Arduino などのボードまたは互換性のあるボード、他の多くのメーカーや DIY の仕事にも使用できます。それではモジュールを紹介していきます MAX30102脈拍と血中酸素を測定するセンサーが含まれています。
このようにして、自作のアクティビティ ブレスレットやハードウェアなどのウェアラブルを作成することもできます。 健康状態を監視する このデバイスに心拍数モニターと酸素濃度計が統合されているため、人の生体認証データまたは遠隔測定が提供されます...
心拍数モニターとは何ですか?どのように機能するのでしょうか?
Un 脈拍センサーまたは心拍数モニター これは人の心拍数をリアルタイムで測定するために使用される電子デバイスです。これは主にスポーツ分野で、トレーニング中または日常的なパフォーマンスと努力を監視するために使用されます。心拍数モニターはアスリートの間で人気がありますが、医療センターでは心拍数、つまり 1 分あたりの心拍数を知るための基本的なデバイスでもあります。
- PRBpm: 心拍数、つまり 1 分あたりの心拍数を示します。
すべての場合において、 センサーは心拍ごとの血液量の変化を捕捉します。この変化は電気信号に変換され、処理されて心拍数が取得されます。一部の心拍数モニターには、測定値の精度を向上させるための増幅回路とノイズキャンセル回路も含まれています。
オキシメーターとは何ですか?どのように機能するのでしょうか?
Un 酸素濃度計は医療機器またはスポーツ機器です 血液中の酸素飽和度を測定するために使用されます。このデバイスは、0 ~ 100% の値の血中酸素飽和度データを提供します。同じデバイスに、監視または記録のためのすべての情報を示す心拍数オプションも含まれるのが一般的です。
ロス・ダトス・ケ オキシメーターを測定する 次のとおりです。
- %SpO2: 血液中の酸素飽和度のパーセンテージを指します。
酸素濃度計は、指の形態に適合するようにクランプのように配置されます。または、手首などの心拍数モニターの場合と同様に、体の他の場所に配置することもできます。多くのアクティビティブレスレットで見られます。
オキシメーターの動作に関しては、オキシメーターは異なる放出を行います。 光の波長 皮膚を通過するもの。この光に作用するのは酸素の輸送を担う血液分子であるヘモグロビンで、輸送する酸素のレベルに応じて異なる量の光を吸収します。詳細なプロセスは次のとおりです。
- 発光- 酸素濃度計は、赤色と赤外線の 2 つの波長の光を放射し、デバイスに置かれた指を通過します。
- 光吸収: 酸素を運ぶ赤血球内の分子であるヘモグロビンは、さまざまな量の光を吸収します。酸素を含むヘモグロビン (オキシヘモグロビン) と酸素を含まないヘモグロビン (デオキシヘモグロビン) は、異なる光吸収特性を持っています。
- 光検出: 発光体の反対側にある検出器が指を通過した光を収集します。
- 酸素飽和度の計算- このデバイスは、存在するヘモグロビン (オキシヘモグロビンとデオキシヘモグロビンの両方) の総量に対するオキシヘモグロビンの比率を計算します。この割合は、血中酸素飽和度のパーセンテージ (%SpO2) として表示されます。これは、これらの電気信号を解釈して数値に変換できるプロセッサーを通じて行われます。
MAX30102モジュールとは何ですか?
センサー MAX30102、Maxim Integrated 製は、心拍数モニターと酸素濃度計の機能を組み合わせた統合デバイスです。このセンサーはArduinoなどのマイクロコントローラーで簡単に使用できます。 MAX30102は、同社の光学センサのMAX3010xシリーズに属します。
その動作は、血液による光の吸収の変化に基づいており、 酸素飽和度、脈拍 前の 2 つのセクションで述べたように。このセンサーには、赤色と赤外線の 2 つの LED が装備されています。指や手首などの皮膚に装着し、反射光を検出して酸素飽和度を測定します。
MAX30102との通信が行われます I2Cバス経由、Arduinoなどのマイクロコントローラーに簡単に接続できます。 MAX30102は、ロジック用に1.8V、LED用に3.3Vという二重の電源を必要とします。通常、必要なレベルマッチングがすでに含まれている 5V モジュールで見られます。
La 光パルス酸素濃度計 これは、血液中の酸素飽和度の割合を測定する非侵襲的な方法です。前に述べたように、これは、波長ごとのヘモグロビン (Hb) とオキシヘモグロビン (HbO2) の光吸収係数の違いに基づいています。酸素が豊富な血液はより多くの赤外線を吸収し、酸素が少ない血液はより多くの赤色光を吸収します。皮膚が十分に薄く、その下に血管がある体の領域では、この差を利用して酸素飽和度を判断できます。
脈拍および血中酸素センサーを備えたMAX30102モジュールの特長
MAX30102 には以下が含まれます。
- 2x LED、660 つは赤色 (880nm)、もう XNUMX つは赤外線 (XNUMXnm)
- 反射光を測定するための 2x フォトダイオード
- 18 秒あたり 50 ~ 3200 サンプルのサンプリング レートを備えた XNUMX ビット ADC コンバータ。
- さらに、信号の増幅とフィルタリング、周囲光のキャンセル、50 ~ 60Hz の周波数 (人工光) の除去、および温度補償に必要な電子機器を備えています。
モジュールの消費量 最大50mAに達することができます ただし、測定中は0.7μAの低電力モードで強度をプログラム的に調整できます。
価格と購入場所
脈拍と血中酸素を測定するMAX30102センサー 彼らはかなり安いです。これらのモジュールは、eBay、Aliexpress、Amazon などのサイトでわずか数ユーロで入手できます。いくつかのタイプがあることがわかりますが、次のタイプをお勧めします。
[amazon box=”B07QG9HF4J, B0CD73CPNJ, B09L4SN5J6″ item=”3″ grid=”3″ image_size=”large” description_items=”0″ template=”widget”]
Arduinoとの接続と例

Arduino で MAX30102 をテストするには、まずこのモジュールを Arduino ボードに接続します。これ 接続はとても簡単です、次のように接続するだけです。
- モジュールの Vcc は Arduino ボードの 5V 出力に接続する必要があります。
- モジュールの GND は Arduino ボードの GND ソケットに接続する必要があります。
- モジュールの SCL は、A5 などの Arduino ボードのアナログ入力の XNUMX つに接続する必要があります。
- モジュールの SDA は、Arduino ボードの別のアナログ入力 (A4 など) に接続する必要があります。
MAX30102ボードとArduinoボードの間に適切な接続が確立されたら、次に行うことは、ソースコードまたはスケッチを作成して動作させ、対象者からの生体認証データの受信を開始することです。これは、次のコードを記述するのと同じくらい簡単です。 Arduino IDE そしてボードをプログラムします:
#include <Wire.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"
MAX30102 pulsioximetro;
#define MAX_BRIGHTNESS 255
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
//Arduino Uno no tiene suficiente SRAM para almacenar 100 muestreos, por lo que hay que truncar las muestras en 16-bit MSB.
uint16_t pulsoBuffer[100]; //infrared LED sensor data
uint16_t oxiBuffer[100]; //red LED sensor data
#else
uint32_t pulsoBuffer[100]; //Sensores
uint32_t oxiBuffer[100];
#endif
int32_t BufferLongitud; //Longitud de datos
int32_t spo2; //Valor de SPO2
int8_t SPO2valido; //Indicador de validez del valor SPO2
int32_t rangopulsacion; //PR BPM o pulsaciones
int8_t validrangopulsacion; //Indicador de validez del valor PR BPM
byte pulsoLED = 11; //Pin PWM
byte lecturaLED = 13; //Titila con cada lectura
void setup()
{
Serial.begin(115200); // Inicia la comunicación con el microcontrolador a 115200 bits/segundo
pinMode(pulsoLED, OUTPUT);
pinMode(lecturaLED, OUTPUT);
// Inicializar sensores
if (!pulsioximetro.begin(Wire, I2C_SPEED_FAST)) //Usar el bus I2C a 400kHz
{
Serial.println(F("MAX30102 no encontrado. Por favor, comprueba la conexión y alimentación del módulo."));
while (1);
}
Serial.println(F("Pon el sensor en contacto con tu dedo y presiona cualquier tecla para iniciar la conversión."));
while (Serial.available() == 0) ; //Esperar hasta que se pulsa una tecla
Serial.read();
byte brilloLED = 60; //Opciones: 0=Apagado hasta 255=50mA
byte mediaMuestreo = 4; //Opciones: 1, 2, 4, 8, 16, 32
byte ModoLED = 2; //Opciones: 1 = Rojo solo, 2 = Rojo + IR, 3 = Rojo + IR + Verde
byte rangoMuestreo = 100; //Opciones: 50, 100, 200, 400, 800, 1000, 1600, 3200
int anchoPulso = 411; //Opciones: 69, 118, 215, 411
int rangoADC = 4096; //Opciones: 2048, 4096, 8192, 16384
pulsioximetro.setup(brilloLED, mediaMuestreo, ModoLED, rangoMuestreo, anchoPulso, rangoADC); //Configuración del módulo
}
void loop()
{
BufferLongitud = 100; //10 almacenamientos en el buffer con 4 segundos corriendo a 25sps
//Leer las primeras 100 muestras
for (byte i = 0 ; i < BufferLongitud ; i++)
{
while (pulsioximetro.available() == false) //Comprobar nuevos datos
pulsioximetro.check();
oxiBuffer[i] = pulsioximetro.getRed();
pulsoBuffer[i] = pulsioximetro.getIR();
pulsioximetro.siguienteMuestreo(); //Muestreo terminado, ir al siguiente muestreo
Serial.print(F("red="));
Serial.print(oxiBuffer[i], DEC);
Serial.print(F(", ir="));
Serial.println(pulsoBuffer[i], DEC);
}
//Calcular el valor del pulso PM y SpO2 tras los primeros 100 samples
maxim_heart_rate_and_oxygen_saturation(pulsoBuffer, BufferLongitud, oxiBuffer, &spo2, &SPO2valido, &rangopulsacion, &validrangopulsacion);
//Calcular muestreos continuos
while (1)
{
//Volcar los 25 primeros valores en memoria y desplazar los últimos 75 arriba
for (byte i = 25; i < 100; i++)
{
oxiBuffer[i - 25] = oxiBuffer[i];
pulsoBuffer[i - 25] = pulsoBuffer[i];
}
for (byte i = 75; i < 100; i++)
{
while (pulsioximetro.available() == false) //Comprobar si existen nuevos datos
pulsioximetro.check();
digitalWrite(lecturaLED, !digitalRead(lecturaLED)); //Parpadea el LED on-board con cada dato
oxiBuffer[i] = pulsioximetro.getRed();
pulsoBuffer[i] = pulsioximetro.getIR();
pulsioximetro.siguienteMuestreo(); //Al finalizar, moverse al siguiente muestreo
Serial.print(F("Oxígeno="));
Serial.print(oxiBuffer[i], DEC);
Serial.print(F(", Pulso="));
Serial.print(pulsoBuffer[i], DEC);
Serial.print(F(", HR="));
Serial.print(rangopulsacion, DEC);
Serial.print(F(", HRvalid="));
Serial.print(validrangopulsacion, DEC);
Serial.print(F(", SPO2="));
Serial.print(spo2, DEC);
Serial.print(F(", SPO2 válido="));
Serial.println(SPO2valido, DEC);
}
//Recalcular tras los primeros muestreos
maxim_heart_rate_and_oxygen_saturation(pulsoBuffer, BufferLongitud, oxiBuffer, &spo2, &SPO2valido, &rangopulsacion, &validrangopulsacion);
}
}
もちろん、必要に応じてコードを変更できます。これは単なる例です...